[ovs-dev] [PATCH 2/3] datapath: compat: geneve: fix geneve_notify_add_rx_port()

Pravin B Shelar pshelar at ovn.org
Wed Aug 10 17:34:37 UTC 2016


Remove mutual exclusion between udp-gro registration and geneve receive port
registration.

Signed-off-by: Pravin B Shelar <pshelar at 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




More information about the dev mailing list