Hi Brian, > > netif_rx_ni+0xe8/0x120 > > mwifiex_recv_packet+0xfc/0x10c [mwifiex] > > mwifiex_process_rx_packet+0x1d4/0x238 [mwifiex] > > mwifiex_11n_dispatch_pkt+0x190/0x1ac [mwifiex] > > mwifiex_11n_rx_reorder_pkt+0x28c/0x354 [mwifiex] > > TL;DR: the problem was right here ^^^ > where you started running mwifiex_11n_dispatch_pkt() (via > mwifiex_11n_scan_and_dispatch()) while holding a spinlock. > > When you do that, you eventually call netif_rx_ni(), which specifically defers > to softirq contexts. Then, if you happen to have your flush timer expiring > just > before that, you end up in mwifiex_flush_data(), which also needs that > spinlock.
Understood; Thanks for this detail; > > There are a few possible ways to handle this: > (a) prevent processing softirqs in that context; e.g., with > local_bh_disable(). This seems somewhat of a hack. > (Side note: I think most of the locks in this driver really could be > spin_lock_bh(), not spin_lock_irqsave() -- we don't really care > about hardirq context for 99% of these locks.) > (b) restructure so that packet processing (e.g., netif_rx_ni()) is done > outside of the spinlock. > > It's actually not that hard to do (b). You can just queue your skb's up in a > temporary sk_buff_head list and process them all at once after you've > finished processing the reorder table. I have a local patch to do this, and I > might send it your way if I can give it a bit more testing. OK; That will be good; We will run a complete test after the patch; (OR we can work on this, share for review); Regards, Ganapathi