linux kfifo 中 memory barrier的简要分析 lm_tom@163.com http://blog.csdn.net/lm_tom/archive/2008/08/19/2798767.aspx
1,kfifo introduction kfifo在linux kernel实现了一个fifo,具体可参考 kernel/kfifo.c 以及 include/ linux/kfifo.h,主要提供接口如下:
__kfifo_put/__kfifo_get分别为写/读fifo的接口,没有使用lock的实现,仅允许一个 并发reader和并发writer的使用; kfifo_put/kfifo_get分别为写/读fifo的接口,使用lock的实现;
unsigned int __kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
unsigned int __kfifo_get(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
static inline unsigned int kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
static inline unsigned int kfifo_get(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
2,memory barrier使用简要分析
2.1 __kfifo_put()/__kfifo_get()实现[1]
为方便后续分析,给出两个函数的实现源码:
unsigned int __kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len) { unsigned int l;
len = min(len, fifo->size - fifo->in + fifo->out);
smp_mb();
l = min(len, fifo->size - (fifo->in & (fifo->size - 1))); memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
|