📄 00000040.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: mephisto (梦菲斯特*大宝宝), 信区: Linux <BR>标 题: Re: 看过源码的高手解释一下? <BR>发信站: BBS 水木清华站 (Thu Dec 14 17:26:29 2000) <BR> <BR>I am pretty sure I have send you mail about this. Havn't you get that? <BR> <BR>【 在 lightofstar (star) 的大作中提到: 】 <BR>∶<I> void kfree_skbmem(struct sk_buff *skb) </I><BR>∶<I> { </I><BR>∶<I> if (!skb->cloned || atomic_dec_and_test(skb_datarefp(skb))) </I><BR>∶<I> kfree(skb->head); </I><BR>∶<I> kmem_cache_free(skbuff_head_cache, skb); </I><BR>∶<I> atomic_dec(&net_skbcount); </I><BR>∶<I> } </I><BR>∶<I> extern __inline__ atomic_t *skb_datarefp(struct sk_buff *skb) </I><BR>∶<I> { </I><BR>∶<I> return (atomic_t *)(skb->end); </I><BR>∶<I> } </I><BR>∶<I> 第一个函数调用了第二个函数,那么假如skb_cloned == 1时, </I><BR>∶<I> 什么时候才能执行 kfree(skb->head)?? </I><BR>when *(skb->end) == 1, atomic_dec_and_test(..)return TRUE. <BR>Then release. <BR>∶<I> skb_end本身指的是数据部分的结尾,分配sk_buff时是个定值。 </I><BR>Exactly. <BR>Here is the trick, skb_end is pointer to data end bound. <BR>Kernel use the next mem as a reference counter. <BR>data->[ the buffer ] <BR> end ---> <BR> [reference counter] <BR>Because they need the reference counter go with the data, not the <BR>skb_buff, skb_buff might release earlyer than the data. <BR> <BR>skb_clone() <BR>{ <BR> ... <BR> atomic_inc(skb_datarefp(skb)); <BR> ... <BR>} <BR>alloc_skb() <BR>{ <BR> ... <BR> atomic_set(skb_datarefp(skb),1); <BR> ... <BR>} <BR> <BR>∶<I> 调用atomic_dec_and_test处理它,能够减少数据部分的引用次数吗? </I><BR>∶<I> 当数据部分被两个sk_buff共享时,什么时候才是真正的释放了数据区? </I><BR>when the counter dec to 0 ;-) <BR> <BR> <BR>-- <BR>约塞连怀疑地摇了摇头,拒绝接受丹比的劝告."当我抬起来时,我看到人们全在设法赚钱.我 <BR>看不见天堂,看不见圣人,也看不见天使.我只看见人们利用每一次正当的冲动和每一场人类 <BR>的悲剧大把大把地捞钱." <BR> <BR> <BR>※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.99.241.146] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -