Linux队列如何处理输入/输出位置(__kfifo.in/__kfifo.out)的溢出?

Linux队列如何处理输入/输出位置(__kfifo.in/__kfifo.out)的溢出?

我目前正在尝试研究与 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。

相关内容