Message ID | f2bf65a8a7676bbd3e8a749ae93d99e88671d35d.1285853725.git.xiaohui.xin@intel.com |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
From: xiaohui.xin@intel.com Date: Thu, 30 Sep 2010 22:04:23 +0800 > @@ -197,10 +197,11 @@ struct skb_shared_info { > union skb_shared_tx tx_flags; > struct sk_buff *frag_list; > struct skb_shared_hwtstamps hwtstamps; > - skb_frag_t frags[MAX_SKB_FRAGS]; > /* Intermediate layers must ensure that destructor_arg > * remains valid until skb destructor */ > void * destructor_arg; > + > + skb_frag_t frags[MAX_SKB_FRAGS]; > }; > > /* The structure is for a skb which pages may point to Why are you moving frags[] to the end like this? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
>-----Original Message----- >From: David Miller [mailto:davem@davemloft.net] >Sent: Friday, October 01, 2010 3:15 PM >To: Xin, Xiaohui >Cc: netdev@vger.kernel.org; kvm@vger.kernel.org; linux-kernel@vger.kernel.org; >mst@redhat.com; mingo@elte.hu; herbert@gondor.apana.org.au; jdike@linux.intel.com >Subject: Re: [PATCH v12 06/17] Use callback to deal with skb_release_data() specially. > >From: xiaohui.xin@intel.com >Date: Thu, 30 Sep 2010 22:04:23 +0800 > >> @@ -197,10 +197,11 @@ struct skb_shared_info { >> union skb_shared_tx tx_flags; >> struct sk_buff *frag_list; >> struct skb_shared_hwtstamps hwtstamps; >> - skb_frag_t frags[MAX_SKB_FRAGS]; >> /* Intermediate layers must ensure that destructor_arg >> * remains valid until skb destructor */ >> void * destructor_arg; >> + >> + skb_frag_t frags[MAX_SKB_FRAGS]; >> }; >> >> /* The structure is for a skb which pages may point to > >Why are you moving frags[] to the end like this? That's to avoid the new cache miss caused by using destructor_arg in data path like skb_release_data(). That's based on the comment from Eric Dumazet on v7 patches. Thanks Xiaohui -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: "Xin, Xiaohui" <xiaohui.xin@intel.com> Date: Mon, 11 Oct 2010 15:06:05 +0800 > That's to avoid the new cache miss caused by using destructor_arg in data path > like skb_release_data(). > That's based on the comment from Eric Dumazet on v7 patches. Thanks for the explanation. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Le lundi 11 octobre 2010 à 08:27 -0700, David Miller a écrit : > From: "Xin, Xiaohui" <xiaohui.xin@intel.com> > Date: Mon, 11 Oct 2010 15:06:05 +0800 > > > That's to avoid the new cache miss caused by using destructor_arg in data path > > like skb_release_data(). > > That's based on the comment from Eric Dumazet on v7 patches. > > Thanks for the explanation. Anyway, frags[] must be the last field of "struct skb_shared_info" since commit fed66381 (net: pskb_expand_head() optimization) It seems Xin worked on a quite old tree. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
>-----Original Message----- >From: Eric Dumazet [mailto:eric.dumazet@gmail.com] >Sent: Monday, October 11, 2010 11:42 PM >To: David Miller >Cc: Xin, Xiaohui; netdev@vger.kernel.org; kvm@vger.kernel.org; >linux-kernel@vger.kernel.org; mst@redhat.com; mingo@elte.hu; >herbert@gondor.apana.org.au; jdike@linux.intel.com >Subject: Re: [PATCH v12 06/17] Use callback to deal with skb_release_data() specially. > >Le lundi 11 octobre 2010 à 08:27 -0700, David Miller a écrit : >> From: "Xin, Xiaohui" <xiaohui.xin@intel.com> >> Date: Mon, 11 Oct 2010 15:06:05 +0800 >> >> > That's to avoid the new cache miss caused by using destructor_arg in data path >> > like skb_release_data(). >> > That's based on the comment from Eric Dumazet on v7 patches. >> >> Thanks for the explanation. > >Anyway, frags[] must be the last field of "struct skb_shared_info" >since commit fed66381 (net: pskb_expand_head() optimization) > >It seems Xin worked on a quite old tree. > > I will rebase soon. Thanks Xiaohui -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 74af06c..ab29675 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -197,10 +197,11 @@ struct skb_shared_info { union skb_shared_tx tx_flags; struct sk_buff *frag_list; struct skb_shared_hwtstamps hwtstamps; - skb_frag_t frags[MAX_SKB_FRAGS]; /* Intermediate layers must ensure that destructor_arg * remains valid until skb destructor */ void * destructor_arg; + + skb_frag_t frags[MAX_SKB_FRAGS]; }; /* The structure is for a skb which pages may point to diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 93c4e06..117d82b 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -217,6 +217,7 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, shinfo->gso_type = 0; shinfo->ip6_frag_id = 0; shinfo->tx_flags.flags = 0; + shinfo->destructor_arg = NULL; skb_frag_list_init(skb); memset(&shinfo->hwtstamps, 0, sizeof(shinfo->hwtstamps)); @@ -350,6 +351,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); } }