linux-uconsole/drivers/atm
David Woodhouse 0d2952b49b solos-pci: Fix race condition in tasklet RX handling
commit 1f6ea6e511 upstream.

We were seeing faults in the solos-pci receive tasklet when packets
arrived for a VCC which was currently being closed:

[18842.727906] EIP: [<e082f490>] br2684_push+0x19/0x234 [br2684] SS:ESP 0068:dfb89d14

[18845.090712] [<c13ecff3>] ? do_page_fault+0x0/0x2e1
[18845.120042] [<e082f490>] ? br2684_push+0x19/0x234 [br2684]
[18845.153530] [<e084fa13>] solos_bh+0x28b/0x7c8 [solos_pci]
[18845.186488] [<e084f711>] ? solos_irq+0x2d/0x51 [solos_pci]
[18845.219960] [<c100387b>] ? handle_irq+0x3b/0x48
[18845.247732] [<c10265cb>] ? irq_exit+0x34/0x57
[18845.274437] [<c1025720>] tasklet_action+0x42/0x69
[18845.303247] [<c102643f>] __do_softirq+0x8e/0x129
[18845.331540] [<c10264ff>] do_softirq+0x25/0x2a
[18845.358274] [<c102664c>] _local_bh_enable_ip+0x5e/0x6a
[18845.389677] [<c102666d>] local_bh_enable+0xb/0xe
[18845.417944] [<e08490a8>] ppp_unregister_channel+0x32/0xbb [ppp_generic]
[18845.458193] [<e08731ad>] pppox_unbind_sock+0x18/0x1f [pppox]

This patch uses an RCU-inspired approach to fix it. In the RX tasklet's
find_vcc() function we first refuse to use a VCC which already has the
ATM_VF_READY bit cleared. And in the VCC close function, we synchronise
with the tasklet to ensure that it can't still be using the VCC before
we continue and allow the VCC to be destroyed.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Tested-by: Nathan Williams <nathan@traverse.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2010-08-13 13:19:34 -07:00
..
.gitignore
adummy.c removed unused #include <linux/version.h>'s 2008-08-23 12:14:12 -07:00
ambassador.c net: Make setsockopt() optlen be unsigned. 2009-09-30 16:12:20 -07:00
ambassador.h firmware: convert Ambassador ATM driver to request_firmware() 2008-07-10 14:49:39 +01:00
atmtcp.c [NET]: SPIN_LOCK_UNLOCKED cleanup in drivers/atm, net 2007-04-26 01:37:44 -07:00
eni.c net: Make setsockopt() optlen be unsigned. 2009-09-30 16:12:20 -07:00
eni.h drivers/atm/eni.h: remove unused macro KERNEL_OFFSET 2008-06-10 12:46:52 -07:00
firestream.c net: Make setsockopt() optlen be unsigned. 2009-09-30 16:12:20 -07:00
firestream.h
fore200e.c net: Make setsockopt() optlen be unsigned. 2009-09-30 16:12:20 -07:00
fore200e.h fore200e: Convert over to pure OF driver. 2008-08-29 02:14:59 -07:00
he.c atm: dereference of he_dev->rbps_virt in he_init_group() 2009-09-28 12:45:29 -07:00
he.h atm: [he] remove #ifdef clutter 2008-06-17 16:21:44 -07:00
horizon.c net: Make setsockopt() optlen be unsigned. 2009-09-30 16:12:20 -07:00
horizon.h long vs. unsigned long - low-hanging fruits in drivers 2007-10-14 12:41:51 -07:00
idt77105.c [ATM] atm/idt77105.c: Fix section mismatch. 2008-01-20 20:31:43 -08:00
idt77105.h
idt77252.c atm: idt77252: Use generic SKB queue management instead of home-grown scheme. 2008-09-21 21:38:26 -07:00
idt77252.h atm: idt77252: Use generic SKB queue management instead of home-grown scheme. 2008-09-21 21:38:26 -07:00
idt77252_tables.h
iphase.c net: Make setsockopt() optlen be unsigned. 2009-09-30 16:12:20 -07:00
iphase.h iphase: Fix 64bit warning. 2008-05-14 23:28:47 -07:00
Kconfig atm: Driver for Solos PCI ADSL2+ card. 2008-12-26 01:26:11 -08:00
lanai.c dma-mapping: replace all DMA_32BIT_MASK macro with DMA_BIT_MASK(32) 2009-04-07 08:31:11 -07:00
Makefile atm: Driver for Solos PCI ADSL2+ card. 2008-12-26 01:26:11 -08:00
midway.h
nicstar.c drivers: atm, char fix integer as NULL pointer warnings 2008-04-28 17:29:18 -07:00
nicstar.h atm nicstar: Removal of debug code containing deprecated calls to cli()/sti() 2008-04-19 18:10:46 -07:00
nicstarmac.c [ATM]: [nicstar] Replace C code with call to ARRAY_SIZE() macro. 2007-07-18 01:46:53 -07:00
nicstarmac.copyright drivers/atm/: remove CVS keywords 2008-05-20 14:52:25 -07:00
solos-attrlist.c solos: Show Interleaving details for ADSL2 and 2+ 2009-05-07 19:49:44 +01:00
solos-pci.c solos-pci: Fix race condition in tasklet RX handling 2010-08-13 13:19:34 -07:00
suni.c atm: [suni] add support for setting loopback and framing modes 2008-06-17 16:19:24 -07:00
suni.h atm: [suni] add support for setting loopback and framing modes 2008-06-17 16:19:24 -07:00
tonga.h
uPD98401.h
uPD98402.c
uPD98402.h
zatm.c net: Make setsockopt() optlen be unsigned. 2009-09-30 16:12:20 -07:00
zatm.h
zeprom.h