kfifo_in函数的函数原型如下: unsigned int kfifo_in(struct __kfifo *fifo, const void *from, unsigned int len); 2.函数作用 kfifo_in函数的作用是向一个已经初始化的FIFO缓冲池中写入数据。如果数据的长度大于FIFO的剩余空间,则函数只会写入FIFO的一部分,返回实际写入FIFO的字节数,而不是完整的数据长度。
再更新fifo->in,防止在更新前有其它CPU读取fifo->in的不完整值;而在读取内容时使用的是smp_mb(),...
q=__kfifo_in&unscoped_q=__kfifo_ingithub.com/torvalds/linux/search?q=__kfifo_in&unscoped...
内核中有关kfifo.c和kfifo.h两个文件的源码以及该问题的具体情况,可以查看这里。对于结构体内的in和out两个变量,内核是作如下处理的:1、在读入数据时增加in;2、在取出数据时增加out;3、当检测到两个相等的时候将它们复位归0。1和2不作讨论和分析,针对第3点的处理,内核代码如下:static inline unsigned int kfi...
在改变读写指针的时候,应该是原子操作。这要求仅通过读写指针的关系来判断剩余空间长度,而不是用一个变量来记录已使用长度。(更详细解释,可以看这个博主...
s64 timestamp){intret;structiio_kfifo*kf=iio_to_kfifo(r);ret =kfifo_in(&kf->kf, data, r->bytes_per_datum);if(ret != r->bytes_per_datum)return-EBUSY; r->stufftoread =true; wake_up_interruptible(&r->pollq);return0; }
所以这里不需要读内存屏障来保证对fifo->in的读取同样是在对to的读取之前完成的,因为写内存栅障已经...
10: * start putting bytes into the kfifo.11: */ 保证先读out,再put,如果是保证先读out,那么...
__kfifo_get 问题1和问题2其实是一样的,我的理解是:mb是内存屏障,是一道分界线,而不是锁,如果...
10: * start putting bytes into the kfifo.11: */ 保证先读out,再put,如果是保证先读out,那么...