> -----Original Message----- > From: Yang Yingliang <yangyingliang@xxxxxxxxxx> > Sent: Tuesday, December 6, 2022 9:13 PM > To: Ping-Ke Shih <pkshih@xxxxxxxxxxx>; kvalo@xxxxxxxxxx > Cc: linux-wireless@xxxxxxxxxxxxxxx; yangyingliang@xxxxxxxxxx > Subject: [PATCH resend 1/3] rtlwifi: rtl8821ae: don't call kfree_skb() under spin_lock_irqsave() > > It is not allowed to call kfree_skb() from hardware interrupt > context or with interrupts being disabled. So add all skb to > a free list, then free them after spin_unlock_irqrestore() at > once. The patch doesn't change logic, so it should work. But, I would like to know if there is a comment about this in kernel code. Could you point it out? > > Fixes: 5c99f04fec93 ("rtlwifi: rtl8723be: Update driver to match Realtek release of 06/28/14") > Signed-off-by: Yang Yingliang <yangyingliang@xxxxxxxxxx> > --- > drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c > b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c > index 7e0f62d59fe1..a7e3250957dc 100644 > --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c > +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c > @@ -26,8 +26,10 @@ static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw) > struct rtl_priv *rtlpriv = rtl_priv(hw); > struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); > struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; > + struct sk_buff_head free_list; > unsigned long flags; > > + skb_queue_head_init(&free_list); > spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); > while (skb_queue_len(&ring->queue)) { > struct rtl_tx_desc *entry = &ring->desc[ring->idx]; > @@ -37,10 +39,12 @@ static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw) > rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry, > true, HW_DESC_TXBUFF_ADDR), > skb->len, DMA_TO_DEVICE); > - kfree_skb(skb); > + __skb_queue_tail(&free_list, skb); > ring->idx = (ring->idx + 1) % ring->entries; > } > spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); > + > + __skb_queue_purge(&free_list); > } > > static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw, > -- > 2.25.1 > > > ------Please consider the environment before printing this e-mail.