diff options
author | Ben Pfaff <blp@nicira.com> | 2012-01-17 11:15:49 -0800 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2012-01-17 11:15:49 -0800 |
commit | a647150f01cf09eddc6d28bfec88b1bb8bab30df (patch) | |
tree | bfc6819153995b156f9c05c7229da36bf8ff0686 /datapath | |
parent | aee9464d36bfd326c3ddfd12e7fa732bf72557e9 (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.c | 11 | ||||
-rw-r--r-- | datapath/compat.h | 22 | ||||
-rw-r--r-- | datapath/vport-netdev.c | 21 |
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 |