linux/drivers/net/wireless
David Kilroy 20953ad68e orinoco: take the driver lock in the rx tasklet
Fix the warning reproduced below.

We add to rx_list in interrupt context and remove elements in tasklet
context. While removing elements we need to prevent the interrupt
modifying the list.

Note that "orinoco: Process bulk of receive interrupt in a tasklet" did not
preserve locking semantics on what is now orinoco_rx.

This patch reinstates the locking semantics and ensures it covers
rx_list as well. This leads to additional cleanup required in
free_orinocodev.

[89479.105038] WARNING: at lib/list_debug.c:30 __list_add+0x8f/0xa0()
[89479.105058] list_add corruption. prev->next should be next (dddb3568), but was cbc28978. (prev=dddb3568).
[89479.106002] Pid: 15746, comm: X Not tainted 2.6.28-1avb #26
[89479.106020] Call Trace:
[89479.106062]  [<c011d3b0>] warn_slowpath+0x60/0x80
[89479.106104]  [<c01073d0>] ? native_sched_clock+0x20/0x70
[89479.106194]  [<c013d825>] ? lock_release_holdtime+0x35/0x200
[89479.106218]  [<c018d9f0>] ? __slab_alloc+0x550/0x560
[89479.106254]  [<c02f9c9d>] ? _spin_unlock+0x1d/0x20
[89479.106270]  [<c018d9f0>] ? __slab_alloc+0x550/0x560
[89479.106302]  [<c01ff2a7>] ? delay_tsc+0x17/0x24
[89479.106319]  [<c01ff221>] ? __const_udelay+0x21/0x30
[89479.106376]  [<dfa8b1e2>] ? hermes_bap_seek+0x112/0x1e0 [hermes]
[89479.106396]  [<c013d7eb>] ? trace_hardirqs_off+0xb/0x10
[89479.106418]  [<c018e307>] ? __kmalloc_track_caller+0xb7/0x110
[89479.106448]  [<c028eefc>] ? dev_alloc_skb+0x1c/0x30
[89479.106465]  [<c028eefc>] ? dev_alloc_skb+0x1c/0x30
[89479.106482]  [<c020e13f>] __list_add+0x8f/0xa0
[89479.106551]  [<dfd0fcae>] orinoco_interrupt+0xcae/0x16c0 [orinoco]
[89479.106574]  [<c013b0e3>] ? tick_dev_program_event+0x33/0xb0
[89479.106594]  [<c01073d0>] ? native_sched_clock+0x20/0x70
[89479.106613]  [<c013d825>] ? lock_release_holdtime+0x35/0x200
[89479.106662]  [<c013d7eb>] ? trace_hardirqs_off+0xb/0x10
[89479.106892]  [<dfe7faa7>] ? usb_hcd_irq+0x97/0xa0 [usbcore]
[89479.106926]  [<c015ba79>] handle_IRQ_event+0x29/0x60
[89479.106947]  [<c015cf89>] handle_level_irq+0x69/0xe0
[89479.106963]  [<c015cf20>] ? handle_level_irq+0x0/0xe0
[89479.106977]  <IRQ>  [<c02ca933>] ? tcp_v4_rcv+0x633/0x6e0
[89479.107025]  [<c0103f0c>] ? common_interrupt+0x28/0x30
[89479.107057]  [<c02a0000>] ? sk_run_filter+0x320/0x7a0
[89479.107078]  [<c020e041>] ? list_del+0x21/0x90
[89479.107106]  [<dfd0d24e>] ? orinoco_rx_isr_tasklet+0x2ce/0x480 [orinoco]
[89479.107131]  [<c01402e0>] ? __lock_acquire+0x160/0x1650
[89479.107151]  [<c01073d0>] ? native_sched_clock+0x20/0x70
[89479.107169]  [<c013d825>] ? lock_release_holdtime+0x35/0x200
[89479.107200]  [<c012249a>] ? irq_enter+0xa/0x60
[89479.107217]  [<c0104e52>] ? do_IRQ+0xd2/0x130
[89479.107518]  [<c010342c>] ? restore_nocheck_notrace+0x0/0xe
[89479.107542]  [<c0122830>] ? __do_softirq+0x0/0x110
[89479.107561]  [<c013f7b4>] ? trace_hardirqs_on_caller+0x74/0x140
[89479.107583]  [<c01ff678>] ? trace_hardirqs_on_thunk+0xc/0x10
[89479.107602]  [<c0122087>] ? tasklet_action+0x27/0x90
[89479.107620]  [<c013f7b4>] ? trace_hardirqs_on_caller+0x74/0x140
[89479.107638]  [<c01220a3>] ? tasklet_action+0x43/0x90
[89479.107655]  [<c012289f>] ? __do_softirq+0x6f/0x110
[89479.107674]  [<c0122830>] ? __do_softirq+0x0/0x110
[89479.107685]  <IRQ>  [<c015cf20>] ? handle_level_irq+0x0/0xe0
[89479.107715]  [<c012246d>] ? irq_exit+0x5d/0x80
[89479.107732]  [<c0104e52>] ? do_IRQ+0xd2/0x130
[89479.107747]  [<c0103337>] ? sysenter_exit+0xf/0x16
[89479.107765]  [<c013f83d>] ? trace_hardirqs_on_caller+0xfd/0x140
[89479.107782]  [<c0103f0c>] ? common_interrupt+0x28/0x30
[89479.107797] ---[ end trace a1fc0a52df4a729d ]---

