Le jeudi 04 novembre 2010 Ã 17:05 +0800, xiaohui.xin@xxxxxxxxx a Ãcrit : > From: Xin Xiaohui <xiaohui.xin@xxxxxxxxx> > > If buffer is external, then use the callback to destruct > buffers. > > Signed-off-by: Xin Xiaohui <xiaohui.xin@xxxxxxxxx> > Signed-off-by: Zhao Yu <yzhao81new@xxxxxxxxx> > Reviewed-by: Jeff Dike <jdike@xxxxxxxxxxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html