[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <166256555117.1434226.17491394872817800182.stgit@firesoul>
Date: Wed, 07 Sep 2022 17:45:51 +0200
From: Jesper Dangaard Brouer <brouer@...hat.com>
To: bpf@...r.kernel.org
Cc: Jesper Dangaard Brouer <brouer@...hat.com>, netdev@...r.kernel.org,
xdp-hints@...-project.net, larysa.zaremba@...el.com,
memxor@...il.com, Lorenzo Bianconi <lorenzo@...nel.org>,
mtahhan@...hat.com,
Alexei Starovoitov <alexei.starovoitov@...il.com>,
Daniel Borkmann <borkmann@...earbox.net>,
Andrii Nakryiko <andrii.nakryiko@...il.com>,
dave@...cker.co.uk, Magnus Karlsson <magnus.karlsson@...el.com>,
bjorn@...nel.org
Subject: [PATCH RFCv2 bpf-next 10/18] btf: Add helper for kernel modules to
lookup full BTF ID
NIC driver modules need to store the full BTF ID as the last member in
metadata area usually written as xdp_hints_common->btf_full_id.
This full BTF ID is a 64-bit value, encoding the modules own BTF object
ID as the high 32-bit and specific struct BTF type ID as lower 32-bit.
Drivers should invoke this once at init time and cache this BTF ID for
runtime usage.
Signed-off-by: Jesper Dangaard Brouer <brouer@...hat.com>
---
include/linux/btf.h | 1 +
kernel/bpf/btf.c | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/include/linux/btf.h b/include/linux/btf.h
index a66266c00c04..b8f7c92b6767 100644
--- a/include/linux/btf.h
+++ b/include/linux/btf.h
@@ -150,6 +150,7 @@ bool btf_is_module(const struct btf *btf);
struct module *btf_try_get_module(const struct btf *btf);
struct btf *btf_get_module_btf(const struct module *module);
void btf_put_module_btf(struct btf *btf);
+u64 btf_get_module_btf_full_id(struct btf *btf, const char *name);
u32 btf_nr_types(const struct btf *btf);
bool btf_member_is_reg_int(const struct btf *btf, const struct btf_type *s,
const struct btf_member *m,
diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index 1e95391e0ca1..10a859943a49 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -7092,6 +7092,29 @@ struct btf *btf_get_module_btf(const struct module *module)
}
EXPORT_SYMBOL_GPL(btf_get_module_btf);
+u64 btf_get_module_btf_full_id(struct btf *btf, const char *name)
+{
+ s32 type_id;
+ u64 obj_id;
+
+ if (IS_ERR_OR_NULL(btf))
+ return 0;
+
+ obj_id = btf_obj_id(btf);
+ type_id = btf_find_by_name_kind(btf, name, BTF_KIND_STRUCT);
+ if (type_id < 0) {
+ pr_warn("Module %s(ID:%d): BTF cannot find struct %s",
+ btf->name, (u32)obj_id, name);
+ return 0;
+ }
+
+ pr_info("Module %s(ID:%d): BTF type id %d for struct %s",
+ btf->name, (u32)obj_id, type_id, name);
+
+ return type_id | (obj_id << 32);
+}
+EXPORT_SYMBOL_GPL(btf_get_module_btf_full_id);
+
BPF_CALL_4(bpf_btf_find_by_name_kind, char *, name, int, name_sz, u32, kind, int, flags)
{
struct btf *btf = NULL;
Powered by blists - more mailing lists