--- zzzz-none-000/linux-2.6.19.2/net/core/skbuff.c 2007-01-10 19:10:37.000000000 +0000 +++ davinci-8020-5505/linux-2.6.19.2/net/core/skbuff.c 2008-05-15 09:52:52.000000000 +0000 @@ -86,6 +86,7 @@ */ void skb_over_panic(struct sk_buff *skb, int sz, void *here) { + restore_printk(); printk(KERN_EMERG "skb_over_panic: text:%p len:%d put:%d head:%p " "data:%p tail:%p end:%p dev:%s\n", here, skb->len, sz, skb->head, skb->data, skb->tail, skb->end, @@ -104,6 +105,7 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here) { + restore_printk(); printk(KERN_EMERG "skb_under_panic: text:%p len:%d put:%d head:%p " "data:%p tail:%p end:%p dev:%s\n", here, skb->len, sz, skb->head, skb->data, skb->tail, skb->end, @@ -113,6 +115,7 @@ void skb_truesize_bug(struct sk_buff *skb) { + restore_printk(); printk(KERN_ERR "SKB BUG: Invalid truesize (%u) " "len=%u, sizeof(sk_buff)=%Zd\n", skb->truesize, skb->len, sizeof(struct sk_buff)); @@ -146,6 +149,7 @@ struct skb_shared_info *shinfo; struct sk_buff *skb; u8 *data; + static unsigned int global_uniq_id = 1; cache = fclone ? skbuff_fclone_cache : skbuff_head_cache; @@ -168,6 +172,7 @@ skb->data = data; skb->tail = data; skb->end = data + size; + skb->uniq_id = global_uniq_id++; /* make sure we initialize shinfo sequentially */ shinfo = skb_shinfo(skb); atomic_set(&shinfo->dataref, 1); @@ -187,6 +192,9 @@ child->fclone = SKB_FCLONE_UNAVAILABLE; } + + skb_trace(skb, 0); + out: return skb; nodata: @@ -365,15 +373,19 @@ */ void __kfree_skb(struct sk_buff *skb) -{ +{ + WARN_ON(in_irq() || irqs_disabled()); + + if (skb->destructor) { + /* WARN_ON(in_irq()); */ + skb->destructor(skb); + } + dst_release(skb->dst); + skb->dst = 0; #ifdef CONFIG_XFRM secpath_put(skb->sp); #endif - if (skb->destructor) { - WARN_ON(in_irq()); - skb->destructor(skb); - } #ifdef CONFIG_NETFILTER nf_conntrack_put(skb->nfct); #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) @@ -403,6 +415,8 @@ */ void kfree_skb(struct sk_buff *skb) { + skb_trace(skb, 30); + if (unlikely(!skb)) return; if (likely(atomic_read(&skb->users) == 1)) @@ -489,6 +503,7 @@ #endif /*CONFIG_NETFILTER*/ #ifdef CONFIG_NET_SCHED C(tc_index); + C(uniq_id); #ifdef CONFIG_NET_CLS_ACT n->tc_verd = SET_TC_VERD(skb->tc_verd,0); n->tc_verd = CLR_TC_OK2MUNGE(n->tc_verd); @@ -639,7 +654,6 @@ n->csum = skb->csum; n->ip_summed = skb->ip_summed; - n->truesize += skb->data_len; n->data_len = skb->data_len; n->len = skb->len; @@ -1947,7 +1961,7 @@ do { struct sk_buff *nskb; skb_frag_t *frag; - int hsize; + int hsize, nsize; int k; int size; @@ -1958,10 +1972,11 @@ hsize = skb_headlen(skb) - offset; if (hsize < 0) hsize = 0; - if (hsize > len || !sg) - hsize = len; + nsize = hsize + doffset; + if (nsize > len + doffset || !sg) + nsize = len + doffset; - nskb = alloc_skb(hsize + doffset + headroom, GFP_ATOMIC); + nskb = alloc_skb(nsize + headroom, GFP_ATOMIC); if (unlikely(!nskb)) goto err;