aboutsummaryrefslogtreecommitdiff
path: root/datapath
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2012-01-17 11:15:49 -0800
committerBen Pfaff <blp@nicira.com>2012-01-17 11:15:49 -0800
commita647150f01cf09eddc6d28bfec88b1bb8bab30df (patch)
treebfc6819153995b156f9c05c7229da36bf8ff0686 /datapath
parentaee9464d36bfd326c3ddfd12e7fa732bf72557e9 (diff)
datapath: Enforce mutual exclusion between bridge and brcompat_mod.
In kernels 2.6.36, Open vSwitch can (and does) safely coexist with the Linux bridge module, but it does not make sense to load both bridge and brcompat_mod at the same time. Until now, nothing has prevented both from loading; when they both load, confusion (at best) results. This fixes the problem by enforcing mutual exclusion. Bug #9226. Launchpad bug #917309. Reported-by: Rogério Vinhal Nunes Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jesse Gross <jesse@nicira.com>
Diffstat (limited to 'datapath')
-rw-r--r--datapath/brcompat.c11
-rw-r--r--datapath/compat.h22
-rw-r--r--datapath/vport-netdev.c21
3 files changed, 37 insertions, 17 deletions
diff --git a/datapath/brcompat.c b/datapath/brcompat.c
index 10a75ece..339b5dcf 100644
--- a/datapath/brcompat.c
+++ b/datapath/brcompat.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007-2011 Nicira Networks.
+ * Copyright (c) 2007-2012 Nicira Networks.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
@@ -560,3 +560,12 @@ module_exit(brc_cleanup);
MODULE_DESCRIPTION("Open vSwitch bridge compatibility");
MODULE_AUTHOR("Nicira Networks");
MODULE_LICENSE("GPL");
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
+/*
+ * In kernels 2.6.36 and later, Open vSwitch can safely coexist with
+ * the Linux bridge module, but it does not make sense to load both bridge and
+ * brcompat_mod, so this prevents it.
+ */
+BRIDGE_MUTUAL_EXCLUSION;
+#endif
diff --git a/datapath/compat.h b/datapath/compat.h
index efad6a09..36d00258 100644
--- a/datapath/compat.h
+++ b/datapath/compat.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007-2011 Nicira Networks.
+ * Copyright (c) 2007-2012 Nicira Networks.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
@@ -53,4 +53,24 @@ static inline void skb_clear_rxhash(struct sk_buff *skb)
#endif
}
+/*
+ * Enforces, mutual exclusion with the Linux bridge module, by declaring and
+ * exporting br_should_route_hook. Because the bridge module also exports the
+ * same symbol, the module loader will refuse to load both modules at the same
+ * time (e.g. "bridge: exports duplicate symbol br_should_route_hook (owned by
+ * openvswitch_mod)").
+ *
+ * Before Linux 2.6.36, Open vSwitch cannot safely coexist with the Linux
+ * bridge module, so openvswitch_mod uses this macro in those versions. In
+ * Linux 2.6.36 and later, Open vSwitch can coexist with the bridge module, but
+ * it makes no sense to load both bridge and brcompat_mod, so brcompat_mod uses
+ * this macro in those versions.
+ *
+ * The use of "typeof" here avoids the need to track changes in the type of
+ * br_should_route_hook over various kernel versions.
+ */
+#define BRIDGE_MUTUAL_EXCLUSION \
+ typeof(br_should_route_hook) br_should_route_hook; \
+ EXPORT_SYMBOL(br_should_route_hook)
+
#endif /* compat.h */
diff --git a/datapath/vport-netdev.c b/datapath/vport-netdev.c
index 07c7abdb..4cca7fe8 100644
--- a/datapath/vport-netdev.c
+++ b/datapath/vport-netdev.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007-2011 Nicira Networks.
+ * Copyright (c) 2007-2012 Nicira Networks.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
@@ -420,19 +420,10 @@ const struct vport_ops ovs_netdev_vport_ops = {
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36)
/*
- * In kernels earlier than 2.6.36, Open vSwitch cannot safely coexist with
- * the Linux bridge module on any released version of Linux, because there
- * is only a single bridge hook function and only a single br_port member
- * in struct net_device.
- *
- * Declaring and exporting this symbol enforces mutual exclusion. The bridge
- * module also exports the same symbol, so the module loader will refuse to
- * load both modules at the same time (e.g. "bridge: exports duplicate symbol
- * br_should_route_hook (owned by openvswitch_mod)").
- *
- * The use of "typeof" here avoids the need to track changes in the type of
- * br_should_route_hook over various kernel versions.
+ * In kernels earlier than 2.6.36, Open vSwitch cannot safely coexist with the
+ * Linux bridge module, because there is only a single bridge hook function and
+ * only a single br_port member in struct net_device, so this prevents loading
+ * both bridge and openvswitch_mod at the same time.
*/
-typeof(br_should_route_hook) br_should_route_hook;
-EXPORT_SYMBOL(br_should_route_hook);
+BRIDGE_MUTUAL_EXCLUSION;
#endif