From: thinker.li@gmail.com
To: bpf@vger.kernel.org, ast@kernel.org, martin.lau@linux.dev,
song@kernel.org, kernel-team@meta.com, andrii@kernel.org,
drosen@google.com
Cc: sinquersw@gmail.com, kuifeng@meta.com,
Kui-Feng Lee <thinker.li@gmail.com>
Subject: [PATCH bpf-next v17 06/14] bpf: pass btf object id in bpf_map_info.
Date: Fri, 19 Jan 2024 14:49:57 -0800 [thread overview]
Message-ID: <20240119225005.668602-7-thinker.li@gmail.com> (raw)
In-Reply-To: <20240119225005.668602-1-thinker.li@gmail.com>
From: Kui-Feng Lee <thinker.li@gmail.com>
Include btf object id (btf_obj_id) in bpf_map_info so that tools (ex:
bpftools struct_ops dump) know the correct btf from the kernel to look up
type information of struct_ops types.
Since struct_ops types can be defined and registered in a module. The
type information of a struct_ops type are defined in the btf of the
module defining it. The userspace tools need to know which btf is for
the module defining a struct_ops type.
Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com>
---
include/linux/bpf.h | 4 ++++
include/uapi/linux/bpf.h | 2 +-
kernel/bpf/bpf_struct_ops.c | 7 +++++++
kernel/bpf/syscall.c | 2 ++
tools/include/uapi/linux/bpf.h | 2 +-
5 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 1e4a05741c0d..f53d07931ad4 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -1732,6 +1732,7 @@ struct bpf_dummy_ops {
int bpf_struct_ops_test_run(struct bpf_prog *prog, const union bpf_attr *kattr,
union bpf_attr __user *uattr);
#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)
{
@@ -1759,6 +1760,9 @@ static inline int bpf_struct_ops_link_create(union bpf_attr *attr)
{
return -EOPNOTSUPP;
}
+static inline void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map)
+{
+}
#endif
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 754e68ca8744..8eb949b52102 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -6487,7 +6487,7 @@ struct bpf_map_info {
__u32 btf_id;
__u32 btf_key_type_id;
__u32 btf_value_type_id;
- __u32 :32; /* alignment pad */
+ __u32 btf_vmlinux_id;
__u64 map_extra;
} __attribute__((aligned(8)));
diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c
index 5ddcca4c4fba..5e98af4fc2e2 100644
--- a/kernel/bpf/bpf_struct_ops.c
+++ b/kernel/bpf/bpf_struct_ops.c
@@ -947,3 +947,10 @@ int bpf_struct_ops_link_create(union bpf_attr *attr)
kfree(link);
return err;
}
+
+void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map)
+{
+ struct bpf_struct_ops_map *st_map = (struct bpf_struct_ops_map *)map;
+
+ info->btf_vmlinux_id = btf_obj_id(st_map->btf);
+}
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index a1f18681721c..05fe78ecc441 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -4687,6 +4687,8 @@ static int bpf_map_get_info_by_fd(struct file *file,
info.btf_value_type_id = map->btf_value_type_id;
}
info.btf_vmlinux_value_type_id = map->btf_vmlinux_value_type_id;
+ if (map->map_type == BPF_MAP_TYPE_STRUCT_OPS)
+ bpf_map_struct_ops_info_fill(&info, map);
if (bpf_map_is_offloaded(map)) {
err = bpf_map_offload_info_fill(&info, map);
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 7f24d898efbb..1949d881f230 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -6487,7 +6487,7 @@ struct bpf_map_info {
__u32 btf_id;
__u32 btf_key_type_id;
__u32 btf_value_type_id;
- __u32 :32; /* alignment pad */
+ __u32 btf_vmlinux_id;
__u64 map_extra;
} __attribute__((aligned(8)));
--
2.34.1
next prev parent reply other threads:[~2024-01-19 22:50 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-19 22:49 [PATCH bpf-next v17 00/14] Registrating struct_ops types from modules thinker.li
2024-01-19 22:49 ` [PATCH bpf-next v17 01/14] bpf: refactory struct_ops type initialization to a function thinker.li
2024-01-19 22:49 ` [PATCH bpf-next v17 02/14] bpf: get type information with BTF_ID_LIST thinker.li
2024-01-19 22:49 ` [PATCH bpf-next v17 03/14] bpf, net: introduce bpf_struct_ops_desc thinker.li
2024-01-19 22:49 ` [PATCH bpf-next v17 04/14] bpf: add struct_ops_tab to btf thinker.li
2024-01-19 22:49 ` [PATCH bpf-next v17 05/14] bpf: make struct_ops_map support btfs other than btf_vmlinux thinker.li
2024-01-19 22:49 ` thinker.li [this message]
2024-01-19 22:49 ` [PATCH bpf-next v17 07/14] bpf: lookup struct_ops types from a given module BTF thinker.li
2024-01-19 22:49 ` [PATCH bpf-next v17 08/14] bpf: pass attached BTF to the bpf_struct_ops subsystem thinker.li
2024-01-19 22:50 ` [PATCH bpf-next v17 09/14] bpf: hold module refcnt in bpf_struct_ops map creation and prog verification thinker.li
2024-01-19 22:50 ` [PATCH bpf-next v17 10/14] bpf: validate value_type thinker.li
2024-01-19 22:50 ` [PATCH bpf-next v17 11/14] bpf, net: switch to dynamic registration thinker.li
2024-01-23 7:11 ` Martin KaFai Lau
2024-01-19 22:50 ` [PATCH bpf-next v17 12/14] libbpf: Find correct module BTFs for struct_ops maps and progs thinker.li
2024-01-19 22:50 ` [PATCH bpf-next v17 13/14] bpf: export btf_ctx_access to modules thinker.li
2024-01-19 22:50 ` [PATCH bpf-next v17 14/14] selftests/bpf: test case for register_bpf_struct_ops() thinker.li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240119225005.668602-7-thinker.li@gmail.com \
--to=thinker.li@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=drosen@google.com \
--cc=kernel-team@meta.com \
--cc=kuifeng@meta.com \
--cc=martin.lau@linux.dev \
--cc=sinquersw@gmail.com \
--cc=song@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.