|
@@ -1057,22 +1057,23 @@ struct bpf_prog *bpf_prog_inc_not_zero(struct bpf_prog *prog)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(bpf_prog_inc_not_zero);
|
|
|
|
|
|
-static bool bpf_prog_can_attach(struct bpf_prog *prog,
|
|
|
- enum bpf_prog_type *attach_type,
|
|
|
- struct net_device *netdev)
|
|
|
+static bool bpf_prog_get_ok(struct bpf_prog *prog,
|
|
|
+ enum bpf_prog_type *attach_type, bool attach_drv)
|
|
|
{
|
|
|
- struct bpf_dev_offload *offload = prog->aux->offload;
|
|
|
+ /* not an attachment, just a refcount inc, always allow */
|
|
|
+ if (!attach_type)
|
|
|
+ return true;
|
|
|
|
|
|
if (prog->type != *attach_type)
|
|
|
return false;
|
|
|
- if (offload && offload->netdev != netdev)
|
|
|
+ if (bpf_prog_is_dev_bound(prog->aux) && !attach_drv)
|
|
|
return false;
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *attach_type,
|
|
|
- struct net_device *netdev)
|
|
|
+ bool attach_drv)
|
|
|
{
|
|
|
struct fd f = fdget(ufd);
|
|
|
struct bpf_prog *prog;
|
|
@@ -1080,7 +1081,7 @@ static struct bpf_prog *__bpf_prog_get(u32 ufd, enum bpf_prog_type *attach_type,
|
|
|
prog = ____bpf_prog_get(f);
|
|
|
if (IS_ERR(prog))
|
|
|
return prog;
|
|
|
- if (attach_type && !bpf_prog_can_attach(prog, attach_type, netdev)) {
|
|
|
+ if (!bpf_prog_get_ok(prog, attach_type, attach_drv)) {
|
|
|
prog = ERR_PTR(-EINVAL);
|
|
|
goto out;
|
|
|
}
|
|
@@ -1093,23 +1094,13 @@ out:
|
|
|
|
|
|
struct bpf_prog *bpf_prog_get(u32 ufd)
|
|
|
{
|
|
|
- return __bpf_prog_get(ufd, NULL, NULL);
|
|
|
+ return __bpf_prog_get(ufd, NULL, false);
|
|
|
}
|
|
|
|
|
|
-struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type)
|
|
|
-{
|
|
|
- struct bpf_prog *prog = __bpf_prog_get(ufd, &type, NULL);
|
|
|
-
|
|
|
- if (!IS_ERR(prog))
|
|
|
- trace_bpf_prog_get_type(prog);
|
|
|
- return prog;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL_GPL(bpf_prog_get_type);
|
|
|
-
|
|
|
struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type,
|
|
|
- struct net_device *netdev)
|
|
|
+ bool attach_drv)
|
|
|
{
|
|
|
- struct bpf_prog *prog = __bpf_prog_get(ufd, &type, netdev);
|
|
|
+ struct bpf_prog *prog = __bpf_prog_get(ufd, &type, attach_drv);
|
|
|
|
|
|
if (!IS_ERR(prog))
|
|
|
trace_bpf_prog_get_type(prog);
|
|
@@ -1118,7 +1109,7 @@ struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type,
|
|
|
EXPORT_SYMBOL_GPL(bpf_prog_get_type_dev);
|
|
|
|
|
|
/* last field in 'union bpf_attr' used by this command */
|
|
|
-#define BPF_PROG_LOAD_LAST_FIELD prog_target_ifindex
|
|
|
+#define BPF_PROG_LOAD_LAST_FIELD prog_ifindex
|
|
|
|
|
|
static int bpf_prog_load(union bpf_attr *attr)
|
|
|
{
|
|
@@ -1181,7 +1172,7 @@ static int bpf_prog_load(union bpf_attr *attr)
|
|
|
atomic_set(&prog->aux->refcnt, 1);
|
|
|
prog->gpl_compatible = is_gpl ? 1 : 0;
|
|
|
|
|
|
- if (attr->prog_target_ifindex) {
|
|
|
+ if (attr->prog_ifindex) {
|
|
|
err = bpf_prog_offload_init(prog, attr);
|
|
|
if (err)
|
|
|
goto free_prog;
|
|
@@ -1625,11 +1616,6 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
|
|
|
return -EFAULT;
|
|
|
}
|
|
|
|
|
|
- if (bpf_prog_is_dev_bound(prog->aux)) {
|
|
|
- info.status |= BPF_PROG_STATUS_DEV_BOUND;
|
|
|
- info.ifindex = bpf_prog_offload_ifindex(prog);
|
|
|
- }
|
|
|
-
|
|
|
done:
|
|
|
if (copy_to_user(uinfo, &info, info_len) ||
|
|
|
put_user(info_len, &uattr->info.info_len))
|