面试被问到网卡RingBuffer数据结构,瞎猜猜错了,学习一下
本博客针对Linux5.7
Linux源码解压后可在源码目录下Documentation/trace/ring-buffer-design.txt中找到设计
内核中kfifo和ring_buffer都是环形缓冲区
kfifo位于linux-5.7/include/linux/kfifo.h中
ring_buffer位于linux-5.7/include/linux/ring_buffer.h中
struct __kfifo {
unsigned int in;
unsigned int out;
unsigned int mask;
unsigned int esize;
void *data;
};
ring_buffer实际使用trace_buffer结构体,定义如下
struct trace_buffer {
unsigned flags;
int cpus;
atomic_t record_disabled;
cpumask_var_t cpumask;
struct lock_class_key *reader_lock_key;
struct mutex mutex;
struct ring_buffer_per_cpu **buffers;
struct hlist_node node;
u64 (*clock)(void);
struct rb_irq_work irq_work;
bool time_stamp_abs;
};