Re: [net v5 2/3] net: sched: add check tc_skip_classify in sch egress
flat view
From: Tonghao Zhang <hidden>
Date: 2021-12-10 19:55:02
On Sat, Dec 11, 2021 at 1:46 AM Tonghao Zhang [off-list ref] wrote:
On Sat, Dec 11, 2021 at 1:37 AM Tonghao Zhang [off-list ref] wrote:quoted
On Sat, Dec 11, 2021 at 12:43 AM John Fastabend [off-list ref] wrote:quoted
xiangxia.m.yue@ wrote:quoted
From: Tonghao Zhang <redacted> Try to resolve the issues as below: * We look up and then check tc_skip_classify flag in net sched layer, even though skb don't want to be classified. That case may consume a lot of cpu cycles. This patch is useful when there are a lot of filters with different prio. There is ~5 prio in in production, ~1% improvement. Rules as below: $ for id in $(seq 1 5); do $ tc filter add ... egress prio $id ... action mirred egress redirect dev ifb0 $ done * bpf_redirect may be invoked in egress path. If we don't check the flags and then return immediately, the packets will loopback.This would be the naive case right? Meaning the BPF program is doing a redirect without any logic or is buggy? Can you map out how this happens for me, I'm not fully sure I understand the exact concern. Is it possible for BPF programs that used to see packets no longer see the packet as expected? Is this the path you are talking about?Hi John Tx ethx -> __dev_queue_xmit -> sch_handle_egress -> execute BPF program on ethx with bpf_redirect(ifb0) -> -> ifb_xmit -> ifb_ri_tasklet -> dev_queue_xmit -> __dev_queue_xmit the packets loopbacks, that means bpf_redirect doesn't work with ifb netdev, right ? so in sch_handle_egress, I add the check skb_skip_tc_classify().quoted
rx ethx -> execute BPF program on ethx with bpf_redirect(ifb0) -> __skb_dequeue @ifb tc_skip_classify = 1 -> dev_queue_xmit() -> sch_handle_egress() -> execute BPF program again I can't see why you want to skip that second tc BPF program, or for that matter any tc filter there. In general how do you know that is the correct/expected behavior? Before the above change it would have been called, what if its doing useful work.bpf_redirect works fine on ingress with ifb __netif_receive_skb_core -> sch_handle_ingress -> bpf_redirect (ifb0) -> ifb_xmit -> netif_receive_skb -> __netif_receive_skb_core but __netif_receive_skb_core --> skb_skip_tc_classify(so the packets will execute the BPF progam again)so the packets will NOT execute the BPF progam again)quoted
quoted
Also its not clear how your ifb setup is built or used. That might help understand your use case. I would just remove the IFB altogether and the above discussion is mute.tc filter add dev veth1 egress bpf direct-action obj test_bpf_redirect_ifb.o sec redirect_ifb the test_bpf_redirect_ifb bpf progam: +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2021 DiDi Global */ + +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> + +SEC("redirect_ifb") +int redirect(struct __sk_buff *skb) +{ + return bpf_redirect(skb->ifindex + 1 /* ifbX */, 0); +} + +char __license[] SEC("license") = "GPL"; The 3/3 is selftest: https://patchwork.kernel.org/project/netdevbpf/patch/20211208145459.9590-4-xiangxia.m.yue@gmail.com/quoted
Thanks, John
Hi John Did I answer your question? I hope I explained things clearly.
quoted
-- Best regards, Tonghao-- Best regards, Tonghao
-- Best regards, Tonghao