linux kernel 工程师
全部博文(99)
分类: LINUX
2014-02-14 10:40:48
dev_kfree_skb_any是一个释放skb的封装函数,它根据是否在irq环境下,决定直接释放skb还是等softirq去释放skb
void dev_kfree_skb_any(struct sk_buff *skb)
{
if (in_irq() || irqs_disabled())
dev_kfree_skb_irq(skb); //将skb放在softnet_data->completion_queue的首部,等待softirq释放。
else
dev_kfree_skb(skb); // 直接释放
}
EXPORT_SYMBOL(dev_kfree_skb_any);
来看一下dev_kfree_skb_irq,它的功能其实就是将skb放入softnet_data的completion_queue队列头部
void dev_kfree_skb_irq(struct sk_buff *skb)
{
if (atomic_dec_and_test(&skb->users)) {
struct softnet_data *sd;
unsigned long flags;
local_irq_save(flags);
sd = &__get_cpu_var(softnet_data);
skb->next = sd->completion_queue; // skb放在softnet_data->completion_queue的首部
sd->completion_queue = skb;
// 触发softirq, NET_TX_SOFTIRQ 软中断处理函数net_tx_action处理的第一件事情就是遍历completion_queue
// 然后释放skb
raise_softirq_irqoff(NET_TX_SOFTIRQ);
local_irq_restore(flags);
}
}
EXPORT_SYMBOL(dev_kfree_skb_irq);