jhl19880722 发表于 2015-04-24 22:33

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 的值还是没有更新的值,会不会出现这样的情况,如果出现会不会影响效率

nswcfd 发表于 2015-04-27 12:46

对共享变量的修改,差不多都会有这种(效率)问题吧。

jhl19880722 发表于 2015-04-27 21:06

回复 2# nswcfd
如果换成原子操作呢?

   

nswcfd 发表于 2015-04-28 09:46

应该是一样的吧(不过通常情况下应该不是主要瓶颈所在吧?)。

并且由于不存在并发修改的情况(外层有spin_lock),没有必要引入原子操作(有额外的LOCK总线的开销)。

jhl19880722 发表于 2015-04-28 21:02

回复 4# nswcfd
fifo对一个读一个写的情况是无锁的吧

   

nswcfd 发表于 2015-04-28 21:28

嗯,是的。

关于lock free的ring/fifo的设计,可以参考 A Lock-Free Cache-Efficient Multi-Core Synchronization Mechanism for Line-Rate Network Traffic Monitoring

jhl19880722 发表于 2015-04-29 20:51

回复 6# nswcfd
谢谢了


   
页: [1]
查看完整版本: kfifo的问题