- 論壇徽章:
- 0
|
本帖最后由 ljbphoebe 于 2012-11-06 16:51 編輯
問:原來的skb哪去了?
ip_rcv函數處理從鏈路層來的skb數據包,該函數會檢查skb是否被共享,如果被共享就clone一個skb,原來的skb的user引用計數減1。
如果skb的user引用數為3的話,那么就會進入skb_share_check中的if (skb_shared(skb)) 段中執(zhí)行,就會clone 一個新的skb,然后kfree_skb(skb)將舊的skb的引用計數減1,user為2,
struct sk_buff *nskb = skb_clone(skb, pri);
kfree_skb(skb);
skb = nskb;
從代碼上看,skb指針指向了新clone的skb,kfree_skb(skb)并沒有真正釋放原來skb,那么原來的skb哪去了呢?豈不是內核內存泄露了?誰知道這是為什么?謝謝~- int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
- {
- struct iphdr *iph;
- /* When the interface is in promisc. mode, drop all the crap
- * that it receives, do not try to analyse it.
- */
- if (skb->pkt_type == PACKET_OTHERHOST)
- goto drop;
- IP_INC_STATS_BH(IPSTATS_MIB_INRECEIVES);
- if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) {
- IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);
- goto out;
- }
- ......
- }
- static inline struct sk_buff *skb_share_check(struct sk_buff *skb, int pri)
- {
- might_sleep_if(pri & __GFP_WAIT);
- if (skb_shared(skb)) {
- struct sk_buff *nskb = skb_clone(skb, pri);
- kfree_skb(skb);
- skb = nskb;
- }
- return skb;
- }
- static inline void kfree_skb(struct sk_buff *skb)
- {
- if (atomic_read(&skb->users) == 1 || atomic_dec_and_test(&skb->users))
- __kfree_skb(skb);
- }
復制代碼 |
|