* [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation @ 2014-06-02 4:43 Simon Horman 2014-06-02 16:21 ` Thomas Graf 0 siblings, 1 reply; 9+ messages in thread From: Simon Horman @ 2014-06-02 4:43 UTC (permalink / raw) To: David Miller, netdev-u79uwXL29TY76Z2rM5mHXA Cc: dev-yBygre7rU0TnMu66kgdUjQ, YAMAMOTO Takashi 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(). Thanks to Jesse Gross for prompting me to investigate this. Acked-by: Jesse Gross <jesse-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> Acked-by: YAMAMOTO Takashi <yamamoto-jCdQPDEk3idL9jVzuh4AOg@public.gmane.org> Signed-off-by: Simon Horman <horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> --- v4 * Correct typos in comment * Added Ack from YAMAMOTO Takashi v3 * As requested by David Miller - Do not mark net_mpls_features as inline - Correct alignment of parameters v2 * Added Ack from Jesse Gross * Removed duplicate 'Thus' from changelog --- net/core/dev.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/net/core/dev.c b/net/core/dev.c index 0355ca5..24289a0 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2540,6 +2540,42 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) } EXPORT_SYMBOL(netif_skb_features); +/* 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, + struct net_device *dev, + netdev_features_t features) +{ + /* There is no support for MPLS LRO. So the only way that + * an MPLS skb could require GSO segmentation is if it + * was received as a non-MPLS skb and then became an MPLS skb. + * This may be effected by Open vSwitch in which case the + * mac_len will non-zero and not equal to skb_network_offset + * as the former indicates the end of L2 while the latter indicates + * the beginning of L3 and there is a gap between them occupied + * by the MPLS label stack. + * + * Thus it is possible to avoid traversing any VLAN tags that are + * present to determine if the ethtype is MPLS. Instead the + * inequality of mac_len and skb_network_offset are used to + * determine if a packet is MPLS for the purpose of determining + * offload features. + */ + if (skb->mac_len && skb->mac_len != skb_network_offset(skb)) + features &= dev->mpls_features; + return features; +} +#else +static netdev_features_t net_mpls_features(struct sk_buff *skb, + struct net_device *dev, + netdev_features_t features) +{ + return features; +} +#endif + int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq) { @@ -2576,6 +2612,8 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, if (skb->encapsulation) features &= dev->hw_enc_features; + features = net_mpls_features(skb, dev, features); + if (netif_needs_gso(skb, features)) { if (unlikely(dev_gso_segment(skb, features))) goto out_kfree_skb; -- 1.8.5.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation 2014-06-02 4:43 [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation Simon Horman @ 2014-06-02 16:21 ` Thomas Graf 2014-06-03 0:16 ` Simon Horman 0 siblings, 1 reply; 9+ messages in thread From: Thomas Graf @ 2014-06-02 16:21 UTC (permalink / raw) To: Simon Horman; +Cc: David Miller, netdev, Jesse Gross, YAMAMOTO Takashi, dev On 06/02/14 at 01:43pm, Simon Horman wrote: > +#ifdef CONFIG_NET_MPLS_GSO > +static netdev_features_t net_mpls_features(struct sk_buff *skb, > + struct net_device *dev, > + netdev_features_t features) > +{ > + /* There is no support for MPLS LRO. So the only way that > + * an MPLS skb could require GSO segmentation is if it > + * was received as a non-MPLS skb and then became an MPLS skb. > + * This may be effected by Open vSwitch in which case the > + * mac_len will non-zero and not equal to skb_network_offset > + * as the former indicates the end of L2 while the latter indicates > + * the beginning of L3 and there is a gap between them occupied > + * by the MPLS label stack. > + * > + * Thus it is possible to avoid traversing any VLAN tags that are > + * present to determine if the ethtype is MPLS. Instead the > + * inequality of mac_len and skb_network_offset are used to > + * determine if a packet is MPLS for the purpose of determining > + * offload features. > + */ > + if (skb->mac_len && skb->mac_len != skb_network_offset(skb)) > + features &= dev->mpls_features; > + return features; > +} Could you elaborate a bit on the safety of this? What about GRE GSO which sets mac_len to the inner network offset? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation 2014-06-02 16:21 ` Thomas Graf @ 2014-06-03 0:16 ` Simon Horman [not found] ` <20140603001640.GA31821-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Simon Horman @ 2014-06-03 0:16 UTC (permalink / raw) To: Thomas Graf; +Cc: David Miller, netdev, Jesse Gross, YAMAMOTO Takashi, dev On Mon, Jun 02, 2014 at 05:21:45PM +0100, Thomas Graf wrote: > On 06/02/14 at 01:43pm, Simon Horman wrote: > > +#ifdef CONFIG_NET_MPLS_GSO > > +static netdev_features_t net_mpls_features(struct sk_buff *skb, > > + struct net_device *dev, > > + netdev_features_t features) > > +{ > > + /* There is no support for MPLS LRO. So the only way that > > + * an MPLS skb could require GSO segmentation is if it > > + * was received as a non-MPLS skb and then became an MPLS skb. > > + * This may be effected by Open vSwitch in which case the > > + * mac_len will non-zero and not equal to skb_network_offset > > + * as the former indicates the end of L2 while the latter indicates > > + * the beginning of L3 and there is a gap between them occupied > > + * by the MPLS label stack. > > + * > > + * Thus it is possible to avoid traversing any VLAN tags that are > > + * present to determine if the ethtype is MPLS. Instead the > > + * inequality of mac_len and skb_network_offset are used to > > + * determine if a packet is MPLS for the purpose of determining > > + * offload features. > > + */ > > + if (skb->mac_len && skb->mac_len != skb_network_offset(skb)) > > + features &= dev->mpls_features; > > + return features; > > +} > > Could you elaborate a bit on the safety of this? What about > GRE GSO which sets mac_len to the inner network offset? Hi Thomas, thanks for pointing that out. It seems to me that I made an error in extending an assumption that is true inside the (unmerged MPLS patch for) the Open vSwitch datapath to code outside of the datapath. I had thought this would be safe as the check should only trigger for packets manipulated by the datapath. I now think that its possible that the GRE GSO code could kick in: if the datapath outputs to GRE. And even if that is not the case it seems to me that adding an assumption in code in net/core/dev.c to the way mac_len is set which has not been universally adopted throughout net/ is asking for trouble. My _untested_ alternate approach as illustrated below is to check the ethernet type for MPLS, using skb_network_protocol to account for TEB and VLANs. I am slightly concerned about the performance implications of this approach. I notice harmonize_features() already makes a call to skb_network_protocol(). So if performance is a problem perhaps that call could be leveraged somehow. diff --git a/net/core/dev.c b/net/core/dev.c index 0355ca5..736c48c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2540,6 +2540,33 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) } EXPORT_SYMBOL(netif_skb_features); +/* 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, + struct net_device *dev, + netdev_features_t features) +{ + __be16 type; + int depth; + + type = skb_network_protocol(skb, &depth); + if (type == cpu_to_be16(ETH_P_MPLS_UC) || + type == cpu_to_be16(ETH_P_MPLS_MC)) + features &= dev->mpls_features; + + return features; +} +#else +static netdev_features_t net_mpls_features(struct sk_buff *skb, + struct net_device *dev, + netdev_features_t features) +{ + return features; +} +#endif + int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, struct netdev_queue *txq) { @@ -2576,6 +2603,8 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, if (skb->encapsulation) features &= dev->hw_enc_features; + features = net_mpls_features(skb, dev, features); + if (netif_needs_gso(skb, features)) { if (unlikely(dev_gso_segment(skb, features))) goto out_kfree_skb; ^ permalink raw reply related [flat|nested] 9+ messages in thread
[parent not found: <20140603001640.GA31821-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org>]
* Re: [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation [not found] ` <20140603001640.GA31821-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> @ 2014-06-03 0:45 ` Jesse Gross 2014-06-03 2:38 ` Simon Horman 0 siblings, 1 reply; 9+ messages in thread From: Jesse Gross @ 2014-06-03 0:45 UTC (permalink / raw) To: Simon Horman Cc: netdev, YAMAMOTO Takashi, dev-yBygre7rU0TnMu66kgdUjQ@public.gmane.org, David Miller On Mon, Jun 2, 2014 at 5:16 PM, Simon Horman <horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> wrote: > On Mon, Jun 02, 2014 at 05:21:45PM +0100, Thomas Graf wrote: >> On 06/02/14 at 01:43pm, Simon Horman wrote: >> > +#ifdef CONFIG_NET_MPLS_GSO >> > +static netdev_features_t net_mpls_features(struct sk_buff *skb, >> > + struct net_device *dev, >> > + netdev_features_t features) >> > +{ >> > + /* There is no support for MPLS LRO. So the only way that >> > + * an MPLS skb could require GSO segmentation is if it >> > + * was received as a non-MPLS skb and then became an MPLS skb. >> > + * This may be effected by Open vSwitch in which case the >> > + * mac_len will non-zero and not equal to skb_network_offset >> > + * as the former indicates the end of L2 while the latter indicates >> > + * the beginning of L3 and there is a gap between them occupied >> > + * by the MPLS label stack. >> > + * >> > + * Thus it is possible to avoid traversing any VLAN tags that are >> > + * present to determine if the ethtype is MPLS. Instead the >> > + * inequality of mac_len and skb_network_offset are used to >> > + * determine if a packet is MPLS for the purpose of determining >> > + * offload features. >> > + */ >> > + if (skb->mac_len && skb->mac_len != skb_network_offset(skb)) >> > + features &= dev->mpls_features; >> > + return features; >> > +} >> >> Could you elaborate a bit on the safety of this? What about >> GRE GSO which sets mac_len to the inner network offset? > > Hi Thomas, > > thanks for pointing that out. > > It seems to me that I made an error in extending an assumption > that is true inside the (unmerged MPLS patch for) the Open vSwitch > datapath to code outside of the datapath. I had thought this > would be safe as the check should only trigger for packets > manipulated by the datapath. > > I now think that its possible that the GRE GSO code could kick in: if the > datapath outputs to GRE. And even if that is not the case it seems to me > that adding an assumption in code in net/core/dev.c to the way mac_len is > set which has not been universally adopted throughout net/ is asking for > trouble. > > My _untested_ alternate approach as illustrated below is to check the > ethernet type for MPLS, using skb_network_protocol to account for TEB and > VLANs. > > I am slightly concerned about the performance implications of this > approach. I notice harmonize_features() already makes a call to > skb_network_protocol(). So if performance is a problem perhaps that call > could be leveraged somehow. To be honest, I think this actually really belongs as part of netif_skb_features()/harmonize_features(). The point of those functions is to return the offloading features that are available for a given packet, so it's not clear why they wouldn't take MPLS into account. If we merged them then it would both be cleaner and should avoid any performance issues. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation 2014-06-03 0:45 ` Jesse Gross @ 2014-06-03 2:38 ` Simon Horman [not found] ` <20140603023852.GA20728-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: Simon Horman @ 2014-06-03 2:38 UTC (permalink / raw) To: Jesse Gross Cc: Thomas Graf, David Miller, netdev, YAMAMOTO Takashi, dev@openvswitch.org On Mon, Jun 02, 2014 at 05:45:22PM -0700, Jesse Gross wrote: > On Mon, Jun 2, 2014 at 5:16 PM, Simon Horman <horms@verge.net.au> wrote: > > On Mon, Jun 02, 2014 at 05:21:45PM +0100, Thomas Graf wrote: > >> On 06/02/14 at 01:43pm, Simon Horman wrote: > >> > +#ifdef CONFIG_NET_MPLS_GSO > >> > +static netdev_features_t net_mpls_features(struct sk_buff *skb, > >> > + struct net_device *dev, > >> > + netdev_features_t features) > >> > +{ > >> > + /* There is no support for MPLS LRO. So the only way that > >> > + * an MPLS skb could require GSO segmentation is if it > >> > + * was received as a non-MPLS skb and then became an MPLS skb. > >> > + * This may be effected by Open vSwitch in which case the > >> > + * mac_len will non-zero and not equal to skb_network_offset > >> > + * as the former indicates the end of L2 while the latter indicates > >> > + * the beginning of L3 and there is a gap between them occupied > >> > + * by the MPLS label stack. > >> > + * > >> > + * Thus it is possible to avoid traversing any VLAN tags that are > >> > + * present to determine if the ethtype is MPLS. Instead the > >> > + * inequality of mac_len and skb_network_offset are used to > >> > + * determine if a packet is MPLS for the purpose of determining > >> > + * offload features. > >> > + */ > >> > + if (skb->mac_len && skb->mac_len != skb_network_offset(skb)) > >> > + features &= dev->mpls_features; > >> > + return features; > >> > +} > >> > >> Could you elaborate a bit on the safety of this? What about > >> GRE GSO which sets mac_len to the inner network offset? > > > > Hi Thomas, > > > > thanks for pointing that out. > > > > It seems to me that I made an error in extending an assumption > > that is true inside the (unmerged MPLS patch for) the Open vSwitch > > datapath to code outside of the datapath. I had thought this > > would be safe as the check should only trigger for packets > > manipulated by the datapath. > > > > I now think that its possible that the GRE GSO code could kick in: if the > > datapath outputs to GRE. And even if that is not the case it seems to me > > that adding an assumption in code in net/core/dev.c to the way mac_len is > > set which has not been universally adopted throughout net/ is asking for > > trouble. > > > > My _untested_ alternate approach as illustrated below is to check the > > ethernet type for MPLS, using skb_network_protocol to account for TEB and > > VLANs. > > > > I am slightly concerned about the performance implications of this > > approach. I notice harmonize_features() already makes a call to > > skb_network_protocol(). So if performance is a problem perhaps that call > > could be leveraged somehow. > > To be honest, I think this actually really belongs as part of > netif_skb_features()/harmonize_features(). The point of those > functions is to return the offloading features that are available for > a given packet, so it's not clear why they wouldn't take MPLS into > account. If we merged them then it would both be cleaner and should > avoid any performance issues. I think that the reason that I didn't do this initially was that I wanted to handle mpls_features in a similar way to that of hw_enc_features. In light of the feedback from you and Thomas I do agree that it seems to make sense to handle things in netif_skb_features()/harmonize_features(). As per your suggestion I have tested the following revised patch. From: Simon Horman <horms@verge.net.au> [PATCH v4.1] MPLS: Use mpls_features to activate software MPLS GSO segmentation 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> --- v4.1 * Use ethertype of packet to detect MPLS rather than relying on mac_len indicating a gap between the end of L2 and the beginning of L3. That assumption seems to be broken by the GRE GSO code. * Move mpls_features handling into harmonize_features() This allows an existing call in there to skb_network_protocol() to be leveraged. * Removed acks as the patch has now changed in a material way v4 * Correct typos in comment * Added Ack from YAMAMOTO Takashi v3 * As requested by David Miller - Do not mark net_mpls_features as inline - Correct alignment of parameters v2 * Added Ack from Jesse Gross * Removed duplicate 'Thus' from changelog --- net/core/dev.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/net/core/dev.c b/net/core/dev.c index 0355ca5..0fc92ee 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2498,11 +2498,38 @@ 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) +{ + int tmp; + __be16 type; + + type = skb_network_protocol(skb, &tmp); + if (unlikely(type == cpu_to_be16(ETH_P_MPLS_UC) || + type == cpu_to_be16(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) +{ + return features; +} +#endif + static netdev_features_t harmonize_features(struct sk_buff *skb, netdev_features_t features) { int tmp; + features = net_mpls_features(skb, features); + if (skb->ip_summed != CHECKSUM_NONE && !can_checksum_protocol(features, skb_network_protocol(skb, &tmp))) { features &= ~NETIF_F_ALL_CSUM; -- 2.0.0.rc2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
[parent not found: <20140603023852.GA20728-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org>]
* Re: [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation [not found] ` <20140603023852.GA20728-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> @ 2014-06-03 3:42 ` Eric Dumazet 2014-06-03 4:30 ` Simon Horman 0 siblings, 1 reply; 9+ messages in thread From: Eric Dumazet @ 2014-06-03 3:42 UTC (permalink / raw) To: Simon Horman Cc: dev-yBygre7rU0TnMu66kgdUjQ@public.gmane.org, netdev, YAMAMOTO Takashi, David Miller Hi Simon On Tue, 2014-06-03 at 11:38 +0900, Simon Horman wrote: > +/* 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) > +{ > + int tmp; > + __be16 type; > + > + type = skb_network_protocol(skb, &tmp); > + if (unlikely(type == cpu_to_be16(ETH_P_MPLS_UC) || > + type == cpu_to_be16(ETH_P_MPLS_MC))) I believe net/core/dev.c prefers to use htons(ETH_P_MPLS_UC) (check netif_skb_features()) > + features &= skb->dev->mpls_features; > + > + return features; > +} > +#else > +static netdev_features_t net_mpls_features(struct sk_buff *skb, > + netdev_features_t features) > +{ > + 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); 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; I guess CONFIG_NET_MPLS_GSO will be set by all distros, right ? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation 2014-06-03 3:42 ` Eric Dumazet @ 2014-06-03 4:30 ` Simon Horman 2014-06-03 4:46 ` [ovs-dev] " YAMAMOTO Takashi 0 siblings, 1 reply; 9+ messages in thread From: Simon Horman @ 2014-06-03 4:30 UTC (permalink / raw) To: Eric Dumazet Cc: Jesse Gross, Thomas Graf, David Miller, netdev, YAMAMOTO Takashi, dev@openvswitch.org Hi Eric, On Mon, Jun 02, 2014 at 08:42:02PM -0700, Eric Dumazet wrote: > Hi Simon > > On Tue, 2014-06-03 at 11:38 +0900, Simon Horman wrote: > > +/* 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) > > +{ > > + int tmp; > > + __be16 type; > > + > > + type = skb_network_protocol(skb, &tmp); > > + if (unlikely(type == cpu_to_be16(ETH_P_MPLS_UC) || > > + type == cpu_to_be16(ETH_P_MPLS_MC))) > > I believe net/core/dev.c prefers to use htons(ETH_P_MPLS_UC) Thanks, I will fix that. > (check netif_skb_features()) > > > + features &= skb->dev->mpls_features; > > + > > + return features; > > +} > > +#else > > +static netdev_features_t net_mpls_features(struct sk_buff *skb, > > + netdev_features_t features) > > +{ > > + 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); > > 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; Thanks, I'll switch things around as you suggest. > I guess CONFIG_NET_MPLS_GSO will be set by all distros, right ? That seems likely to me. From: Simon Horman <horms@verge.net.au> MPLS: Use mpls_features to activate software MPLS GSO segmentation 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> --- v4.2 * As suggested by Eric Dumazet - Use htons() instead of cpu_to_be16() - Refactor code to pass type to net_mpls_features. v4.1 * Following fedback from Thomas Graff and Jesse Gross - Use ethertype of packet to detect MPLS rather than relying on mac_len indicating a gap between the end of L2 and the beginning of L3. That assumption seems to be broken by the GRE GSO code. - Move mpls_features handling into harmonize_features() This allows an existing call in there to skb_network_protocol() to be leveraged. - Removed acks as the patch has now changed in a material way v4 * As suggested by YAMAMOTO Takashi - Correct typos in comment * Added Ack from YAMAMOTO Takashi v3 * As requested by David Miller - Do not mark net_mpls_features as inline - Correct alignment of parameters v2 * Added Ack from Jesse Gross * Removed duplicate 'Thus' from changelog --- net/core/dev.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/net/core/dev.c b/net/core/dev.c index 0355ca5..7c063ac 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2498,13 +2498,42 @@ 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) +{ + int tmp; + + if (unlikely(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; -- 2.0.0.rc2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [ovs-dev] [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation 2014-06-03 4:30 ` Simon Horman @ 2014-06-03 4:46 ` YAMAMOTO Takashi [not found] ` <20140603044611.C2B0970BA7-0CV7wKnmZOB82hYKe6nXyg@public.gmane.org> 0 siblings, 1 reply; 9+ messages in thread From: YAMAMOTO Takashi @ 2014-06-03 4:46 UTC (permalink / raw) To: horms; +Cc: eric.dumazet, dev, netdev, davem > diff --git a/net/core/dev.c b/net/core/dev.c > index 0355ca5..7c063ac 100644 > --- a/net/core/dev.c > +++ b/net/core/dev.c > @@ -2498,13 +2498,42 @@ 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) > +{ > + int tmp; this variable seems no longer used. > + > + if (unlikely(type == htons(ETH_P_MPLS_UC) || > + type == htons(ETH_P_MPLS_MC))) why unlikely? otherwise, Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp> YAMAMOTO Takashi ^ permalink raw reply [flat|nested] 9+ messages in thread
[parent not found: <20140603044611.C2B0970BA7-0CV7wKnmZOB82hYKe6nXyg@public.gmane.org>]
* Re: [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation [not found] ` <20140603044611.C2B0970BA7-0CV7wKnmZOB82hYKe6nXyg@public.gmane.org> @ 2014-06-03 4:49 ` Simon Horman 0 siblings, 0 replies; 9+ messages in thread From: Simon Horman @ 2014-06-03 4:49 UTC (permalink / raw) To: YAMAMOTO Takashi Cc: dev-yBygre7rU0TnMu66kgdUjQ, netdev-u79uwXL29TY76Z2rM5mHXA, davem-fT/PcQaiUtIeIZ0/mPfg9Q, eric.dumazet-Re5JQEeQqe8AvxtiuMwx3w On Tue, Jun 03, 2014 at 01:46:11PM +0900, YAMAMOTO Takashi wrote: > > diff --git a/net/core/dev.c b/net/core/dev.c > > index 0355ca5..7c063ac 100644 > > --- a/net/core/dev.c > > +++ b/net/core/dev.c > > @@ -2498,13 +2498,42 @@ 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) > > +{ > > + int tmp; > > this variable seems no longer used. Thanks, I will remove it. > > + > > + if (unlikely(type == htons(ETH_P_MPLS_UC) || > > + type == htons(ETH_P_MPLS_MC))) > > why unlikely? Because packets are not likely to be MPLS (IMHO). I'm happy to remove the unlikely() if you like. > > otherwise, > Acked-by: YAMAMOTO Takashi <yamamoto-jCdQPDEk3idL9jVzuh4AOg@public.gmane.org> > > YAMAMOTO Takashi > ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2014-06-03 4:49 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-06-02 4:43 [PATCH v4 net-next] MPLS: Use mpls_features to activate software MPLS GSO segmentation Simon Horman 2014-06-02 16:21 ` Thomas Graf 2014-06-03 0:16 ` Simon Horman [not found] ` <20140603001640.GA31821-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> 2014-06-03 0:45 ` Jesse Gross 2014-06-03 2:38 ` Simon Horman [not found] ` <20140603023852.GA20728-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org> 2014-06-03 3:42 ` Eric Dumazet 2014-06-03 4:30 ` Simon Horman 2014-06-03 4:46 ` [ovs-dev] " YAMAMOTO Takashi [not found] ` <20140603044611.C2B0970BA7-0CV7wKnmZOB82hYKe6nXyg@public.gmane.org> 2014-06-03 4:49 ` Simon Horman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).