我目前正在尝试研究与 Linux 队列实现(kfifo)相关的东西。
最近,我发现在内的变量结构体__kfifo不断增加,并且只需在使用前与掩码进行按位与运算即可使用。但是,排队函数(__kfifo_in)似乎没有处理与溢出相关的问题__kfifo.in。我相信这可能会引起一些问题,因为__kfifo.out将大于__kfifo.in。例如,kfifo_len宏使用__tmpl->kfifo.in - __tmpl->kfifo.out;
.
我缺少什么? Linux 如何以及在哪里处理这种溢出?
需要注意的是,下面的代码是我提到的 __kfifo_in,它是从 Linux 5.4 中找到的
unsigned int __kfifo_in(struct __kfifo *fifo,
const void *buf, unsigned int len)
{
unsigned int l;
l = kfifo_unused(fifo);
if (len > l)
len = l;
kfifo_copy_in(fifo, buf, len, fifo->in);
fifo->in += len;
return len;
}
答案1
in
是推入 fifo 的字节总数,out
是从 fifo 弹出的字节总数。逻辑上in
总是 >=out
但每个有限 int 表示都存在溢出。
假设 unsigned int 由单个字节(范围 0..255)表示,我推送了 256 个字节,但只弹出了 255 个字节。在这种情况下kfifo_unused
将返回
(fifo->掩码 + 1) - (fifo->in - fifo->out) = (full_queue_space) -(used_space) = (remaning_space) = (full_queue_space) -(0-255) = (full_queue_space) - (1) 。
事实上用 1 字节表示 0x00 - 0xFF = 0x01。