Commit 523a4cf4 authored by Dmitrii Banshchikov's avatar Dmitrii Banshchikov Committed by Alexei Starovoitov

bpf: Use MAX_BPF_FUNC_REG_ARGS macro

Instead of using integer literal here and there use macro name for
better context.
Signed-off-by: default avatarDmitrii Banshchikov <me@ubique.spb.ru>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20210225202629.585485-1-me@ubique.spb.ru
parent a7d24d95
...@@ -506,6 +506,11 @@ enum bpf_cgroup_storage_type { ...@@ -506,6 +506,11 @@ enum bpf_cgroup_storage_type {
*/ */
#define MAX_BPF_FUNC_ARGS 12 #define MAX_BPF_FUNC_ARGS 12
/* The maximum number of arguments passed through registers
* a single function may have.
*/
#define MAX_BPF_FUNC_REG_ARGS 5
struct btf_func_model { struct btf_func_model {
u8 ret_size; u8 ret_size;
u8 nr_args; u8 nr_args;
......
...@@ -4594,8 +4594,10 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type, ...@@ -4594,8 +4594,10 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
} }
arg = off / 8; arg = off / 8;
args = (const struct btf_param *)(t + 1); args = (const struct btf_param *)(t + 1);
/* if (t == NULL) Fall back to default BPF prog with 5 u64 arguments */ /* if (t == NULL) Fall back to default BPF prog with
nr_args = t ? btf_type_vlen(t) : 5; * MAX_BPF_FUNC_REG_ARGS u64 arguments.
*/
nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
if (prog->aux->attach_btf_trace) { if (prog->aux->attach_btf_trace) {
/* skip first 'void *__data' argument in btf_trace_##name typedef */ /* skip first 'void *__data' argument in btf_trace_##name typedef */
args++; args++;
...@@ -4651,7 +4653,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type, ...@@ -4651,7 +4653,7 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,
} }
} else { } else {
if (!t) if (!t)
/* Default prog with 5 args */ /* Default prog with MAX_BPF_FUNC_REG_ARGS args */
return true; return true;
t = btf_type_by_id(btf, args[arg].type); t = btf_type_by_id(btf, args[arg].type);
} }
...@@ -5102,12 +5104,12 @@ int btf_distill_func_proto(struct bpf_verifier_log *log, ...@@ -5102,12 +5104,12 @@ int btf_distill_func_proto(struct bpf_verifier_log *log,
if (!func) { if (!func) {
/* BTF function prototype doesn't match the verifier types. /* BTF function prototype doesn't match the verifier types.
* Fall back to 5 u64 args. * Fall back to MAX_BPF_FUNC_REG_ARGS u64 args.
*/ */
for (i = 0; i < 5; i++) for (i = 0; i < MAX_BPF_FUNC_REG_ARGS; i++)
m->arg_size[i] = 8; m->arg_size[i] = 8;
m->ret_size = 8; m->ret_size = 8;
m->nr_args = 5; m->nr_args = MAX_BPF_FUNC_REG_ARGS;
return 0; return 0;
} }
args = (const struct btf_param *)(func + 1); args = (const struct btf_param *)(func + 1);
...@@ -5330,8 +5332,9 @@ int btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog, ...@@ -5330,8 +5332,9 @@ int btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog,
} }
args = (const struct btf_param *)(t + 1); args = (const struct btf_param *)(t + 1);
nargs = btf_type_vlen(t); nargs = btf_type_vlen(t);
if (nargs > 5) { if (nargs > MAX_BPF_FUNC_REG_ARGS) {
bpf_log(log, "Function %s has %d > 5 args\n", tname, nargs); bpf_log(log, "Function %s has %d > %d args\n", tname, nargs,
MAX_BPF_FUNC_REG_ARGS);
goto out; goto out;
} }
...@@ -5460,9 +5463,9 @@ int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, ...@@ -5460,9 +5463,9 @@ int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog,
} }
args = (const struct btf_param *)(t + 1); args = (const struct btf_param *)(t + 1);
nargs = btf_type_vlen(t); nargs = btf_type_vlen(t);
if (nargs > 5) { if (nargs > MAX_BPF_FUNC_REG_ARGS) {
bpf_log(log, "Global function %s() with %d > 5 args. Buggy compiler.\n", bpf_log(log, "Global function %s() with %d > %d args. Buggy compiler.\n",
tname, nargs); tname, nargs, MAX_BPF_FUNC_REG_ARGS);
return -EINVAL; return -EINVAL;
} }
/* check that function returns int */ /* check that function returns int */
......
...@@ -5544,7 +5544,7 @@ static int check_helper_call(struct bpf_verifier_env *env, int func_id, int insn ...@@ -5544,7 +5544,7 @@ static int check_helper_call(struct bpf_verifier_env *env, int func_id, int insn
meta.func_id = func_id; meta.func_id = func_id;
/* check args */ /* check args */
for (i = 0; i < 5; i++) { for (i = 0; i < MAX_BPF_FUNC_REG_ARGS; i++) {
err = check_func_arg(env, i, &meta, fn); err = check_func_arg(env, i, &meta, fn);
if (err) if (err)
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment