misc: st_core: Do not call kfree_skb() under spin_lock_irqsave()
authorJinjie Ruan <ruanjinjie@huawei.com>
Wed, 23 Aug 2023 03:50:20 +0000 (11:50 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:52:10 +0000 (11:52 +0100)
[ Upstream commit 4d08c3d12b61022501989f9f071514d2d6f77c47 ]

It is not allowed to call kfree_skb() from hardware interrupt
context or with hardware interrupts being disabled.
So replace kfree_skb() with dev_kfree_skb_irq() under
spin_lock_irqsave(). Compile tested only.

Fixes: 53618cc1e51e ("Staging: sources for ST core")
Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
Link: https://lore.kernel.org/r/20230823035020.1281892-1-ruanjinjie@huawei.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/misc/ti-st/st_core.c

index 7f6976a..48e0f83 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/skbuff.h>
 
 #include <linux/ti_wilink_st.h>
+#include <linux/netdevice.h>
 
 extern void st_kim_recv(void *, const unsigned char *, long);
 void st_int_recv(void *, const unsigned char *, long);
@@ -435,7 +436,7 @@ static void st_int_enqueue(struct st_data_s *st_gdata, struct sk_buff *skb)
        case ST_LL_AWAKE_TO_ASLEEP:
                pr_err("ST LL is illegal state(%ld),"
                           "purging received skb.", st_ll_getstate(st_gdata));
-               kfree_skb(skb);
+               dev_kfree_skb_irq(skb);
                break;
        case ST_LL_ASLEEP:
                skb_queue_tail(&st_gdata->tx_waitq, skb);
@@ -444,7 +445,7 @@ static void st_int_enqueue(struct st_data_s *st_gdata, struct sk_buff *skb)
        default:
                pr_err("ST LL is illegal state(%ld),"
                           "purging received skb.", st_ll_getstate(st_gdata));
-               kfree_skb(skb);
+               dev_kfree_skb_irq(skb);
                break;
        }
 
@@ -498,7 +499,7 @@ void st_tx_wakeup(struct st_data_s *st_data)
                                spin_unlock_irqrestore(&st_data->lock, flags);
                                break;
                        }
-                       kfree_skb(skb);
+                       dev_kfree_skb_irq(skb);
                        spin_unlock_irqrestore(&st_data->lock, flags);
                }
                /* if wake-up is set in another context- restart sending */