Chinaunix首页 | 论坛 | 博客
  • 博客访问: 435788
  • 博文数量: 99
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 1012
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-20 16:30
个人简介

linux kernel 工程师

文章分类

全部博文(99)

文章存档

2018年(5)

2017年(12)

2016年(27)

2015年(10)

2014年(43)

2012年(2)

我的朋友

分类: 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);

阅读(3073) | 评论(0) | 转发(0) |
0

上一篇:__dev_xmit_skb

下一篇:dev_watchdog

给主人留下些什么吧!~~