[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <74feb818-7109-cb1e-8eec-a037c17a2871@iogearbox.net>
Date: Mon, 18 Dec 2023 09:52:05 +0100
From: Daniel Borkmann <daniel@...earbox.net>
To: Sebastian Andrzej Siewior <bigeasy@...utronix.de>,
linux-kernel@...r.kernel.org, netdev@...r.kernel.org
Cc: "David S. Miller" <davem@...emloft.net>, Boqun Feng
<boqun.feng@...il.com>, Eric Dumazet <edumazet@...gle.com>,
Frederic Weisbecker <frederic@...nel.org>, Ingo Molnar <mingo@...hat.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>,
Peter Zijlstra <peterz@...radead.org>, Thomas Gleixner <tglx@...utronix.de>,
Waiman Long <longman@...hat.com>, Will Deacon <will@...nel.org>,
"K. Y. Srinivasan" <kys@...rosoft.com>, "Michael S. Tsirkin"
<mst@...hat.com>, Alexei Starovoitov <ast@...nel.org>,
Andrii Nakryiko <andrii@...nel.org>, Dexuan Cui <decui@...rosoft.com>,
Haiyang Zhang <haiyangz@...rosoft.com>, Hao Luo <haoluo@...gle.com>,
Jesper Dangaard Brouer <hawk@...nel.org>, Jiri Olsa <jolsa@...nel.org>,
John Fastabend <john.fastabend@...il.com>, Juergen Gross <jgross@...e.com>,
KP Singh <kpsingh@...nel.org>, Martin KaFai Lau <martin.lau@...ux.dev>,
Nikolay Aleksandrov <razor@...ckwall.org>, Song Liu <song@...nel.org>,
Stanislav Fomichev <sdf@...gle.com>,
Stefano Stabellini <sstabellini@...nel.org>, Wei Liu <wei.liu@...nel.org>,
Willem de Bruijn <willemdebruijn.kernel@...il.com>,
Xuan Zhuo <xuanzhuo@...ux.alibaba.com>,
Yonghong Song <yonghong.song@...ux.dev>, bpf@...r.kernel.org,
virtualization@...ts.linux.dev, xen-devel@...ts.xenproject.org
Subject: Re: [PATCH net-next 16/24] net: netkit, veth, tun, virt*: Use
nested-BH locking for XDP redirect.
Hi Sebastian,
On 12/15/23 6:07 PM, Sebastian Andrzej Siewior wrote:
> The per-CPU variables used during bpf_prog_run_xdp() invocation and
> later during xdp_do_redirect() rely on disabled BH for their protection.
> Without locking in local_bh_disable() on PREEMPT_RT these data structure
> require explicit locking.
>
> This is a follow-up on the previous change which introduced
> bpf_run_lock.redirect_lock and uses it now within drivers.
>
> The simple way is to acquire the lock before bpf_prog_run_xdp() is
> invoked and hold it until the end of function.
> This does not always work because some drivers (cpsw, atlantic) invoke
> xdp_do_flush() in the same context.
> Acquiring the lock in bpf_prog_run_xdp() and dropping in
> xdp_do_redirect() (without touching drivers) does not work because not
> all driver, which use bpf_prog_run_xdp(), do support XDP_REDIRECT (and
> invoke xdp_do_redirect()).
>
> Ideally the minimal locking scope would be bpf_prog_run_xdp() +
> xdp_do_redirect() and everything else (error recovery, DMA unmapping,
> free/ alloc of memory, …) would happen outside of the locked section.
[...]
> drivers/net/hyperv/netvsc_bpf.c | 1 +
> drivers/net/netkit.c | 13 +++++++----
> drivers/net/tun.c | 28 +++++++++++++----------
> drivers/net/veth.c | 40 ++++++++++++++++++++-------------
> drivers/net/virtio_net.c | 1 +
> drivers/net/xen-netfront.c | 1 +
> 6 files changed, 52 insertions(+), 32 deletions(-)
[...]
Please exclude netkit from this set given it does not support XDP, but
instead only accepts tc BPF typed programs.
Thanks,
Daniel
> diff --git a/drivers/net/netkit.c b/drivers/net/netkit.c
> index 39171380ccf29..fbcf78477bda8 100644
> --- a/drivers/net/netkit.c
> +++ b/drivers/net/netkit.c
> @@ -80,8 +80,15 @@ static netdev_tx_t netkit_xmit(struct sk_buff *skb, struct net_device *dev)
> netkit_prep_forward(skb, !net_eq(dev_net(dev), dev_net(peer)));
> skb->dev = peer;
> entry = rcu_dereference(nk->active);
> - if (entry)
> - ret = netkit_run(entry, skb, ret);
> + if (entry) {
> + scoped_guard(local_lock_nested_bh, &bpf_run_lock.redirect_lock) {
> + ret = netkit_run(entry, skb, ret);
> + if (ret == NETKIT_REDIRECT) {
> + dev_sw_netstats_tx_add(dev, 1, len);
> + skb_do_redirect(skb);
> + }
> + }
> + }
> switch (ret) {
> case NETKIT_NEXT:
> case NETKIT_PASS:
> @@ -95,8 +102,6 @@ static netdev_tx_t netkit_xmit(struct sk_buff *skb, struct net_device *dev)
> }
> break;
> case NETKIT_REDIRECT:
> - dev_sw_netstats_tx_add(dev, 1, len);
> - skb_do_redirect(skb);
> break;
> case NETKIT_DROP:
> default:
Powered by blists - more mailing lists