@@ -8075,8 +8075,8 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
const struct net_device_ops *ops = dev->netdev_ops;
xdp_query_prog_t query, check;
struct bpf_prog *prog = NULL;
+ bool offload, expl;
bpf_op_t bpf_op;
- bool offload;
int err;
ASSERT_RTNL();
@@ -8124,6 +8124,14 @@ int dev_change_xdp_fd(struct net_device *dev, struct netlink_ext_ack *extack,
}
}
+ expl = dev->xdp.explicit_mode;
+ if (!offload && query(dev) && !!expl ^ !!(flags & XDP_FLAGS_MODES)) {
+ NL_SET_ERR_MSG(extack, "program loaded with different flags");
+ if (prog)
+ bpf_prog_put(prog);
+ return -EBUSY;
+ }
+
err = dev_xdp_install(dev, bpf_op, extack, flags, prog);
if (err < 0 && prog)
bpf_prog_put(prog);