Brian Norris <briannorris@xxxxxxxxxxxx> wrote: > mwifiex_11n_scan_and_dispatch() and > mwifiex_11n_dispatch_pkt_until_start_win() share similar patterns, where > they perform a few different actions on the same table, using the same > lock, but non-atomically. There have been other attempts to clean up > this sort of behavior, but they have had problems (incomplete; > introducing new deadlocks). > > We can improve these functions' atomicity by queueing up our RX packets > in a list, to dispatch at the end of the function. This avoids problems > of another operation modifying the table in between our dispatch and > rotation operations. > > This was inspired by investigations around this: > > http://lkml.kernel.org/linux-wireless/20181130175957.167031-1-briannorris@xxxxxxxxxxxx > Subject: [4.20 PATCH] Revert "mwifiex: restructure rx_reorder_tbl_lock usage" > > While the original (now-reverted) patch had good intentions in > restructuring some of the locking patterns in this driver, it missed an > important detail: we cannot defer to softirq contexts while already in > an atomic context. We can help avoid this sort of problem by separating > the two steps of: > (1) iterating / clearing the mwifiex reordering table > (2) dispatching received packets to upper layers > > This makes it much harder to make lock recursion mistakes, as these > two steps no longer need to hold the same locks. > > Testing: I've played with a variety of stress tests, including download > stress tests on the same APs which caught regressions with commit > 5188d5453bc9 ("mwifiex: restructure rx_reorder_tbl_lock usage"). I've > primarily tested on Marvell 8997 / PCIe, although I've given 8897 / SDIO > a quick spin as well. > > Signed-off-by: Brian Norris <briannorris@xxxxxxxxxxxx> > Acked-by: Ganapathi Bhat <gbhat@xxxxxxxxxxx> 2 patches applied to wireless-drivers-next.git, thanks. ce2e942e32e8 mwifiex: dispatch/rotate from reorder table atomically 8a7f9fd8a3e0 mwifiex: don't disable hardirqs; just softirqs -- https://patchwork.kernel.org/patch/11016151/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches