了解内核3.3.8中的process_backlog和softnet_data字段

时间:2014-08-24 15:29:35

标签: c linux linux-kernel

我正在尝试从linux内核3.3.8中了解process_backlog()函数。

我知道有一个名为“input_pkt_queue”的传入skb结构列表。此列表是softnet_data结构的成员。 softnet_data中还有另一个名为“process_queue”的skb列表。

所有传入的skb都转到“input_pkt_queue”。我想知道第二个列表“process_queue”的目的是什么。

我要求它,因为我认为process_backlog()应该在“input_pkt_queue”上运行,但它在“process_queue”上运行。

“process_queue”列表是某种临时工作列表,但“input_pkt_queue”仅用于收集skb以允许其他cpu仍然将skb收集到“input_pkt_queue”中吗?

1 个答案:

答案 0 :(得分:1)

是的,如果RPS(接收数据包转向开启),则数据包排队到输入队列是正确的。从softirq上下文调用的process_backlog确实从进程队列中排队,但您可能错过了它实际上将输入队列连接到进程积压队列

if (qlen)//Basically this is joining the input queue to the process queue
                        skb_queue_splice_tail_init(&sd->input_pkt_queue,                 
                                                   &sd->process_queue);

因此,当循环迭代它将从进程队列中出队时,请记住在第一次迭代中进程队列为空,并且从第二次迭代开始,进程队列具有从中断上下文中的驱动器排队的skb列表(!softirq )。