net_tx_action函数报文发送软中断处理函数,本篇不分析软中断注册过程,只分析该函数的处理过程。 产生发包软中断最常见的场景是:1)报文发送PPS很高;2)网络qos限制。
1、net_tx_action函数
static void net_tx_action(struct softirq_action *h)
{
struct softnet_data *sd = this_cpu_ptr(&softnet_data);
if (sd->completion_queue) { //发送完成队列不为空
struct sk_buff *clist;
local_irq_disable();
clist = sd->completion_queue;
sd->completion_queue = NULL; //完成队列置空
local_irq_enable();
while (clist) {
struct sk_buff *skb = clist;
clist = clist->next;
WARN_ON(atomic_read(&skb->users));
if (likely(get_kfree_skb_cb(skb)->reason == SKB_REASON_CONSUMED))
trace_consume_skb(skb);
else
trace_kfree_skb(skb, net_tx_action);
__kfree_skb(skb); //释放skb
}
}
if (sd->output_queue) { //发送队列不为空
struct Qdisc *head;
local_irq_disable();
head = sd->output_queue;
sd->output_queue =