diff --git a/include/linux/bpf.h b/include/linux/bpf.h index d808253f2e945..923687c47111a 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2212,6 +2212,12 @@ struct bpf_prog_array { struct bpf_prog_array_item items[]; }; +struct bpf_prog_dummy { + struct bpf_prog prog; +}; + +extern struct bpf_prog_dummy dummy_bpf_prog; + struct bpf_empty_prog_array { struct bpf_prog_array hdr; struct bpf_prog *null_prog; diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c index 248f517d66d04..baad33b34cefb 100644 --- a/kernel/bpf/cgroup.c +++ b/kernel/bpf/cgroup.c @@ -77,7 +77,9 @@ bpf_prog_run_array_cg(const struct cgroup_bpf *cgrp, item = &array->items[0]; old_run_ctx = bpf_set_run_ctx(&run_ctx.run_ctx); while ((prog = READ_ONCE(item->prog))) { - run_ctx.prog_item = item; + run_ctx.prog_item = item++; + if (prog == &dummy_bpf_prog.prog) + continue; func_ret = run_prog(prog, ctx); if (ret_flags) { *(ret_flags) |= (func_ret >> 1); @@ -85,7 +87,6 @@ bpf_prog_run_array_cg(const struct cgroup_bpf *cgrp, } if (!func_ret && !IS_ERR_VALUE((long)run_ctx.retval)) run_ctx.retval = -EPERM; - item++; } bpf_reset_run_ctx(old_run_ctx); rcu_read_unlock_migrate(); diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index d595fe512498c..eac8cc3417254 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -2536,13 +2536,12 @@ static unsigned int __bpf_prog_ret1(const void *ctx, return 1; } -static struct bpf_prog_dummy { - struct bpf_prog prog; -} dummy_bpf_prog = { +struct bpf_prog_dummy dummy_bpf_prog = { .prog = { .bpf_func = __bpf_prog_ret1, }, }; +EXPORT_SYMBOL(dummy_bpf_prog); struct bpf_empty_prog_array bpf_empty_prog_array = { .null_prog = NULL,