Message ID | 20200927194922.339094192@linutronix.de |
---|---|
State | New |
Headers | show |
Series | net: in_interrupt() cleanup and fixes | expand |
On 9/27/2020 9:49 PM, Thomas Gleixner wrote: > From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > > The usage of in_interrupt() in non-core code is phased out. Ideally the > information of the calling context should be passed by the callers or the > functions be split as appropriate. > > brcmfmac uses in_interupt() to select the netif_rx*() variant which matches > the calling context. The attempt to consolidate the code by passing an > arguemnt or by distangling it failed due lack of knowledge about this > driver and because the call chains are convoluted and hard to follow. I think it is only for USB devices that the function can be called in "interrupt" context. PCIe devices call it from thread context for sure. The function brcmf_netif_rx() is (in)directly called by brcmf_rx_frame(), which is used by SDIO and USB. Anyway, it will be a bit more work, but doable. Let me see what I can come up with. Regards, Arend
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c @@ -418,14 +418,7 @@ void brcmf_netif_rx(struct brcmf_if *ifp ifp->ndev->stats.rx_packets++; brcmf_dbg(DATA, "rx proto=0x%X\n", ntohs(skb->protocol)); - if (in_interrupt()) - netif_rx(skb); - else - /* If the receive is not processed inside an ISR, - * the softirqd must be woken explicitly to service - * the NET_RX_SOFTIRQ. This is handled by netif_rx_ni(). - */ - netif_rx_ni(skb); + netif_rx_any_context(skb); } void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb)