Le jeudi 04 novembre 2010 à 17:05 +0800, xiaohui....@intel.com a écrit : > From: Xin Xiaohui <xiaohui....@intel.com> > > If buffer is external, then use the callback to destruct > buffers. > > Signed-off-by: Xin Xiaohui <xiaohui....@intel.com> > Signed-off-by: Zhao Yu <yzhao81...@gmail.com> > Reviewed-by: Jeff Dike <jd...@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 kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html