summaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2024-05-03 19:20:58 +0000
committerPaolo Abeni <pabeni@redhat.com>2024-05-07 11:14:50 +0200
commit979aad40da9217d5e907ee4ad7c7f0dc555944a7 (patch)
tree61e37a750c356f85ebbe4530fd8c82f231673414 /net/core
parent6890ab31d1a35444741e6150db19d64797db2919 (diff)
downloadlinux-979aad40da9217d5e907ee4ad7c7f0dc555944a7.tar.gz
linux-979aad40da9217d5e907ee4ad7c7f0dc555944a7.tar.bz2
linux-979aad40da9217d5e907ee4ad7c7f0dc555944a7.zip
rtnetlink: do not depend on RTNL in rtnl_xdp_prog_skb()
dev->xdp_prog is protected by RCU, we can lift RTNL requirement from rtnl_xdp_prog_skb(). Signed-off-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Diffstat (limited to 'net/core')
-rw-r--r--net/core/rtnetlink.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index dfdd08006fae..41eb8bca5305 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1477,13 +1477,15 @@ static int rtnl_fill_link_ifmap(struct sk_buff *skb,
static u32 rtnl_xdp_prog_skb(struct net_device *dev)
{
const struct bpf_prog *generic_xdp_prog;
+ u32 res = 0;
- ASSERT_RTNL();
+ rcu_read_lock();
+ generic_xdp_prog = rcu_dereference(dev->xdp_prog);
+ if (generic_xdp_prog)
+ res = generic_xdp_prog->aux->id;
+ rcu_read_unlock();
- generic_xdp_prog = rtnl_dereference(dev->xdp_prog);
- if (!generic_xdp_prog)
- return 0;
- return generic_xdp_prog->aux->id;
+ return res;
}
static u32 rtnl_xdp_prog_drv(struct net_device *dev)