It is not allowed to call kfree_skb() from hardware interrupt context or with hardware interrupts being disabled. All the SKBs have been dequeued from the old queue, so it's safe to enqueue these SKBs to a free queue, then free them after spin_unlock_irqrestore() at once. Compile tested only. Fixes: 94a799425eee ("From: wlanfae <wlanfae@xxxxxxxxxxx> [PATCH 1/8] rtl8192e: Import new version of driver from realtek") Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx> --- drivers/staging/rtl8192e/rtllib_softmac.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/staging/rtl8192e/rtllib_softmac.c b/drivers/staging/rtl8192e/rtllib_softmac.c index 0e52b207942d..398fb354d342 100644 --- a/drivers/staging/rtl8192e/rtllib_softmac.c +++ b/drivers/staging/rtl8192e/rtllib_softmac.c @@ -2353,8 +2353,10 @@ void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee) unsigned long flags; int i; struct cb_desc *tcb_desc = NULL; + struct sk_buff_head free_list; unsigned long queue_len = 0; + skb_queue_head_init(&free_list); spin_lock_irqsave(&ieee->lock, flags); /* called with 2nd parm 0, no tx mgmt lock required */ @@ -2382,7 +2384,7 @@ void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee) skb_queue_tail(&ieee->skb_waitQ[queue_index], txb->fragments[i]); else - kfree_skb(txb->fragments[i]); + __skb_queue_tail(&free_list, txb->fragments[i]); } else { ieee->softmac_data_hard_start_xmit( txb->fragments[i], @@ -2393,6 +2395,8 @@ void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee) rtllib_txb_free(txb); spin_unlock_irqrestore(&ieee->lock, flags); + + __skb_queue_purge(&free_list); } void rtllib_reset_queue(struct rtllib_device *ieee) -- 2.34.1