Commit a4703e31 authored by Kumar Kartikeya Dwivedi's avatar Kumar Kartikeya Dwivedi Committed by Alexei Starovoitov

bpf: Switch to new kfunc flags infrastructure

Instead of populating multiple sets to indicate some attribute and then
researching the same BTF ID in them, prepare a single unified BTF set
which indicates whether a kfunc is allowed to be called, and also its
attributes if any at the same time. Now, only one call is needed to
perform the lookup for both kfunc availability and its attributes.
Signed-off-by: default avatarKumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20220721134245.2450-4-memxor@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent ef2c6f37
...@@ -1924,7 +1924,8 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, ...@@ -1924,7 +1924,8 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog,
struct bpf_reg_state *regs); struct bpf_reg_state *regs);
int btf_check_kfunc_arg_match(struct bpf_verifier_env *env, int btf_check_kfunc_arg_match(struct bpf_verifier_env *env,
const struct btf *btf, u32 func_id, const struct btf *btf, u32 func_id,
struct bpf_reg_state *regs); struct bpf_reg_state *regs,
u32 kfunc_flags);
int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, int btf_prepare_func_args(struct bpf_verifier_env *env, int subprog,
struct bpf_reg_state *reg); struct bpf_reg_state *reg);
int btf_check_type_match(struct bpf_verifier_log *log, const struct bpf_prog *prog, int btf_check_type_match(struct bpf_verifier_log *log, const struct bpf_prog *prog,
......
...@@ -12,14 +12,11 @@ ...@@ -12,14 +12,11 @@
#define BTF_TYPE_EMIT(type) ((void)(type *)0) #define BTF_TYPE_EMIT(type) ((void)(type *)0)
#define BTF_TYPE_EMIT_ENUM(enum_val) ((void)enum_val) #define BTF_TYPE_EMIT_ENUM(enum_val) ((void)enum_val)
enum btf_kfunc_type { /* These need to be macros, as the expressions are used in assembler input */
BTF_KFUNC_TYPE_CHECK, #define KF_ACQUIRE (1 << 0) /* kfunc is an acquire function */
BTF_KFUNC_TYPE_ACQUIRE, #define KF_RELEASE (1 << 1) /* kfunc is a release function */
BTF_KFUNC_TYPE_RELEASE, #define KF_RET_NULL (1 << 2) /* kfunc returns a pointer that may be NULL */
BTF_KFUNC_TYPE_RET_NULL, #define KF_KPTR_GET (1 << 3) /* kfunc returns reference to a kptr */
BTF_KFUNC_TYPE_KPTR_ACQUIRE,
BTF_KFUNC_TYPE_MAX,
};
struct btf; struct btf;
struct btf_member; struct btf_member;
...@@ -30,16 +27,7 @@ struct btf_id_set; ...@@ -30,16 +27,7 @@ struct btf_id_set;
struct btf_kfunc_id_set { struct btf_kfunc_id_set {
struct module *owner; struct module *owner;
union { struct btf_id_set8 *set;
struct {
struct btf_id_set *check_set;
struct btf_id_set *acquire_set;
struct btf_id_set *release_set;
struct btf_id_set *ret_null_set;
struct btf_id_set *kptr_acquire_set;
};
struct btf_id_set *sets[BTF_KFUNC_TYPE_MAX];
};
}; };
struct btf_id_dtor_kfunc { struct btf_id_dtor_kfunc {
...@@ -378,9 +366,9 @@ const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id); ...@@ -378,9 +366,9 @@ const struct btf_type *btf_type_by_id(const struct btf *btf, u32 type_id);
const char *btf_name_by_offset(const struct btf *btf, u32 offset); const char *btf_name_by_offset(const struct btf *btf, u32 offset);
struct btf *btf_parse_vmlinux(void); struct btf *btf_parse_vmlinux(void);
struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog); struct btf *bpf_prog_get_target_btf(const struct bpf_prog *prog);
bool btf_kfunc_id_set_contains(const struct btf *btf, u32 *btf_kfunc_id_set_contains(const struct btf *btf,
enum bpf_prog_type prog_type, enum bpf_prog_type prog_type,
enum btf_kfunc_type type, u32 kfunc_btf_id); u32 kfunc_btf_id);
int register_btf_kfunc_id_set(enum bpf_prog_type prog_type, int register_btf_kfunc_id_set(enum bpf_prog_type prog_type,
const struct btf_kfunc_id_set *s); const struct btf_kfunc_id_set *s);
s32 btf_find_dtor_kfunc(struct btf *btf, u32 btf_id); s32 btf_find_dtor_kfunc(struct btf *btf, u32 btf_id);
...@@ -397,12 +385,11 @@ static inline const char *btf_name_by_offset(const struct btf *btf, ...@@ -397,12 +385,11 @@ static inline const char *btf_name_by_offset(const struct btf *btf,
{ {
return NULL; return NULL;
} }
static inline bool btf_kfunc_id_set_contains(const struct btf *btf, static inline u32 *btf_kfunc_id_set_contains(const struct btf *btf,
enum bpf_prog_type prog_type, enum bpf_prog_type prog_type,
enum btf_kfunc_type type,
u32 kfunc_btf_id) u32 kfunc_btf_id)
{ {
return false; return NULL;
} }
static inline int register_btf_kfunc_id_set(enum bpf_prog_type prog_type, static inline int register_btf_kfunc_id_set(enum bpf_prog_type prog_type,
const struct btf_kfunc_id_set *s) const struct btf_kfunc_id_set *s)
......
...@@ -213,7 +213,7 @@ enum { ...@@ -213,7 +213,7 @@ enum {
}; };
struct btf_kfunc_set_tab { struct btf_kfunc_set_tab {
struct btf_id_set *sets[BTF_KFUNC_HOOK_MAX][BTF_KFUNC_TYPE_MAX]; struct btf_id_set8 *sets[BTF_KFUNC_HOOK_MAX];
}; };
struct btf_id_dtor_kfunc_tab { struct btf_id_dtor_kfunc_tab {
...@@ -1616,7 +1616,7 @@ static void btf_free_id(struct btf *btf) ...@@ -1616,7 +1616,7 @@ static void btf_free_id(struct btf *btf)
static void btf_free_kfunc_set_tab(struct btf *btf) static void btf_free_kfunc_set_tab(struct btf *btf)
{ {
struct btf_kfunc_set_tab *tab = btf->kfunc_set_tab; struct btf_kfunc_set_tab *tab = btf->kfunc_set_tab;
int hook, type; int hook;
if (!tab) if (!tab)
return; return;
...@@ -1625,10 +1625,8 @@ static void btf_free_kfunc_set_tab(struct btf *btf) ...@@ -1625,10 +1625,8 @@ static void btf_free_kfunc_set_tab(struct btf *btf)
*/ */
if (btf_is_module(btf)) if (btf_is_module(btf))
goto free_tab; goto free_tab;
for (hook = 0; hook < ARRAY_SIZE(tab->sets); hook++) { for (hook = 0; hook < ARRAY_SIZE(tab->sets); hook++)
for (type = 0; type < ARRAY_SIZE(tab->sets[0]); type++) kfree(tab->sets[hook]);
kfree(tab->sets[hook][type]);
}
free_tab: free_tab:
kfree(tab); kfree(tab);
btf->kfunc_set_tab = NULL; btf->kfunc_set_tab = NULL;
...@@ -6172,7 +6170,8 @@ static bool is_kfunc_arg_mem_size(const struct btf *btf, ...@@ -6172,7 +6170,8 @@ static bool is_kfunc_arg_mem_size(const struct btf *btf,
static int btf_check_func_arg_match(struct bpf_verifier_env *env, static int btf_check_func_arg_match(struct bpf_verifier_env *env,
const struct btf *btf, u32 func_id, const struct btf *btf, u32 func_id,
struct bpf_reg_state *regs, struct bpf_reg_state *regs,
bool ptr_to_mem_ok) bool ptr_to_mem_ok,
u32 kfunc_flags)
{ {
enum bpf_prog_type prog_type = resolve_prog_type(env->prog); enum bpf_prog_type prog_type = resolve_prog_type(env->prog);
struct bpf_verifier_log *log = &env->log; struct bpf_verifier_log *log = &env->log;
...@@ -6210,10 +6209,8 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env, ...@@ -6210,10 +6209,8 @@ static int btf_check_func_arg_match(struct bpf_verifier_env *env,
if (is_kfunc) { if (is_kfunc) {
/* Only kfunc can be release func */ /* Only kfunc can be release func */
rel = btf_kfunc_id_set_contains(btf, resolve_prog_type(env->prog), rel = kfunc_flags & KF_RELEASE;
BTF_KFUNC_TYPE_RELEASE, func_id); kptr_get = kfunc_flags & KF_KPTR_GET;
kptr_get = btf_kfunc_id_set_contains(btf, resolve_prog_type(env->prog),
BTF_KFUNC_TYPE_KPTR_ACQUIRE, func_id);
} }
/* check that BTF function arguments match actual types that the /* check that BTF function arguments match actual types that the
...@@ -6442,7 +6439,7 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, ...@@ -6442,7 +6439,7 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog,
return -EINVAL; return -EINVAL;
is_global = prog->aux->func_info_aux[subprog].linkage == BTF_FUNC_GLOBAL; is_global = prog->aux->func_info_aux[subprog].linkage == BTF_FUNC_GLOBAL;
err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global); err = btf_check_func_arg_match(env, btf, btf_id, regs, is_global, 0);
/* Compiler optimizations can remove arguments from static functions /* Compiler optimizations can remove arguments from static functions
* or mismatched type can be passed into a global function. * or mismatched type can be passed into a global function.
...@@ -6455,9 +6452,10 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog, ...@@ -6455,9 +6452,10 @@ int btf_check_subprog_arg_match(struct bpf_verifier_env *env, int subprog,
int btf_check_kfunc_arg_match(struct bpf_verifier_env *env, int btf_check_kfunc_arg_match(struct bpf_verifier_env *env,
const struct btf *btf, u32 func_id, const struct btf *btf, u32 func_id,
struct bpf_reg_state *regs) struct bpf_reg_state *regs,
u32 kfunc_flags)
{ {
return btf_check_func_arg_match(env, btf, func_id, regs, true); return btf_check_func_arg_match(env, btf, func_id, regs, true, kfunc_flags);
} }
/* Convert BTF of a function into bpf_reg_state if possible /* Convert BTF of a function into bpf_reg_state if possible
...@@ -6854,6 +6852,11 @@ bool btf_id_set_contains(const struct btf_id_set *set, u32 id) ...@@ -6854,6 +6852,11 @@ bool btf_id_set_contains(const struct btf_id_set *set, u32 id)
return bsearch(&id, set->ids, set->cnt, sizeof(u32), btf_id_cmp_func) != NULL; return bsearch(&id, set->ids, set->cnt, sizeof(u32), btf_id_cmp_func) != NULL;
} }
static void *btf_id_set8_contains(const struct btf_id_set8 *set, u32 id)
{
return bsearch(&id, set->pairs, set->cnt, sizeof(set->pairs[0]), btf_id_cmp_func);
}
enum { enum {
BTF_MODULE_F_LIVE = (1 << 0), BTF_MODULE_F_LIVE = (1 << 0),
}; };
...@@ -7102,16 +7105,16 @@ BTF_TRACING_TYPE_xxx ...@@ -7102,16 +7105,16 @@ BTF_TRACING_TYPE_xxx
/* Kernel Function (kfunc) BTF ID set registration API */ /* Kernel Function (kfunc) BTF ID set registration API */
static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, static int btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
enum btf_kfunc_type type, struct btf_id_set8 *add_set)
struct btf_id_set *add_set, bool vmlinux_set)
{ {
bool vmlinux_set = !btf_is_module(btf);
struct btf_kfunc_set_tab *tab; struct btf_kfunc_set_tab *tab;
struct btf_id_set *set; struct btf_id_set8 *set;
u32 set_cnt; u32 set_cnt;
int ret; int ret;
if (hook >= BTF_KFUNC_HOOK_MAX || type >= BTF_KFUNC_TYPE_MAX) { if (hook >= BTF_KFUNC_HOOK_MAX) {
ret = -EINVAL; ret = -EINVAL;
goto end; goto end;
} }
...@@ -7127,7 +7130,7 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, ...@@ -7127,7 +7130,7 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
btf->kfunc_set_tab = tab; btf->kfunc_set_tab = tab;
} }
set = tab->sets[hook][type]; set = tab->sets[hook];
/* Warn when register_btf_kfunc_id_set is called twice for the same hook /* Warn when register_btf_kfunc_id_set is called twice for the same hook
* for module sets. * for module sets.
*/ */
...@@ -7141,7 +7144,7 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, ...@@ -7141,7 +7144,7 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
* pointer and return. * pointer and return.
*/ */
if (!vmlinux_set) { if (!vmlinux_set) {
tab->sets[hook][type] = add_set; tab->sets[hook] = add_set;
return 0; return 0;
} }
...@@ -7150,7 +7153,7 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, ...@@ -7150,7 +7153,7 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
* and concatenate all individual sets being registered. While each set * and concatenate all individual sets being registered. While each set
* is individually sorted, they may become unsorted when concatenated, * is individually sorted, they may become unsorted when concatenated,
* hence re-sorting the final set again is required to make binary * hence re-sorting the final set again is required to make binary
* searching the set using btf_id_set_contains function work. * searching the set using btf_id_set8_contains function work.
*/ */
set_cnt = set ? set->cnt : 0; set_cnt = set ? set->cnt : 0;
...@@ -7165,8 +7168,8 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, ...@@ -7165,8 +7168,8 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
} }
/* Grow set */ /* Grow set */
set = krealloc(tab->sets[hook][type], set = krealloc(tab->sets[hook],
offsetof(struct btf_id_set, ids[set_cnt + add_set->cnt]), offsetof(struct btf_id_set8, pairs[set_cnt + add_set->cnt]),
GFP_KERNEL | __GFP_NOWARN); GFP_KERNEL | __GFP_NOWARN);
if (!set) { if (!set) {
ret = -ENOMEM; ret = -ENOMEM;
...@@ -7174,15 +7177,15 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, ...@@ -7174,15 +7177,15 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
} }
/* For newly allocated set, initialize set->cnt to 0 */ /* For newly allocated set, initialize set->cnt to 0 */
if (!tab->sets[hook][type]) if (!tab->sets[hook])
set->cnt = 0; set->cnt = 0;
tab->sets[hook][type] = set; tab->sets[hook] = set;
/* Concatenate the two sets */ /* Concatenate the two sets */
memcpy(set->ids + set->cnt, add_set->ids, add_set->cnt * sizeof(set->ids[0])); memcpy(set->pairs + set->cnt, add_set->pairs, add_set->cnt * sizeof(set->pairs[0]));
set->cnt += add_set->cnt; set->cnt += add_set->cnt;
sort(set->ids, set->cnt, sizeof(set->ids[0]), btf_id_cmp_func, NULL); sort(set->pairs, set->cnt, sizeof(set->pairs[0]), btf_id_cmp_func, NULL);
return 0; return 0;
end: end:
...@@ -7190,38 +7193,25 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, ...@@ -7190,38 +7193,25 @@ static int __btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook,
return ret; return ret;
} }
static int btf_populate_kfunc_set(struct btf *btf, enum btf_kfunc_hook hook, static u32 *__btf_kfunc_id_set_contains(const struct btf *btf,
const struct btf_kfunc_id_set *kset)
{
bool vmlinux_set = !btf_is_module(btf);
int type, ret = 0;
for (type = 0; type < ARRAY_SIZE(kset->sets); type++) {
if (!kset->sets[type])
continue;
ret = __btf_populate_kfunc_set(btf, hook, type, kset->sets[type], vmlinux_set);
if (ret)
break;
}
return ret;
}
static bool __btf_kfunc_id_set_contains(const struct btf *btf,
enum btf_kfunc_hook hook, enum btf_kfunc_hook hook,
enum btf_kfunc_type type,
u32 kfunc_btf_id) u32 kfunc_btf_id)
{ {
struct btf_id_set *set; struct btf_id_set8 *set;
u32 *id;
if (hook >= BTF_KFUNC_HOOK_MAX || type >= BTF_KFUNC_TYPE_MAX) if (hook >= BTF_KFUNC_HOOK_MAX)
return false; return NULL;
if (!btf->kfunc_set_tab) if (!btf->kfunc_set_tab)
return false; return NULL;
set = btf->kfunc_set_tab->sets[hook][type]; set = btf->kfunc_set_tab->sets[hook];
if (!set) if (!set)
return false; return NULL;
return btf_id_set_contains(set, kfunc_btf_id); id = btf_id_set8_contains(set, kfunc_btf_id);
if (!id)
return NULL;
/* The flags for BTF ID are located next to it */
return id + 1;
} }
static int bpf_prog_type_to_kfunc_hook(enum bpf_prog_type prog_type) static int bpf_prog_type_to_kfunc_hook(enum bpf_prog_type prog_type)
...@@ -7249,14 +7239,14 @@ static int bpf_prog_type_to_kfunc_hook(enum bpf_prog_type prog_type) ...@@ -7249,14 +7239,14 @@ static int bpf_prog_type_to_kfunc_hook(enum bpf_prog_type prog_type)
* keeping the reference for the duration of the call provides the necessary * keeping the reference for the duration of the call provides the necessary
* protection for looking up a well-formed btf->kfunc_set_tab. * protection for looking up a well-formed btf->kfunc_set_tab.
*/ */
bool btf_kfunc_id_set_contains(const struct btf *btf, u32 *btf_kfunc_id_set_contains(const struct btf *btf,
enum bpf_prog_type prog_type, enum bpf_prog_type prog_type,
enum btf_kfunc_type type, u32 kfunc_btf_id) u32 kfunc_btf_id)
{ {
enum btf_kfunc_hook hook; enum btf_kfunc_hook hook;
hook = bpf_prog_type_to_kfunc_hook(prog_type); hook = bpf_prog_type_to_kfunc_hook(prog_type);
return __btf_kfunc_id_set_contains(btf, hook, type, kfunc_btf_id); return __btf_kfunc_id_set_contains(btf, hook, kfunc_btf_id);
} }
/* This function must be invoked only from initcalls/module init functions */ /* This function must be invoked only from initcalls/module init functions */
...@@ -7283,7 +7273,7 @@ int register_btf_kfunc_id_set(enum bpf_prog_type prog_type, ...@@ -7283,7 +7273,7 @@ int register_btf_kfunc_id_set(enum bpf_prog_type prog_type,
return PTR_ERR(btf); return PTR_ERR(btf);
hook = bpf_prog_type_to_kfunc_hook(prog_type); hook = bpf_prog_type_to_kfunc_hook(prog_type);
ret = btf_populate_kfunc_set(btf, hook, kset); ret = btf_populate_kfunc_set(btf, hook, kset->set);
btf_put(btf); btf_put(btf);
return ret; return ret;
} }
......
...@@ -7562,6 +7562,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn, ...@@ -7562,6 +7562,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
int err, insn_idx = *insn_idx_p; int err, insn_idx = *insn_idx_p;
const struct btf_param *args; const struct btf_param *args;
struct btf *desc_btf; struct btf *desc_btf;
u32 *kfunc_flags;
bool acq; bool acq;
/* skip for now, but return error when we find this in fixup_kfunc_call */ /* skip for now, but return error when we find this in fixup_kfunc_call */
...@@ -7577,18 +7578,16 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn, ...@@ -7577,18 +7578,16 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
func_name = btf_name_by_offset(desc_btf, func->name_off); func_name = btf_name_by_offset(desc_btf, func->name_off);
func_proto = btf_type_by_id(desc_btf, func->type); func_proto = btf_type_by_id(desc_btf, func->type);
if (!btf_kfunc_id_set_contains(desc_btf, resolve_prog_type(env->prog), kfunc_flags = btf_kfunc_id_set_contains(desc_btf, resolve_prog_type(env->prog), func_id);
BTF_KFUNC_TYPE_CHECK, func_id)) { if (!kfunc_flags) {
verbose(env, "calling kernel function %s is not allowed\n", verbose(env, "calling kernel function %s is not allowed\n",
func_name); func_name);
return -EACCES; return -EACCES;
} }
acq = *kfunc_flags & KF_ACQUIRE;
acq = btf_kfunc_id_set_contains(desc_btf, resolve_prog_type(env->prog),
BTF_KFUNC_TYPE_ACQUIRE, func_id);
/* Check the arguments */ /* Check the arguments */
err = btf_check_kfunc_arg_match(env, desc_btf, func_id, regs); err = btf_check_kfunc_arg_match(env, desc_btf, func_id, regs, *kfunc_flags);
if (err < 0) if (err < 0)
return err; return err;
/* In case of release function, we get register number of refcounted /* In case of release function, we get register number of refcounted
...@@ -7632,8 +7631,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn, ...@@ -7632,8 +7631,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
regs[BPF_REG_0].btf = desc_btf; regs[BPF_REG_0].btf = desc_btf;
regs[BPF_REG_0].type = PTR_TO_BTF_ID; regs[BPF_REG_0].type = PTR_TO_BTF_ID;
regs[BPF_REG_0].btf_id = ptr_type_id; regs[BPF_REG_0].btf_id = ptr_type_id;
if (btf_kfunc_id_set_contains(desc_btf, resolve_prog_type(env->prog), if (*kfunc_flags & KF_RET_NULL) {
BTF_KFUNC_TYPE_RET_NULL, func_id)) {
regs[BPF_REG_0].type |= PTR_MAYBE_NULL; regs[BPF_REG_0].type |= PTR_MAYBE_NULL;
/* For mark_ptr_or_null_reg, see 93c230e3f5bd6 */ /* For mark_ptr_or_null_reg, see 93c230e3f5bd6 */
regs[BPF_REG_0].id = ++env->id_gen; regs[BPF_REG_0].id = ++env->id_gen;
......
...@@ -695,48 +695,26 @@ __diag_pop(); ...@@ -695,48 +695,26 @@ __diag_pop();
ALLOW_ERROR_INJECTION(bpf_modify_return_test, ERRNO); ALLOW_ERROR_INJECTION(bpf_modify_return_test, ERRNO);
BTF_SET_START(test_sk_check_kfunc_ids) BTF_SET8_START(test_sk_check_kfunc_ids)
BTF_ID(func, bpf_kfunc_call_test1) BTF_ID_FLAGS(func, bpf_kfunc_call_test1)
BTF_ID(func, bpf_kfunc_call_test2) BTF_ID_FLAGS(func, bpf_kfunc_call_test2)
BTF_ID(func, bpf_kfunc_call_test3) BTF_ID_FLAGS(func, bpf_kfunc_call_test3)
BTF_ID(func, bpf_kfunc_call_test_acquire) BTF_ID_FLAGS(func, bpf_kfunc_call_test_acquire, KF_ACQUIRE | KF_RET_NULL)
BTF_ID(func, bpf_kfunc_call_memb_acquire) BTF_ID_FLAGS(func, bpf_kfunc_call_memb_acquire, KF_ACQUIRE | KF_RET_NULL)
BTF_ID(func, bpf_kfunc_call_test_release) BTF_ID_FLAGS(func, bpf_kfunc_call_test_release, KF_RELEASE)
BTF_ID(func, bpf_kfunc_call_memb_release) BTF_ID_FLAGS(func, bpf_kfunc_call_memb_release, KF_RELEASE)
BTF_ID(func, bpf_kfunc_call_memb1_release) BTF_ID_FLAGS(func, bpf_kfunc_call_memb1_release, KF_RELEASE)
BTF_ID(func, bpf_kfunc_call_test_kptr_get) BTF_ID_FLAGS(func, bpf_kfunc_call_test_kptr_get, KF_ACQUIRE | KF_RET_NULL | KF_KPTR_GET)
BTF_ID(func, bpf_kfunc_call_test_pass_ctx) BTF_ID_FLAGS(func, bpf_kfunc_call_test_pass_ctx)
BTF_ID(func, bpf_kfunc_call_test_pass1) BTF_ID_FLAGS(func, bpf_kfunc_call_test_pass1)
BTF_ID(func, bpf_kfunc_call_test_pass2) BTF_ID_FLAGS(func, bpf_kfunc_call_test_pass2)
BTF_ID(func, bpf_kfunc_call_test_fail1) BTF_ID_FLAGS(func, bpf_kfunc_call_test_fail1)
BTF_ID(func, bpf_kfunc_call_test_fail2) BTF_ID_FLAGS(func, bpf_kfunc_call_test_fail2)
BTF_ID(func, bpf_kfunc_call_test_fail3) BTF_ID_FLAGS(func, bpf_kfunc_call_test_fail3)
BTF_ID(func, bpf_kfunc_call_test_mem_len_pass1) BTF_ID_FLAGS(func, bpf_kfunc_call_test_mem_len_pass1)
BTF_ID(func, bpf_kfunc_call_test_mem_len_fail1) BTF_ID_FLAGS(func, bpf_kfunc_call_test_mem_len_fail1)
BTF_ID(func, bpf_kfunc_call_test_mem_len_fail2) BTF_ID_FLAGS(func, bpf_kfunc_call_test_mem_len_fail2)
BTF_SET_END(test_sk_check_kfunc_ids) BTF_SET8_END(test_sk_check_kfunc_ids)
BTF_SET_START(test_sk_acquire_kfunc_ids)
BTF_ID(func, bpf_kfunc_call_test_acquire)
BTF_ID(func, bpf_kfunc_call_memb_acquire)
BTF_ID(func, bpf_kfunc_call_test_kptr_get)
BTF_SET_END(test_sk_acquire_kfunc_ids)
BTF_SET_START(test_sk_release_kfunc_ids)
BTF_ID(func, bpf_kfunc_call_test_release)
BTF_ID(func, bpf_kfunc_call_memb_release)
BTF_ID(func, bpf_kfunc_call_memb1_release)
BTF_SET_END(test_sk_release_kfunc_ids)
BTF_SET_START(test_sk_ret_null_kfunc_ids)
BTF_ID(func, bpf_kfunc_call_test_acquire)
BTF_ID(func, bpf_kfunc_call_memb_acquire)
BTF_ID(func, bpf_kfunc_call_test_kptr_get)
BTF_SET_END(test_sk_ret_null_kfunc_ids)
BTF_SET_START(test_sk_kptr_acquire_kfunc_ids)
BTF_ID(func, bpf_kfunc_call_test_kptr_get)
BTF_SET_END(test_sk_kptr_acquire_kfunc_ids)
static void *bpf_test_init(const union bpf_attr *kattr, u32 user_size, static void *bpf_test_init(const union bpf_attr *kattr, u32 user_size,
u32 size, u32 headroom, u32 tailroom) u32 size, u32 headroom, u32 tailroom)
...@@ -1621,11 +1599,7 @@ int bpf_prog_test_run_syscall(struct bpf_prog *prog, ...@@ -1621,11 +1599,7 @@ int bpf_prog_test_run_syscall(struct bpf_prog *prog,
static const struct btf_kfunc_id_set bpf_prog_test_kfunc_set = { static const struct btf_kfunc_id_set bpf_prog_test_kfunc_set = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.check_set = &test_sk_check_kfunc_ids, .set = &test_sk_check_kfunc_ids,
.acquire_set = &test_sk_acquire_kfunc_ids,
.release_set = &test_sk_release_kfunc_ids,
.ret_null_set = &test_sk_ret_null_kfunc_ids,
.kptr_acquire_set = &test_sk_kptr_acquire_kfunc_ids
}; };
BTF_ID_LIST(bpf_prog_test_dtor_kfunc_ids) BTF_ID_LIST(bpf_prog_test_dtor_kfunc_ids)
......
...@@ -197,17 +197,17 @@ bpf_tcp_ca_get_func_proto(enum bpf_func_id func_id, ...@@ -197,17 +197,17 @@ bpf_tcp_ca_get_func_proto(enum bpf_func_id func_id,
} }
} }
BTF_SET_START(bpf_tcp_ca_check_kfunc_ids) BTF_SET8_START(bpf_tcp_ca_check_kfunc_ids)
BTF_ID(func, tcp_reno_ssthresh) BTF_ID_FLAGS(func, tcp_reno_ssthresh)
BTF_ID(func, tcp_reno_cong_avoid) BTF_ID_FLAGS(func, tcp_reno_cong_avoid)
BTF_ID(func, tcp_reno_undo_cwnd) BTF_ID_FLAGS(func, tcp_reno_undo_cwnd)
BTF_ID(func, tcp_slow_start) BTF_ID_FLAGS(func, tcp_slow_start)
BTF_ID(func, tcp_cong_avoid_ai) BTF_ID_FLAGS(func, tcp_cong_avoid_ai)
BTF_SET_END(bpf_tcp_ca_check_kfunc_ids) BTF_SET8_END(bpf_tcp_ca_check_kfunc_ids)
static const struct btf_kfunc_id_set bpf_tcp_ca_kfunc_set = { static const struct btf_kfunc_id_set bpf_tcp_ca_kfunc_set = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.check_set = &bpf_tcp_ca_check_kfunc_ids, .set = &bpf_tcp_ca_check_kfunc_ids,
}; };
static const struct bpf_verifier_ops bpf_tcp_ca_verifier_ops = { static const struct bpf_verifier_ops bpf_tcp_ca_verifier_ops = {
......
...@@ -1154,24 +1154,24 @@ static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = { ...@@ -1154,24 +1154,24 @@ static struct tcp_congestion_ops tcp_bbr_cong_ops __read_mostly = {
.set_state = bbr_set_state, .set_state = bbr_set_state,
}; };
BTF_SET_START(tcp_bbr_check_kfunc_ids) BTF_SET8_START(tcp_bbr_check_kfunc_ids)
#ifdef CONFIG_X86 #ifdef CONFIG_X86
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
BTF_ID(func, bbr_init) BTF_ID_FLAGS(func, bbr_init)
BTF_ID(func, bbr_main) BTF_ID_FLAGS(func, bbr_main)
BTF_ID(func, bbr_sndbuf_expand) BTF_ID_FLAGS(func, bbr_sndbuf_expand)
BTF_ID(func, bbr_undo_cwnd) BTF_ID_FLAGS(func, bbr_undo_cwnd)
BTF_ID(func, bbr_cwnd_event) BTF_ID_FLAGS(func, bbr_cwnd_event)
BTF_ID(func, bbr_ssthresh) BTF_ID_FLAGS(func, bbr_ssthresh)
BTF_ID(func, bbr_min_tso_segs) BTF_ID_FLAGS(func, bbr_min_tso_segs)
BTF_ID(func, bbr_set_state) BTF_ID_FLAGS(func, bbr_set_state)
#endif #endif
#endif #endif
BTF_SET_END(tcp_bbr_check_kfunc_ids) BTF_SET8_END(tcp_bbr_check_kfunc_ids)
static const struct btf_kfunc_id_set tcp_bbr_kfunc_set = { static const struct btf_kfunc_id_set tcp_bbr_kfunc_set = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.check_set = &tcp_bbr_check_kfunc_ids, .set = &tcp_bbr_check_kfunc_ids,
}; };
static int __init bbr_register(void) static int __init bbr_register(void)
......
...@@ -485,22 +485,22 @@ static struct tcp_congestion_ops cubictcp __read_mostly = { ...@@ -485,22 +485,22 @@ static struct tcp_congestion_ops cubictcp __read_mostly = {
.name = "cubic", .name = "cubic",
}; };
BTF_SET_START(tcp_cubic_check_kfunc_ids) BTF_SET8_START(tcp_cubic_check_kfunc_ids)
#ifdef CONFIG_X86 #ifdef CONFIG_X86
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
BTF_ID(func, cubictcp_init) BTF_ID_FLAGS(func, cubictcp_init)
BTF_ID(func, cubictcp_recalc_ssthresh) BTF_ID_FLAGS(func, cubictcp_recalc_ssthresh)
BTF_ID(func, cubictcp_cong_avoid) BTF_ID_FLAGS(func, cubictcp_cong_avoid)
BTF_ID(func, cubictcp_state) BTF_ID_FLAGS(func, cubictcp_state)
BTF_ID(func, cubictcp_cwnd_event) BTF_ID_FLAGS(func, cubictcp_cwnd_event)
BTF_ID(func, cubictcp_acked) BTF_ID_FLAGS(func, cubictcp_acked)
#endif #endif
#endif #endif
BTF_SET_END(tcp_cubic_check_kfunc_ids) BTF_SET8_END(tcp_cubic_check_kfunc_ids)
static const struct btf_kfunc_id_set tcp_cubic_kfunc_set = { static const struct btf_kfunc_id_set tcp_cubic_kfunc_set = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.check_set = &tcp_cubic_check_kfunc_ids, .set = &tcp_cubic_check_kfunc_ids,
}; };
static int __init cubictcp_register(void) static int __init cubictcp_register(void)
......
...@@ -239,22 +239,22 @@ static struct tcp_congestion_ops dctcp_reno __read_mostly = { ...@@ -239,22 +239,22 @@ static struct tcp_congestion_ops dctcp_reno __read_mostly = {
.name = "dctcp-reno", .name = "dctcp-reno",
}; };
BTF_SET_START(tcp_dctcp_check_kfunc_ids) BTF_SET8_START(tcp_dctcp_check_kfunc_ids)
#ifdef CONFIG_X86 #ifdef CONFIG_X86
#ifdef CONFIG_DYNAMIC_FTRACE #ifdef CONFIG_DYNAMIC_FTRACE
BTF_ID(func, dctcp_init) BTF_ID_FLAGS(func, dctcp_init)
BTF_ID(func, dctcp_update_alpha) BTF_ID_FLAGS(func, dctcp_update_alpha)
BTF_ID(func, dctcp_cwnd_event) BTF_ID_FLAGS(func, dctcp_cwnd_event)
BTF_ID(func, dctcp_ssthresh) BTF_ID_FLAGS(func, dctcp_ssthresh)
BTF_ID(func, dctcp_cwnd_undo) BTF_ID_FLAGS(func, dctcp_cwnd_undo)
BTF_ID(func, dctcp_state) BTF_ID_FLAGS(func, dctcp_state)
#endif #endif
#endif #endif
BTF_SET_END(tcp_dctcp_check_kfunc_ids) BTF_SET8_END(tcp_dctcp_check_kfunc_ids)
static const struct btf_kfunc_id_set tcp_dctcp_kfunc_set = { static const struct btf_kfunc_id_set tcp_dctcp_kfunc_set = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.check_set = &tcp_dctcp_check_kfunc_ids, .set = &tcp_dctcp_check_kfunc_ids,
}; };
static int __init dctcp_register(void) static int __init dctcp_register(void)
......
...@@ -219,48 +219,21 @@ void bpf_ct_release(struct nf_conn *nfct) ...@@ -219,48 +219,21 @@ void bpf_ct_release(struct nf_conn *nfct)
__diag_pop() __diag_pop()
BTF_SET_START(nf_ct_xdp_check_kfunc_ids) BTF_SET8_START(nf_ct_kfunc_set)
BTF_ID(func, bpf_xdp_ct_lookup) BTF_ID_FLAGS(func, bpf_xdp_ct_lookup, KF_ACQUIRE | KF_RET_NULL)
BTF_ID(func, bpf_ct_release) BTF_ID_FLAGS(func, bpf_skb_ct_lookup, KF_ACQUIRE | KF_RET_NULL)
BTF_SET_END(nf_ct_xdp_check_kfunc_ids) BTF_ID_FLAGS(func, bpf_ct_release, KF_RELEASE)
BTF_SET8_END(nf_ct_kfunc_set)
BTF_SET_START(nf_ct_tc_check_kfunc_ids) static const struct btf_kfunc_id_set nf_conntrack_kfunc_set = {
BTF_ID(func, bpf_skb_ct_lookup)
BTF_ID(func, bpf_ct_release)
BTF_SET_END(nf_ct_tc_check_kfunc_ids)
BTF_SET_START(nf_ct_acquire_kfunc_ids)
BTF_ID(func, bpf_xdp_ct_lookup)
BTF_ID(func, bpf_skb_ct_lookup)
BTF_SET_END(nf_ct_acquire_kfunc_ids)
BTF_SET_START(nf_ct_release_kfunc_ids)
BTF_ID(func, bpf_ct_release)
BTF_SET_END(nf_ct_release_kfunc_ids)
/* Both sets are identical */
#define nf_ct_ret_null_kfunc_ids nf_ct_acquire_kfunc_ids
static const struct btf_kfunc_id_set nf_conntrack_xdp_kfunc_set = {
.owner = THIS_MODULE,
.check_set = &nf_ct_xdp_check_kfunc_ids,
.acquire_set = &nf_ct_acquire_kfunc_ids,
.release_set = &nf_ct_release_kfunc_ids,
.ret_null_set = &nf_ct_ret_null_kfunc_ids,
};
static const struct btf_kfunc_id_set nf_conntrack_tc_kfunc_set = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.check_set = &nf_ct_tc_check_kfunc_ids, .set = &nf_ct_kfunc_set,
.acquire_set = &nf_ct_acquire_kfunc_ids,
.release_set = &nf_ct_release_kfunc_ids,
.ret_null_set = &nf_ct_ret_null_kfunc_ids,
}; };
int register_nf_conntrack_bpf(void) int register_nf_conntrack_bpf(void)
{ {
int ret; int ret;
ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_XDP, &nf_conntrack_xdp_kfunc_set); ret = register_btf_kfunc_id_set(BPF_PROG_TYPE_XDP, &nf_conntrack_kfunc_set);
return ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_SCHED_CLS, &nf_conntrack_tc_kfunc_set); return ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_SCHED_CLS, &nf_conntrack_kfunc_set);
} }
...@@ -148,13 +148,13 @@ static struct bin_attribute bin_attr_bpf_testmod_file __ro_after_init = { ...@@ -148,13 +148,13 @@ static struct bin_attribute bin_attr_bpf_testmod_file __ro_after_init = {
.write = bpf_testmod_test_write, .write = bpf_testmod_test_write,
}; };
BTF_SET_START(bpf_testmod_check_kfunc_ids) BTF_SET8_START(bpf_testmod_check_kfunc_ids)
BTF_ID(func, bpf_testmod_test_mod_kfunc) BTF_ID_FLAGS(func, bpf_testmod_test_mod_kfunc)
BTF_SET_END(bpf_testmod_check_kfunc_ids) BTF_SET8_END(bpf_testmod_check_kfunc_ids)
static const struct btf_kfunc_id_set bpf_testmod_kfunc_set = { static const struct btf_kfunc_id_set bpf_testmod_kfunc_set = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.check_set = &bpf_testmod_check_kfunc_ids, .set = &bpf_testmod_check_kfunc_ids,
}; };
extern int bpf_fentry_test1(int a); extern int bpf_fentry_test1(int a);
......
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