Is possible that we stop queue and then do not wake up it again, especially when packets are transmitted fast. That can be easily reproduced with modified tx queue entry_num to some small value e.g. 16. If mac80211 already hold local->queue_stop_reason_lock, then we can wait on that lock in both rt2x00queue_pause_queue() and rt2x00queue_unpause_queue(). After drooping ->queue_stop_reason_lock is possible that __ieee80211_wake_queue() will be performed before __ieee80211_stop_queue(), hence we stop queue and newer wake up it again. Another race condition is possible when between rt2x00queue_threshold() check and rt2x00queue_pause_queue() we will process all pending tx buffers on different cpu. This might happen if for example interrupt will be triggered on cpu performing rt2x00mac_tx(). To prevent race conditions serialize pause/unpause by queue->tx_lock. Cc: stable@vger.kernel.org Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Acked-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com> |
||
|---|---|---|
| .. | ||
| ath | ||
| b43 | ||
| b43legacy | ||
| brcm80211 | ||
| hostap | ||
| ipw2x00 | ||
| iwlegacy | ||
| iwlwifi | ||
| iwmc3200wifi | ||
| libertas | ||
| libertas_tf | ||
| mwifiex | ||
| orinoco | ||
| p54 | ||
| prism54 | ||
| rt2x00 | ||
| rtl818x | ||
| rtlwifi | ||
| wl12xx | ||
| wl1251 | ||
| zd1211rw | ||
| adm8211.c | ||
| adm8211.h | ||
| airo.c | ||
| airo.h | ||
| airo_cs.c | ||
| at76c50x-usb.c | ||
| at76c50x-usb.h | ||
| atmel.c | ||
| atmel.h | ||
| atmel_cs.c | ||
| atmel_pci.c | ||
| Kconfig | ||
| mac80211_hwsim.c | ||
| mac80211_hwsim.h | ||
| Makefile | ||
| mwl8k.c | ||
| ray_cs.c | ||
| ray_cs.h | ||
| rayctl.h | ||
| rndis_wlan.c | ||
| wl3501.h | ||
| wl3501_cs.c | ||
| zd1201.c | ||
| zd1201.h | ||