Remove mutual exclusion between udp-gro registration and geneve receive port registration.
Signed-off-by: Pravin B Shelar <pshe...@ovn.org> --- acinclude.m4 | 4 +++ datapath/linux/Modules.mk | 1 + datapath/linux/compat/geneve.c | 44 +++++++++++----------------- datapath/linux/compat/include/net/protocol.h | 19 ++++++++++++ 4 files changed, 41 insertions(+), 27 deletions(-) create mode 100644 datapath/linux/compat/include/net/protocol.h diff --git a/acinclude.m4 b/acinclude.m4 index bbbad23..25295c5 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -667,6 +667,10 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_GREP_IFELSE([$KSRC/include/linux/udp.h], [no_check6_tx]) OVS_GREP_IFELSE([$KSRC/include/linux/utsrelease.h], [el6], [OVS_DEFINE([HAVE_RHEL6_PER_CPU])]) + OVS_FIND_PARAM_IFELSE([$KSRC/include/net/protocol.h], + [udp_add_offload], [net], + [OVS_DEFINE([HAVE_UDP_ADD_OFFLOAD_TAKES_NET])]) + if cmp -s datapath/linux/kcompat.h.new \ datapath/linux/kcompat.h >/dev/null 2>&1; then diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk index 1f701a3..26f6d22 100644 --- a/datapath/linux/Modules.mk +++ b/datapath/linux/Modules.mk @@ -82,6 +82,7 @@ openvswitch_headers += \ linux/compat/include/net/mpls.h \ linux/compat/include/net/net_namespace.h \ linux/compat/include/net/netlink.h \ + linux/compat/include/net/protocol.h \ linux/compat/include/net/route.h \ linux/compat/include/net/rtnetlink.h \ linux/compat/include/net/udp.h \ diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c index 74e0cbc..cbaa47c 100644 --- a/datapath/linux/compat/geneve.c +++ b/datapath/linux/compat/geneve.c @@ -411,64 +411,54 @@ static struct socket *geneve_create_sock(struct net *net, bool ipv6, static void geneve_notify_add_rx_port(struct geneve_sock *gs) { -#ifdef HAVE_NDO_ADD_GENEVE_PORT struct net_device *dev; struct sock *sk = gs->sock->sk; struct net *net = sock_net(sk); sa_family_t sa_family = geneve_get_sk_family(gs); - __be16 port = inet_sk(sk)->inet_sport; - - rcu_read_lock(); - for_each_netdev_rcu(net, dev) { - if (dev->netdev_ops->ndo_add_geneve_port) - dev->netdev_ops->ndo_add_geneve_port(dev, sa_family, - port); - } - rcu_read_unlock(); -#else -#ifdef HAVE_UDP_OFFLOAD - struct sock *sk = gs->sock->sk; - sa_family_t sa_family = sk->sk_family; int err; if (sa_family == AF_INET) { - err = udp_add_offload(&gs->udp_offloads); + err = udp_add_offload(sock_net(sk), &gs->udp_offloads); if (err) pr_warn("geneve: udp_add_offload failed with status %d\n", err); } -#endif -#endif + rcu_read_lock(); + for_each_netdev_rcu(net, dev) { +#ifdef HAVE_NDO_ADD_GENEVE_PORT + __be16 port = inet_sk(sk)->inet_sport; + + if (dev->netdev_ops->ndo_add_geneve_port) + dev->netdev_ops->ndo_add_geneve_port(dev, sa_family, + port); +#endif + } + rcu_read_unlock(); } static void geneve_notify_del_rx_port(struct geneve_sock *gs) { -#ifdef HAVE_NDO_ADD_GENEVE_PORT struct net_device *dev; struct sock *sk = gs->sock->sk; struct net *net = sock_net(sk); sa_family_t sa_family = geneve_get_sk_family(gs); - __be16 port = inet_sk(sk)->inet_sport; rcu_read_lock(); for_each_netdev_rcu(net, dev) { +#ifdef HAVE_NDO_ADD_GENEVE_PORT + __be16 port = inet_sk(sk)->inet_sport; + if (dev->netdev_ops->ndo_del_geneve_port) dev->netdev_ops->ndo_del_geneve_port(dev, sa_family, - port); + port); +#endif } rcu_read_unlock(); -#else -#ifdef HAVE_UDP_OFFLOAD - struct sock *sk = gs->sock->sk; - sa_family_t sa_family = sk->sk_family; if (sa_family == AF_INET) udp_del_offload(&gs->udp_offloads); -#endif - -#endif } #if defined(HAVE_UDP_OFFLOAD) || \ diff --git a/datapath/linux/compat/include/net/protocol.h b/datapath/linux/compat/include/net/protocol.h new file mode 100644 index 0000000..0247a26 --- /dev/null +++ b/datapath/linux/compat/include/net/protocol.h @@ -0,0 +1,19 @@ +#ifndef _NET_PROTOCOL_WRAPPER_H +#define _NET_PROTOCOL_WRAPPER_H + +#include_next <net/protocol.h> + +#ifdef HAVE_UDP_OFFLOAD + +#ifndef HAVE_UDP_ADD_OFFLOAD_TAKES_NET +#define udp_add_offload(net, prot) udp_add_offload(prot) +#endif + +#else + +#define udp_add_offload(net, prot) 0 +#define udp_del_offload(prot) do {} while(0) + +#endif /* HAVE_UDP_OFFLOAD */ + +#endif /* _NET_PROTOCOL_WRAPPER_H */ -- 1.8.3.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev