• Brian Norris's avatar
    mwifiex: dispatch/rotate from reorder table atomically · ce2e942e
    Brian Norris authored
    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@chromium.org
      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
    5188d545 ("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: default avatarBrian Norris <briannorris@chromium.org>
    Acked-by: default avatarGanapathi Bhat <gbhat@marvell.com>
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    ce2e942e
11n_rxreorder.c 28.2 KB