[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