kfifo的问题
unsigned int __kfifo_put(struct kfifo *fifo,120 unsigned char *buffer, unsigned int len)
121 {
122 unsigned int l;
123
124 len = min(len, fifo->size - fifo->in + fifo->out);
131 smp_mb();
134 l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
135 memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
136
137 /* then put the rest (if any) at the beginning of the buffer */
138 memcpy(fifo->buffer, buffer + l, len - l);
139
145 smp_wmb();
146
147 fifo->in += len;
148
149 return len;
150 }
165 unsigned int __kfifo_get(struct kfifo *fifo,
166 unsigned char *buffer, unsigned int len)
167 {
168 unsigned int l;
169
170 len = min(len, fifo->in - fifo->out);
177 smp_rmb();
178
180 l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
181 memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
184 memcpy(buffer + l, fifo->buffer, len - l);
191 smp_mb();
192
193 fifo->out += len;
195 return len;
196 }
对kfifo有一个疑问想请教一下:
如果存在两个线程A和B运行在不同的CPU上,A调用__kfifo_put,B调用__kfifo_get,在A调用完成后fifo->in 的值还存在A对应CPU的缓冲上,B调用的时候获得的fifo->in 的值还是没有更新的值,会不会出现这样的情况,如果出现会不会影响效率
对共享变量的修改,差不多都会有这种(效率)问题吧。 回复 2# nswcfd
如果换成原子操作呢?
应该是一样的吧(不过通常情况下应该不是主要瓶颈所在吧?)。
并且由于不存在并发修改的情况(外层有spin_lock),没有必要引入原子操作(有额外的LOCK总线的开销)。
回复 4# nswcfd
fifo对一个读一个写的情况是无锁的吧
嗯,是的。
关于lock free的ring/fifo的设计,可以参考 A Lock-Free Cache-Efficient Multi-Core Synchronization Mechanism for Line-Rate Network Traffic Monitoring 回复 6# nswcfd
谢谢了
页:
[1]