Skip to content

Commit 69ded34

Browse files
jhsmtopsiff
authored andcommitted
net, sched: Fix SKB_NOT_DROPPED_YET splat under debug config
mainline inclusion from mainline-v6.7-rc1 category: bugfix Getting the following splat [1] with CONFIG_DEBUG_NET=y and this reproducer [2]. Problem seems to be that classifiers clear 'struct tcf_result::drop_reason', thereby triggering the warning in __kfree_skb_reason() due to reason being 'SKB_NOT_DROPPED_YET' (0). Fixed by disambiguating a legit error from a verdict with a bogus drop_reason [1] WARNING: CPU: 0 PID: 181 at net/core/skbuff.c:1082 kfree_skb_reason+0x38/0x130 Modules linked in: CPU: 0 PID: 181 Comm: mausezahn Not tainted 6.6.0-rc6-custom-ge43e6d9582e0 deepin-community#682 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014 RIP: 0010:kfree_skb_reason+0x38/0x130 [...] Call Trace: <IRQ> __netif_receive_skb_core.constprop.0+0x837/0xdb0 __netif_receive_skb_one_core+0x3c/0x70 process_backlog+0x95/0x130 __napi_poll+0x25/0x1b0 net_rx_action+0x29b/0x310 __do_softirq+0xc0/0x29b do_softirq+0x43/0x60 </IRQ> [2] ip link add name veth0 type veth peer name veth1 ip link set dev veth0 up ip link set dev veth1 up tc qdisc add dev veth1 clsact tc filter add dev veth1 ingress pref 1 proto all flower dst_mac 00:11:22:33:44:55 action drop mausezahn veth0 -a own -b 00:11:22:33:44:55 -q -c 1 Ido reported: [...] getting the following splat [1] with CONFIG_DEBUG_NET=y and this reproducer [2]. Problem seems to be that classifiers clear 'struct tcf_result::drop_reason', thereby triggering the warning in __kfree_skb_reason() due to reason being 'SKB_NOT_DROPPED_YET' (0). [...] [1] WARNING: CPU: 0 PID: 181 at net/core/skbuff.c:1082 kfree_skb_reason+0x38/0x130 Modules linked in: CPU: 0 PID: 181 Comm: mausezahn Not tainted 6.6.0-rc6-custom-ge43e6d9582e0 deepin-community#682 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014 RIP: 0010:kfree_skb_reason+0x38/0x130 [...] Call Trace: <IRQ> __netif_receive_skb_core.constprop.0+0x837/0xdb0 __netif_receive_skb_one_core+0x3c/0x70 process_backlog+0x95/0x130 __napi_poll+0x25/0x1b0 net_rx_action+0x29b/0x310 __do_softirq+0xc0/0x29b do_softirq+0x43/0x60 </IRQ> [2] #!/bin/bash ip link add name veth0 type veth peer name veth1 ip link set dev veth0 up ip link set dev veth1 up tc qdisc add dev veth1 clsact tc filter add dev veth1 ingress pref 1 proto all flower dst_mac 00:11:22:33:44:55 action drop mausezahn veth0 -a own -b 00:11:22:33:44:55 -q -c 1 What happens is that inside most classifiers the tcf_result is copied over from a filter template e.g. *res = f->res which then implicitly overrides the prior SKB_DROP_REASON_TC_{INGRESS,EGRESS} default drop code which was set via sch_handle_{ingress,egress}() for kfree_skb_reason(). Commit text above copied verbatim from Daniel. The general idea of the patch is not very different from what Ido originally posted but instead done at the cls_api codepath. Fixes: 54a59ae ("net, sched: Make tc-related drop reason more flexible") Reported-by: Ido Schimmel <idosch@idosch.org> Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com> Link: https://lore.kernel.org/netdev/ZTjY959R+AFXf3Xy@shredder Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net> (cherry picked from commit 40cb2fd) Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
1 parent 8beecd4 commit 69ded34

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

net/sched/act_api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,7 @@ int tcf_action_exec(struct sk_buff *skb, struct tc_action **actions,
11181118
}
11191119
} else if (TC_ACT_EXT_CMP(ret, TC_ACT_GOTO_CHAIN)) {
11201120
if (unlikely(!rcu_access_pointer(a->goto_chain))) {
1121-
net_warn_ratelimited("can't go to NULL chain!\n");
1121+
tcf_set_drop_reason(res, SKB_DROP_REASON_TC_ERROR);
11221122
return TC_ACT_SHOT;
11231123
}
11241124
tcf_action_goto_chain_exec(a, res);

net/sched/cls_api.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1664,6 +1664,7 @@ static inline int __tcf_classify(struct sk_buff *skb,
16641664
int act_index,
16651665
u32 *last_executed_chain)
16661666
{
1667+
u32 orig_reason = res->drop_reason;
16671668
#ifdef CONFIG_NET_CLS_ACT
16681669
const int max_reclassify_loop = 16;
16691670
const struct tcf_proto *first_tp;
@@ -1718,8 +1719,14 @@ static inline int __tcf_classify(struct sk_buff *skb,
17181719
goto reset;
17191720
}
17201721
#endif
1721-
if (err >= 0)
1722+
if (err >= 0) {
1723+
/* Policy drop or drop reason is over-written by
1724+
* classifiers with a bogus value(0) */
1725+
if (err == TC_ACT_SHOT &&
1726+
res->drop_reason == SKB_NOT_DROPPED_YET)
1727+
tcf_set_drop_reason(res, orig_reason);
17221728
return err;
1729+
}
17231730
}
17241731

17251732
if (unlikely(n)) {

0 commit comments

Comments
 (0)