Reported-by: Andrey Borzenkov <arvidjaar@mail.ru>
Signed-off-by: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-01-12 14:24:51 -05:00
..
ath5k fix similar typos to successfull 2009-01-08 08:31:15 -08:00
ath9k ath9k: Enforce module build if rfkill is a module 2009-01-12 14:24:50 -05:00
b43 drivers/net/wireless/b43: fix sparse warnings: make symbols static 2008-12-26 00:13:46 -08:00
b43legacy b43legacy: Fix sparse warnings 2008-12-12 14:02:08 -05:00
hostap hostap: select required crypto bits in Kconfig 2008-12-05 09:32:10 -05:00
ipw2x00 trivial: Fix misspelling of "firmware" in ipw2100.c 2009-01-06 11:28:08 +01:00
iwlwifi iwlwifi: iwl-tx.c cleanup (remove unused parameter and unused local variable). 2008-12-19 15:23:54 -05:00
libertas drivers/net/wireless/libertas: move a dereference below a NULL test 2009-01-11 00:06:35 -08:00
libertas_tf libertas_tf: fix skb tail pointer 2008-11-18 17:26:26 -05:00
orinoco orinoco: take the driver lock in the rx tasklet 2009-01-12 14:24:51 -05:00
p54 p54usb: Add USB ID for Thomson Speedtouch 121g 2009-01-12 14:24:50 -05:00
prism54 drivers/net/wireless/prism54: fix sparse warnings: make symbols static 2008-12-26 00:15:03 -08:00
rt2x00 rt2x00: Fix TX short preamble detection 2009-01-12 14:24:50 -05:00
rtl818x rtl8187: Fix crash on unload when using SLUB debug 2008-12-19 15:23:20 -05:00
zd1211rw fix similar typos to successfull 2009-01-08 08:31:15 -08:00
adm8211.c adm8211: remove SSID code 2008-11-10 15:11:56 -05:00
adm8211.h adm8211: remove SSID code 2008-11-10 15:11:56 -05:00
airo_cs.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 2008-10-13 14:12:40 -07:00
airo.c drivers/net/wireless: fix sparse warnings: make symbols static 2008-12-26 00:12:59 -08:00
airo.h
arlan-main.c drivers/net: Kill now superfluous ->last_rx stores. 2008-11-03 21:11:17 -08:00
arlan-proc.c
arlan.h
atmel_cs.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6 2008-10-13 14:12:40 -07:00
atmel_pci.c
atmel.c trivial: Fix misspelling of "firmware" in atmel.c 2009-01-06 11:28:08 +01:00
atmel.h
i82586.h
i82593.h
Kconfig Wireless: Fix Kconfig fact error 2009-01-12 14:24:49 -05:00
mac80211_hwsim.c mac80211: Fix HT channel selection 2008-12-19 15:22:54 -05:00
Makefile ipw2x00: relocate ipw2100/ipw2200 to common directory 2008-11-21 11:08:17 -05:00
netwave_cs.c drivers/net: Kill now superfluous ->last_rx stores. 2008-11-03 21:11:17 -08:00
ray_cs.c drivers/net/wireless: fix sparse warnings: make symbols static 2008-12-26 00:12:59 -08:00
ray_cs.h
rayctl.h
rndis_wlan.c netdevice: safe convert to netdev_priv() #part-4 2008-11-12 23:39:10 -08:00
strip.c trivial: fix then -> than typos in comments and documentation 2009-01-06 11:28:06 +01:00
wavelan_cs.c drivers/net: Kill now superfluous ->last_rx stores. 2008-11-03 21:11:17 -08:00
wavelan_cs.h
wavelan_cs.p.h
wavelan.c netdevice: safe convert to netdev_priv() #part-4 2008-11-12 23:39:10 -08:00
wavelan.h
wavelan.p.h net: Rationalise email address: Network Specific Parts 2008-10-13 19:01:08 -07:00
wl3501_cs.c drivers/net: Kill now superfluous ->last_rx stores. 2008-11-03 21:11:17 -08:00
wl3501.h don't use net/ieee80211.h 2008-11-10 15:11:56 -05:00
zd1201.c netdevice zd1201: Use after free 2008-12-18 22:27:38 -08:00
zd1201.h