Messages in this thread | | | Subject | Re: [PATCH v14 06/17] Use callback to deal with skb_release_data() specially. | From | Eric Dumazet <> | Date | Thu, 04 Nov 2010 10:04:25 +0100 |
| |
Le jeudi 04 novembre 2010 à 17:05 +0800, xiaohui.xin@intel.com a écrit : > From: Xin Xiaohui <xiaohui.xin@intel.com> > > If buffer is external, then use the callback to destruct > buffers. > > Signed-off-by: Xin Xiaohui <xiaohui.xin@intel.com> > Signed-off-by: Zhao Yu <yzhao81new@gmail.com> > Reviewed-by: Jeff Dike <jdike@linux.intel.com> > --- > net/core/skbuff.c | 8 ++++++++ > 1 files changed, 8 insertions(+), 0 deletions(-) > > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > index c83b421..5e6d69c 100644 > --- a/net/core/skbuff.c > +++ b/net/core/skbuff.c > @@ -210,6 +210,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, > > /* make sure we initialize shinfo sequentially */ > shinfo = skb_shinfo(skb); > + shinfo->destructor_arg = NULL;
Hmm, I suggest you read the comment two lines above.
If destructor_arg is now cleared each time we allocate a new skb, then, please move it before dataref in shinfo structure, so that the following memset() does the job efficiently...
> memset(shinfo, 0, offsetof(struct skb_shared_info, dataref)); > atomic_set(&shinfo->dataref, 1); > > @@ -343,6 +344,13 @@ static void skb_release_data(struct sk_buff *skb) > if (skb_has_frags(skb)) > skb_drop_fraglist(skb); > > + if (skb->dev && dev_is_mpassthru(skb->dev)) { > + struct skb_ext_page *ext_page = > + skb_shinfo(skb)->destructor_arg; > + if (ext_page && ext_page->dtor) > + ext_page->dtor(ext_page); > + } > + > kfree(skb->head); > } > }
-- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |