69 lines
2.2 KiB
Diff
69 lines
2.2 KiB
Diff
From 22bc38b1ea127f19276e188f6dbcd15ff774b583 Mon Sep 17 00:00:00 2001
|
|
From: Cunhao Lu <1579567540@qq.com>
|
|
Date: Fri, 31 Jul 2026 17:14:24 +0800
|
|
Subject: [PATCH 1/3] can: skb: make echo skb freeing safe in any IRQ context
|
|
|
|
can_put_echo_skb() can be called with hardware interrupts disabled. Its
|
|
direct drop paths use kfree_skb(), while can_create_echo_skb() uses
|
|
kfree_skb() when cloning fails and consume_skb() after a successful clone.
|
|
None of these helpers is safe in every IRQ context.
|
|
|
|
Use dev_kfree_skb_any() for all drop paths and dev_consume_skb_any() when
|
|
consuming a successfully cloned skb. This preserves the respective skb drop
|
|
and consumed semantics regardless of the caller IRQ context.
|
|
|
|
Signed-off-by: Cunhao Lu <1579567540@qq.com>
|
|
---
|
|
Changes in v3:
|
|
- Cover can_create_echo_skb() clone failure and successful-clone consume
|
|
paths with IRQ-context-independent helpers.
|
|
---
|
|
drivers/net/can/dev/skb.c | 4 ++--
|
|
include/linux/can/skb.h | 4 ++--
|
|
2 files changed, 4 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/net/can/dev/skb.c b/drivers/net/can/dev/skb.c
|
|
index 95fcdc1026f8..d7b5a5d17ff2 100644
|
|
--- a/drivers/net/can/dev/skb.c
|
|
+++ b/drivers/net/can/dev/skb.c
|
|
@@ -62,7 +62,7 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
|
|
(skb->protocol != htons(ETH_P_CAN) &&
|
|
skb->protocol != htons(ETH_P_CANFD) &&
|
|
skb->protocol != htons(ETH_P_CANXL))) {
|
|
- kfree_skb(skb);
|
|
+ dev_kfree_skb_any(skb);
|
|
return 0;
|
|
}
|
|
|
|
@@ -90,7 +90,7 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
|
|
} else {
|
|
/* locking problem with netif_stop_queue() ?? */
|
|
netdev_err(dev, "%s: BUG! echo_skb %d is occupied!\n", __func__, idx);
|
|
- kfree_skb(skb);
|
|
+ dev_kfree_skb_any(skb);
|
|
return -EBUSY;
|
|
}
|
|
|
|
diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h
|
|
index a70a02967071..78c5870e2f9a 100644
|
|
--- a/include/linux/can/skb.h
|
|
+++ b/include/linux/can/skb.h
|
|
@@ -76,12 +76,12 @@ static inline struct sk_buff *can_create_echo_skb(struct sk_buff *skb)
|
|
|
|
nskb = skb_clone(skb, GFP_ATOMIC);
|
|
if (unlikely(!nskb)) {
|
|
- kfree_skb(skb);
|
|
+ dev_kfree_skb_any(skb);
|
|
return NULL;
|
|
}
|
|
|
|
can_skb_set_owner(nskb, skb->sk);
|
|
- consume_skb(skb);
|
|
+ dev_consume_skb_any(skb);
|
|
return nskb;
|
|
}
|
|
|
|
--
|
|
2.34.1
|
|
|