Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: refactor ->ndo_bpf calls into dev_xdp_propagate

When net devices propagate xdp configurations to slave devices,
we will need to perform a memory provider check to ensure we're
not binding xdp to a device using unreadable netmem.

Currently the ->ndo_bpf calls in a few places. Adding checks to all
these places would not be ideal.

Refactor all the ->ndo_bpf calls into one place where we can add this
check in the future.

Suggested-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Mina Almasry <almasrymina@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Mina Almasry and committed by
David S. Miller
7d3aed65 f9db28bb

+15 -5
+4 -4
drivers/net/bonding/bond_main.c
··· 2253 2253 goto err_sysfs_del; 2254 2254 } 2255 2255 2256 - res = slave_dev->netdev_ops->ndo_bpf(slave_dev, &xdp); 2256 + res = dev_xdp_propagate(slave_dev, &xdp); 2257 2257 if (res < 0) { 2258 2258 /* ndo_bpf() sets extack error message */ 2259 2259 slave_dbg(bond_dev, slave_dev, "Error %d calling ndo_bpf\n", res); ··· 2389 2389 .prog = NULL, 2390 2390 .extack = NULL, 2391 2391 }; 2392 - if (slave_dev->netdev_ops->ndo_bpf(slave_dev, &xdp)) 2392 + if (dev_xdp_propagate(slave_dev, &xdp)) 2393 2393 slave_warn(bond_dev, slave_dev, "failed to unload XDP program\n"); 2394 2394 } 2395 2395 ··· 5579 5579 goto err; 5580 5580 } 5581 5581 5582 - err = slave_dev->netdev_ops->ndo_bpf(slave_dev, &xdp); 5582 + err = dev_xdp_propagate(slave_dev, &xdp); 5583 5583 if (err < 0) { 5584 5584 /* ndo_bpf() sets extack error message */ 5585 5585 slave_err(dev, slave_dev, "Error %d calling ndo_bpf\n", err); ··· 5611 5611 if (slave == rollback_slave) 5612 5612 break; 5613 5613 5614 - err_unwind = slave_dev->netdev_ops->ndo_bpf(slave_dev, &xdp); 5614 + err_unwind = dev_xdp_propagate(slave_dev, &xdp); 5615 5615 if (err_unwind < 0) 5616 5616 slave_err(dev, slave_dev, 5617 5617 "Error %d when unwinding XDP program change\n", err_unwind);
+1 -1
drivers/net/hyperv/netvsc_bpf.c
··· 183 183 xdp.command = XDP_SETUP_PROG; 184 184 xdp.prog = prog; 185 185 186 - ret = vf_netdev->netdev_ops->ndo_bpf(vf_netdev, &xdp); 186 + ret = dev_xdp_propagate(vf_netdev, &xdp); 187 187 188 188 if (ret && prog) 189 189 bpf_prog_put(prog);
+1
include/linux/netdevice.h
··· 3925 3925 3926 3926 int bpf_xdp_link_attach(const union bpf_attr *attr, struct bpf_prog *prog); 3927 3927 u8 dev_xdp_prog_count(struct net_device *dev); 3928 + int dev_xdp_propagate(struct net_device *dev, struct netdev_bpf *bpf); 3928 3929 u32 dev_xdp_prog_id(struct net_device *dev, enum bpf_xdp_mode mode); 3929 3930 3930 3931 int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
+9
net/core/dev.c
··· 9370 9370 } 9371 9371 EXPORT_SYMBOL_GPL(dev_xdp_prog_count); 9372 9372 9373 + int dev_xdp_propagate(struct net_device *dev, struct netdev_bpf *bpf) 9374 + { 9375 + if (!dev->netdev_ops->ndo_bpf) 9376 + return -EOPNOTSUPP; 9377 + 9378 + return dev->netdev_ops->ndo_bpf(dev, bpf); 9379 + } 9380 + EXPORT_SYMBOL_GPL(dev_xdp_propagate); 9381 + 9373 9382 u32 dev_xdp_prog_id(struct net_device *dev, enum bpf_xdp_mode mode) 9374 9383 { 9375 9384 struct bpf_prog *prog = dev_xdp_prog(dev, mode);