sk_buff什么时候被kfree

29 views
Skip to first unread message

lucien xin

unread,
Jul 25, 2013, 12:44:07 AM7/25/13
to 西邮Linux兴趣小组
sk_buff释放应该是网卡驱动发送完数据,那它是在dev_queue_xmit执行完,还是其它地方或是以其它方式? 如果是在网卡驱动中触发kfree,能以be2net网卡说明吗?

凌云

unread,
Jul 25, 2013, 1:32:27 AM7/25/13
to lucien xin, 西邮Linux兴趣小组
是在网卡驱动的xmit函数中,可以使用以下2种方式:
1. transmit函数中,发送完就free掉

2.transmit完一个包,会引起一个中断,在ISR中free




在 2013年7月25日下午12:44,lucien xin <lucie...@gmail.com>写道:
sk_buff释放应该是网卡驱动发送完数据,那它是在dev_queue_xmit执行完,还是其它地方或是以其它方式? 如果是在网卡驱动中触发kfree,能以be2net网卡说明吗?

--
--
要退订此论坛请发邮件至 xiyoulinux-...@googlegroups.com
更多选项: http://groups.google.com/group/xiyoulinux?hl=zh-CN
提问前建议您阅读(提问的智慧):http://www.xiyoulinux.org/blog/?p=64
---
您收到此邮件是因为您订阅了 Google 网上论坛的“西邮Linux兴趣小组”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 xiyoulinux+...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
 
 

Cong Wang

unread,
Aug 7, 2013, 9:14:27 AM8/7/13
to lucien xin, 西邮Linux兴趣小组
2013/7/25 lucien xin <lucie...@gmail.com>:
> sk_buff释放应该是网卡驱动发送完数据,那它是在dev_queue_xmit执行完,还是其它地方或是以其它方式?
> 如果是在网卡驱动中触发kfree,能以be2net网卡说明吗?

用 dev_kfree_skb_any(),中断上下文和进程上下文都可以用:

void dev_kfree_skb_any(struct sk_buff *skb)
{
if (in_irq() || irqs_disabled())
dev_kfree_skb_irq(skb);
else
dev_kfree_skb(skb);
}

be_xmit() 里面有啊。

lucien xin

unread,
Aug 7, 2013, 10:27:01 PM8/7/13
to Cong Wang, 西邮Linux兴趣小组
2013/8/7 Cong Wang <xiyou.w...@gmail.com>
因为看到发包过程中,很多地方都有这类函数的调用,包括从dev_queue_xmit到dev_hard_start_xmit再到be_xmit, 不清楚如果发送正常的话,应该是会调用哪个。 然后看到过一个bug是发生在be_xmit中,出现了race, 所以又在想是不是以异步通知的方式,be_xmit发送完后会通知,由另一个地方做kfree的?
Reply all
Reply to author
Forward
0 new messages