@@ -1383,6 +1383,10 @@ union bpf_attr {
* to using 5 hash functions).
*/
__u64 map_extra;
+
+ __u32 mod_btf_fd; /* fd pointing to a BTF type data
+ * for btf_vmlinux_value_type_id.
+ */
};
struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
@@ -786,7 +786,16 @@ static struct bpf_map *bpf_struct_ops_map_alloc(union bpf_attr *attr)
struct bpf_map *map;
struct btf *btf;
- st_ops = bpf_struct_ops_find_value(attr->btf_vmlinux_value_type_id, btf_vmlinux);
+ /* XXX: We need a module name or ID to find a BTF type. */
+ /* XXX: should use btf from attr->btf_fd */
+ if (attr->mod_btf_fd) {
+ btf = btf_get_by_fd(attr->mod_btf_fd);
+ if (IS_ERR(btf))
+ return ERR_PTR(PTR_ERR(btf));
+ } else {
+ btf = btf_vmlinux;
+ }
+ st_ops = bpf_struct_ops_find_value(attr->btf_vmlinux_value_type_id, btf);
if (!st_ops)
return ERR_PTR(-ENOTSUPP);
@@ -1093,7 +1093,7 @@ static int map_check_btf(struct bpf_map *map, const struct btf *btf,
return ret;
}
-#define BPF_MAP_CREATE_LAST_FIELD map_extra
+#define BPF_MAP_CREATE_LAST_FIELD mod_btf_fd
/* called via syscall */
static int map_create(union bpf_attr *attr)
{
@@ -19183,6 +19183,7 @@ static int check_struct_ops_btf_id(struct bpf_verifier_env *env)
const struct btf_member *member;
struct bpf_prog *prog = env->prog;
u32 btf_id, member_idx;
+ struct btf *btf;
const char *mname;
if (!prog->gpl_compatible) {
@@ -19190,8 +19191,9 @@ static int check_struct_ops_btf_id(struct bpf_verifier_env *env)
return -EINVAL;
}
+ btf = prog->aux->attach_btf;
btf_id = prog->aux->attach_btf_id;
- st_ops = bpf_struct_ops_find(btf_id, btf_vmlinux);
+ st_ops = bpf_struct_ops_find(btf_id, btf);
if (!st_ops) {
verbose(env, "attach_btf_id %u is not a supported struct\n",
btf_id);
@@ -1383,6 +1383,10 @@ union bpf_attr {
* to using 5 hash functions).
*/
__u64 map_extra;
+
+ __u32 mod_btf_fd; /* fd pointing to a BTF type data
+ * for btf_vmlinux_value_type_id.
+ */
};
struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
From: Kui-Feng Lee <thinker.li@gmail.com> The signatures may be declared in the module defining the structs type. So, we need to know which module BTF to look for type information. The later patches will make libbpf to attach module BTFs to programs. This patch tries to use the attached BTF if there is. --- include/uapi/linux/bpf.h | 4 ++++ kernel/bpf/bpf_struct_ops.c | 11 ++++++++++- kernel/bpf/syscall.c | 2 +- kernel/bpf/verifier.c | 4 +++- tools/include/uapi/linux/bpf.h | 4 ++++ 5 files changed, 22 insertions(+), 3 deletions(-)