Skip to content

Commit

Permalink
datapath: Enforce mutual exclusion between bridge and brcompat_mod.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Acked-by: Jesse Gross <[email protected]>
  • Loading branch information
blp committed Jan 17, 2012
1 parent aee9464 commit a647150
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 17 deletions.
11 changes: 10 additions & 1 deletion datapath/brcompat.c
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
22 changes: 21 additions & 1 deletion datapath/compat.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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 */
21 changes: 6 additions & 15 deletions datapath/vport-netdev.c
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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

0 comments on commit a647150

Please sign in to comment.