On Tue, Apr 25, 2017 at 05:45:34PM -0700, Yi-Hung Wei wrote:
> Hi Simon,
> 
> Thanks for your review. Please find my relies below.
> I will sent out v2 based on your review.
> 
> On Tue, Apr 25, 2017 at 12:43 AM, Simon Horman
> <simon.hor...@netronome.com> wrote:
> > Hi Yi-Hung,
> >
> > thanks for taking on this difficult piece of work and apologies for the
> > delay in responding.
> >
> > On Mon, Apr 03, 2017 at 04:24:36PM -0700, Yi-Hung Wei wrote:
> >> This commit backports the following upstream commits to fix MPLS GSO in ovs
> >> datapath. It has been tested on kernel 4.4 and 4.9.
> >
> > Thanks also for noting the versions this has been tested against. I expect
> > there testing against other versions will show some residual problems but
> > I think that fixing 4.4 and 4.9 is a good step forwards.
> >
> > I see that this patch backports 4 upstream patches. I am curious to know
> > if you considered backporting them individually. That would have made
> > reviewing a little easier for me.
> Thanks for your suggestion. I pull two independent patches out of this
> patch in v2.
> Commit 48d2ab609b6b("net: mpls: Fixups for GSO") and 85de4a2101ac
> ("openvswitch: use mpls_hdr") are backported together since I am using the
> mpls_hdr() in the later commit to backport some logic in the first commit.

Thanks.

> >> Upstream commit:
> >>     commit 48d2ab609b6bbecb7698487c8579bc40de9d6dfa
> >>     Author: David Ahern <d...@cumulusnetworks.com>
> >>     Date:   Wed Aug 24 20:10:44 2016 -0700
> >
> > ...
> >
> >> Upstream commit:
> >>     commit f7d49bce8e741e1e6aa14ce4db1b6cea7e4be4e8
> >>     Author: Jiri Benc <jb...@redhat.com>
> >>     Date:   Fri Sep 30 19:08:05 2016 +0200
> >
> > ...
> >
> >> Upstream commit:
> >>     commit 85de4a2101acb85c3b1dde465e84596ccca99f2c
> >>     Author: Jiri Benc <jb...@redhat.com>
> >>     Date:   Fri Sep 30 19:08:07 2016 +0200
> >>
> >>     openvswitch: use mpls_hdr
> >>
> >>     skb_mpls_header is equivalent to mpls_hdr now. Use the existing helper
> >>     instead.
> >>
> >>     Signed-off-by: Jiri Benc <jb...@redhat.com>
> >>     Acked-by: Pravin B Shelar <pshe...@ovn.org>
> >>     Signed-off-by: David S. Miller <da...@davemloft.net>
> >
> > ...
> >
> >> Upstream commit:
> >>     commit c66549ffd666605831abf6cf19ce0571ad868e39
> >>     Author: Jiri Benc <jb...@redhat.com>
> >>     Date:   Wed Oct 5 15:01:57 2016 +0200
> >
> > ...
> >
> >> diff --git a/acinclude.m4 b/acinclude.m4
> >> index 744d8f89525c..82ca4a28015c 100644
> >> --- a/acinclude.m4
> >> +++ b/acinclude.m4
> >> @@ -479,6 +479,7 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
> >>                          [OVS_GREP_IFELSE([$KSRC/include/net/dst_cache.h], 
> >> [dst_cache],
> >>                                           
> >> [OVS_DEFINE([USE_UPSTREAM_TUNNEL])])])])
> >>
> >> +  OVS_GREP_IFELSE([$KSRC/include/linux/mpls.h], [mpls_hdr])
> >
> > Should the path be $KSRC/include/net/mpls.h?
> >
> > I am looking at 9095e10edd28 ("mpls: move mpls_hdr to a common location")
> Yes, you're right. Thanks for finding this bug.
> 
> >
> >>    OVS_GREP_IFELSE([$KSRC/include/linux/net.h], [sock_create_kern.*net],
> >>                    [OVS_DEFINE([HAVE_SOCK_CREATE_KERN_NET])])
> >>    OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], 
> >> [ndo_fill_metadata_dst])
> >> diff --git a/datapath/actions.c b/datapath/actions.c
> >> index 06080b24ea5a..ecc5136a3529 100644
> >> --- a/datapath/actions.c
> >> +++ b/datapath/actions.c
> >
> > ...
> >
> >> @@ -169,20 +170,26 @@ static int push_mpls(struct sk_buff *skb, struct 
> >> sw_flow_key *key,
> >>       if (skb_cow_head(skb, MPLS_HLEN) < 0)
> >>               return -ENOMEM;
> >>
> >> +     if (!ovs_skb_get_inner_protocol(skb)) {
> >> +             skb_set_inner_network_header(skb, skb->mac_len);
> >> +             ovs_skb_set_inner_protocol(skb, skb->protocol);
> >> +     }
> >> +
> >>       skb_push(skb, MPLS_HLEN);
> >>       memmove(skb_mac_header(skb) - MPLS_HLEN, skb_mac_header(skb),
> >>               skb->mac_len);
> >>       skb_reset_mac_header(skb);
> >> +#ifdef HAVE_MPLS_HDR
> >> +     skb_set_network_header(skb, skb->mac_len);
> >> +#endif
> >
> > It is not clear to me why this call to skb_set_network_header() is
> > guarded by HAVE_MPLS_HDR here and moreover not elsewhere in this patch.
> 
> This patch uses HAVE_MPLS_HDR to determine if the kernel that ovs datapath is
> compiled with has the new or the old mpls_gso kernel module. Because
> starting from
> commit 48d2ab609b6b ("net: mpls: Fixups for GSO"), the mpls_gso kernel module
> relies on the fact that skb_network_header() points to the mpls header and
> skb_inner_network_header() points to the L3 header so that it can
> derive the length of
> mpls header correctly. However, the old mpls_gso kernel module assumes that 
> the
> skb_network_header() points to the L3 header, and the old mpls_gso
> kernel module will
> misbehave if the ovs datapath marks the skb_network_header() in the
> new way since it will
> treat mpls header as the L3 header. Therefore, we only need to set the
> network_header in
> newer kernel.
> 
> I use HAVE_MPLS_HDR to determine whether we have new or old mpls_gso
> module, cause
> I want to avoid using kernel version number, and since these two
> patches are related, and they
> are both in 4.9 kernel.
> 
> The other part of the code does not need to be guarded by HAVE_MPLS_HDR mainly
> because of the following two reason.
> 
> 1) It does no harm to the code outside of ovs datapath. For example,
> for older mpls_gso kernel
> module, it does not matter whether we set the inner network header or
> not. To make the datapath
> code more clean, I do not guard that type of code with HAVE_MPLS_HDR.
> There may be some
> cases I did not consider, but at least it work for the tests I perform.
> 
> 2) The behavior is consistent within the ovs datapath. As long as the
> way we access the mpls
> header is consistent within ovs datapath. It should be fine whether we
> use skb_set_network_header()
> or skb_set_inner_network_header().

Understood, thanks for the detailed explanation. Perhaps a(nother) more
intuitive name could be used for HAVE_MPLS_HDR, f.e.
MPLS_NETWORK_HEADER_IS_L3? And/or a comment somewhere?

...
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to