linux/drivers/net
Jay Vosburgh e6d265e850 bonding: eliminate bond_close race conditions
This patch resolves two sets of race conditions.

	Mitsuo Hayasaka <mitsuo.hayasaka.hu@hitachi.com> reported the
first, as follows:

The bond_close() calls cancel_delayed_work() to cancel delayed works.
It, however, cannot cancel works that were already queued in workqueue.
The bond_open() initializes work->data, and proccess_one_work() refers
get_work_cwq(work)->wq->flags. The get_work_cwq() returns NULL when
work->data has been initialized. Thus, a panic occurs.

	He included a patch that converted the cancel_delayed_work calls
in bond_close to flush_delayed_work_sync, which eliminated the above
problem.

	His patch is incorporated, at least in principle, into this
patch.  In this patch, we use cancel_delayed_work_sync in place of
flush_delayed_work_sync, and also convert bond_uninit in addition to
bond_close.

	This conversion to _sync, however, opens new races between
bond_close and three periodically executing workqueue functions:
bond_mii_monitor, bond_alb_monitor and bond_activebackup_arp_mon.

	The race occurs because bond_close and bond_uninit are always
called with RTNL held, and these workqueue functions may acquire RTNL to
perform failover-related activities.  If bond_close or bond_uninit is
waiting in cancel_delayed_work_sync, deadlock occurs.

	These deadlocks are resolved by having the workqueue functions
acquire RTNL conditionally.  If the rtnl_trylock() fails, the functions
reschedule and return immediately.  For the cases that are attempting to
perform link failover, a delay of 1 is used; for the other cases, the
normal interval is used (as those activities are not as time critical).

	Additionally, the bond_mii_monitor function now stores the delay
in a variable (mimicing the structure of activebackup_arp_mon).

	Lastly, all of the above renders the kill_timers sentinel moot,
and therefore it has been removed.

Tested-by: Mitsuo Hayasaka <mitsuo.hayasaka.hu@hitachi.com>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2011-10-30 03:13:14 -04:00
..
appletalk
arcnet drivers/net: Kconfig & Makefile cleanup 2011-08-27 00:58:49 -07:00
bonding bonding: eliminate bond_close race conditions 2011-10-30 03:13:14 -04:00
caif caif-hsi: Added recovery check of CA wake status. 2011-10-19 03:25:43 -04:00
can Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2011-10-25 13:25:22 +02:00
cris
ethernet qlcnic: fix beacon and LED test. 2011-10-30 03:09:41 -04:00
fddi skfp: Fix SysKonnect FDDI driver compile issues 2011-08-27 00:58:23 -07:00
hamradio
hippi hippi: Move the HIPPI driver 2011-08-27 00:58:30 -07:00
irda Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2011-10-25 13:25:22 +02:00
phy Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next 2011-10-25 13:25:22 +02:00
plip plip: Move the PLIP driver 2011-08-27 00:58:33 -07:00
ppp Merge branch 'master' of ra.kernel.org:/pub/scm/linux/kernel/git/davem/net 2011-10-24 18:18:09 -04:00
slip slip: Move the SLIP drivers 2011-08-27 00:58:36 -07:00
tokenring drivers/net: Kconfig & Makefile cleanup 2011-08-27 00:58:49 -07:00
usb Merge branch 'pm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm 2011-10-25 15:18:39 +02:00
vmxnet3 net: add skb frag size accessors 2011-10-19 03:10:46 -04:00
wan wan: make LAPB callbacks const 2011-09-16 19:20:20 -04:00
wimax
wireless Merge branch 'pm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm 2011-10-25 15:18:39 +02:00
xen-netback net: add skb frag size accessors 2011-10-19 03:10:46 -04:00
dummy.c
eql.c
ifb.c
Kconfig Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2011-10-25 12:11:02 +02:00
LICENSE.SRC
loopback.c
macvlan.c macvlan: handle fragmented multicast frames 2011-10-18 23:22:07 -04:00
macvtap.c macvtap: Fix the minor device number allocation 2011-10-21 02:53:07 -04:00
Makefile net: Fix duplicate CONFIG_SLIP entry in driver/net/Makefile 2011-08-29 22:55:53 -04:00
mdio.c
mii.c
netconsole.c netconsole: enable netconsole can make net_device refcnt incorrent 2011-10-18 23:55:29 -04:00
rionet.c rapidio: fix use of non-compatible registers 2011-08-25 16:25:34 -07:00
sb1000.c
Space.c
sungem_phy.c
tun.c
veth.c
virtio_net.c Add ethtool -g support to virtio_net 2011-10-24 02:07:21 -04:00
xen-netfront.c net: add skb frag size accessors 2011-10-19 03:10:46 -04:00