Message ID | 1401839597-8961-1-git-send-email-horms@verge.net.au |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
On 06/04/14 at 08:53am, Simon Horman wrote: > If an MPLS packet requires segmentation then use mpls_features > to determine if the software implementation should be used. > > As no driver advertises MPLS GSO segmentation this will always be > the case. > > I had not noticed that this was necessary before as software MPLS GSO > segmentation was already being used in my test environment. I believe that > the reason for that is the skbs in question always had fragments and the > driver I used does not advertise NETIF_F_FRAGLIST (which seems to be the > case for most drivers). Thus software segmentation was activated by > skb_gso_ok(). > > This introduces the overhead of an extra call to skb_network_protocol() > in the case where where CONFIG_NET_MPLS_GSO is set and > skb->ip_summed == CHECKSUM_NONE. > > Thanks to Jesse Gross for prompting me to investigate this. > > Signed-off-by: Simon Horman <horms@verge.net.au> > Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> LGTM Acked-by: Thomas Graf <tgraf@suug.ch> -- 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: Simon Horman <horms@verge.net.au> Date: Wed, 4 Jun 2014 08:53:17 +0900 > If an MPLS packet requires segmentation then use mpls_features > to determine if the software implementation should be used. > > As no driver advertises MPLS GSO segmentation this will always be > the case. > > I had not noticed that this was necessary before as software MPLS GSO > segmentation was already being used in my test environment. I believe that > the reason for that is the skbs in question always had fragments and the > driver I used does not advertise NETIF_F_FRAGLIST (which seems to be the > case for most drivers). Thus software segmentation was activated by > skb_gso_ok(). > > This introduces the overhead of an extra call to skb_network_protocol() > in the case where where CONFIG_NET_MPLS_GSO is set and > skb->ip_summed == CHECKSUM_NONE. > > Thanks to Jesse Gross for prompting me to investigate this. > > Signed-off-by: Simon Horman <horms@verge.net.au> > Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> Applied to net-next, thanks Simon. -- 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
On Thu, Jun 05, 2014 at 03:05:42PM -0700, David Miller wrote: > From: Simon Horman <horms@verge.net.au> > Date: Wed, 4 Jun 2014 08:53:17 +0900 > > > If an MPLS packet requires segmentation then use mpls_features > > to determine if the software implementation should be used. > > > > As no driver advertises MPLS GSO segmentation this will always be > > the case. > > > > I had not noticed that this was necessary before as software MPLS GSO > > segmentation was already being used in my test environment. I believe that > > the reason for that is the skbs in question always had fragments and the > > driver I used does not advertise NETIF_F_FRAGLIST (which seems to be the > > case for most drivers). Thus software segmentation was activated by > > skb_gso_ok(). > > > > This introduces the overhead of an extra call to skb_network_protocol() > > in the case where where CONFIG_NET_MPLS_GSO is set and > > skb->ip_summed == CHECKSUM_NONE. > > > > Thanks to Jesse Gross for prompting me to investigate this. > > > > Signed-off-by: Simon Horman <horms@verge.net.au> > > Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> > > Applied to net-next, thanks Simon. Thanks! -- 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/net/core/dev.c b/net/core/dev.c index 0355ca5..f726bfb 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2498,13 +2498,39 @@ static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features) return 0; } +/* If MPLS offload request, verify we are testing hardware MPLS features + * instead of standard features for the netdev. + */ +#ifdef CONFIG_NET_MPLS_GSO +static netdev_features_t net_mpls_features(struct sk_buff *skb, + netdev_features_t features, + __be16 type) +{ + if (type == htons(ETH_P_MPLS_UC) || type == htons(ETH_P_MPLS_MC)) + features &= skb->dev->mpls_features; + + return features; +} +#else +static netdev_features_t net_mpls_features(struct sk_buff *skb, + netdev_features_t features, + __be16 type) +{ + return features; +} +#endif + static netdev_features_t harmonize_features(struct sk_buff *skb, netdev_features_t features) { int tmp; + __be16 type; + + type = skb_network_protocol(skb, &tmp); + features = net_mpls_features(skb, features, type); if (skb->ip_summed != CHECKSUM_NONE && - !can_checksum_protocol(features, skb_network_protocol(skb, &tmp))) { + !can_checksum_protocol(features, type)) { features &= ~NETIF_F_ALL_CSUM; } else if (illegal_highdma(skb->dev, skb)) { features &= ~NETIF_F_SG;