mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
bpf: lookup struct_ops types from a given module BTF.
This is a preparation for searching for struct_ops types from a specified module. BTF is always btf_vmlinux now. This patch passes a pointer of BTF to bpf_struct_ops_find_value() and bpf_struct_ops_find(). Once the new registration API of struct_ops types is used, other BTFs besides btf_vmlinux can also be passed to them. Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com> Link: https://lore.kernel.org/r/20240119225005.668602-8-thinker.li@gmail.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
This commit is contained in:
parent
1338b93346
commit
689423db3b
|
|
@ -1689,7 +1689,7 @@ struct bpf_struct_ops_desc {
|
|||
|
||||
#if defined(CONFIG_BPF_JIT) && defined(CONFIG_BPF_SYSCALL)
|
||||
#define BPF_MODULE_OWNER ((void *)((0xeB9FUL << 2) + POISON_POINTER_DELTA))
|
||||
const struct bpf_struct_ops_desc *bpf_struct_ops_find(u32 type_id);
|
||||
const struct bpf_struct_ops_desc *bpf_struct_ops_find(struct btf *btf, u32 type_id);
|
||||
void bpf_struct_ops_init(struct btf *btf, struct bpf_verifier_log *log);
|
||||
bool bpf_struct_ops_get(const void *kdata);
|
||||
void bpf_struct_ops_put(const void *kdata);
|
||||
|
|
@ -1734,7 +1734,7 @@ int bpf_struct_ops_test_run(struct bpf_prog *prog, const union bpf_attr *kattr,
|
|||
#endif
|
||||
void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map);
|
||||
#else
|
||||
static inline const struct bpf_struct_ops_desc *bpf_struct_ops_find(u32 type_id)
|
||||
static inline const struct bpf_struct_ops_desc *bpf_struct_ops_find(struct btf *btf, u32 type_id)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -221,11 +221,11 @@ void bpf_struct_ops_init(struct btf *btf, struct bpf_verifier_log *log)
|
|||
extern struct btf *btf_vmlinux;
|
||||
|
||||
static const struct bpf_struct_ops_desc *
|
||||
bpf_struct_ops_find_value(u32 value_id)
|
||||
bpf_struct_ops_find_value(struct btf *btf, u32 value_id)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!value_id || !btf_vmlinux)
|
||||
if (!value_id || !btf)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bpf_struct_ops); i++) {
|
||||
|
|
@ -236,11 +236,12 @@ bpf_struct_ops_find_value(u32 value_id)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
const struct bpf_struct_ops_desc *bpf_struct_ops_find(u32 type_id)
|
||||
const struct bpf_struct_ops_desc *
|
||||
bpf_struct_ops_find(struct btf *btf, u32 type_id)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (!type_id || !btf_vmlinux)
|
||||
if (!type_id || !btf)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bpf_struct_ops); i++) {
|
||||
|
|
@ -682,7 +683,7 @@ static struct bpf_map *bpf_struct_ops_map_alloc(union bpf_attr *attr)
|
|||
struct bpf_map *map;
|
||||
int ret;
|
||||
|
||||
st_ops_desc = bpf_struct_ops_find_value(attr->btf_vmlinux_value_type_id);
|
||||
st_ops_desc = bpf_struct_ops_find_value(btf_vmlinux, attr->btf_vmlinux_value_type_id);
|
||||
if (!st_ops_desc)
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
|
||||
|
|
|
|||
|
|
@ -20298,7 +20298,7 @@ static int check_struct_ops_btf_id(struct bpf_verifier_env *env)
|
|||
}
|
||||
|
||||
btf_id = prog->aux->attach_btf_id;
|
||||
st_ops_desc = bpf_struct_ops_find(btf_id);
|
||||
st_ops_desc = bpf_struct_ops_find(btf_vmlinux, btf_id);
|
||||
if (!st_ops_desc) {
|
||||
verbose(env, "attach_btf_id %u is not a supported struct\n",
|
||||
btf_id);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user