kfifo的源代码主要是<linux/kfifo.h>和<kernel/kfifo.c>文件
kfifo结构定义:
struct kfifo {
unsigned char *buffer;/*保存数据的缓冲空间*/
unsigend int size;/*分配的空间大小*/
unsigned int in;/*入队数据的offset(in % size)*/
unsigned int out;/*出队数据的offset(out %size)*/
};
kfifo_alloc函数:
/**
* kfifo_alloc - 分配一个内部的buffer
* @fifo;赋予新buffer的fifo
* @size: 分配buffer的大小,必须是2的幂
* @gfp_mask: get_free_pages掩码,传递给kmalloc()
*
* 这个函数动态地分配一个新的内部buffer.
*
* size会四舍五入为2的幂.
* buffer由kfifo_free()来释放.
* 返回值:成功则为0,否则返error code.
*/
int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask)
{
unsigned char *buffer;
/*将size向上舍入为最近2的幂*/
if (!is_power_of_2(size)) {
BUG_ON(size > 0x80000000);
size = roundup_pws_of_two(size);
}
buffer = kmalloc(size, gfp_mask);
if (!buffer) {/*分配失败*/
_kfifo_init(fifo, NULL, 0);
return -ENOMEM;
}
_kfifo_init(fifo, buffer, size);/*初始化fifo成员*/
return 0;
}
_kfifo_init函数:
/*
* _kfifo_init - 初始化fifo结构体成员
*/
static void _kfifo_init(struct kfifo *fifo, void *buffer,
unsigned int size)
{
fifo->buffer = buffer;
fifo->size = size;
kfifo_reset(fifo);/*重置fifo的in和out为0*/
}
kfifo_reset函数:
/**
* kfifo_reset - 移除FIFO所有的内容
* @fifo:将被清空的fifo
*/
static inline void kfifo_reset(struct kfifo *fifo)
{
fifo->in = fifo->out = 0;
}
kfifo_free函数:
/*
* kfifo_free - 释放FIFO内部的buffer
* @fifo: 被释放的fifo
*/
void kfifo_free(struct kfifo *fifo)
{
kfree(fifo->buffer);
__kfifo_init(fifo, NULL, 0);
}
kfifo_init函数:
/*
* kfifo_init - 用一个已分配的buffer来初始化FIFO
*
* @fifo: 赋予buffer的fifo
*
kfifo结构定义:
struct kfifo {
unsigned char *buffer;/*保存数据的缓冲空间*/
unsigend int size;/*分配的空间大小*/
unsigned int in;/*入队数据的offset(in % size)*/
unsigned int out;/*出队数据的offset(out %size)*/
};
kfifo_alloc函数:
/**
* kfifo_alloc - 分配一个内部的buffer
* @fifo;赋予新buffer的fifo
* @size: 分配buffer的大小,必须是2的幂
* @gfp_mask: get_free_pages掩码,传递给kmalloc()
*
* 这个函数动态地分配一个新的内部buffer.
*
* size会四舍五入为2的幂.
* buffer由kfifo_free()来释放.
* 返回值:成功则为0,否则返error code.
*/
int kfifo_alloc(struct kfifo *fifo, unsigned int size, gfp_t gfp_mask)
{
unsigned char *buffer;
/*将size向上舍入为最近2的幂*/
if (!is_power_of_2(size)) {
BUG_ON(size > 0x80000000);
size = roundup_pws_of_two(size);
}
buffer = kmalloc(size, gfp_mask);
if (!buffer) {/*分配失败*/
_kfifo_init(fifo, NULL, 0);
return -ENOMEM;
}
_kfifo_init(fifo, buffer, size);/*初始化fifo成员*/
return 0;
}
_kfifo_init函数:
/*
* _kfifo_init - 初始化fifo结构体成员
*/
static void _kfifo_init(struct kfifo *fifo, void *buffer,
unsigned int size)
{
fifo->buffer = buffer;
fifo->size = size;
kfifo_reset(fifo);/*重置fifo的in和out为0*/
}
kfifo_reset函数:
/**
* kfifo_reset - 移除FIFO所有的内容
* @fifo:将被清空的fifo
*/
static inline void kfifo_reset(struct kfifo *fifo)
{
fifo->in = fifo->out = 0;
}
kfifo_free函数:
/*
* kfifo_free - 释放FIFO内部的buffer
* @fifo: 被释放的fifo
*/
void kfifo_free(struct kfifo *fifo)
{
kfree(fifo->buffer);
__kfifo_init(fifo, NULL, 0);
}
kfifo_init函数:
/*
* kfifo_init - 用一个已分配的buffer来初始化FIFO
*
* @fifo: 赋予buffer的fifo
*