mirror of
https://github.com/netdata/libbpf.git
synced 2026-11-05 17:30:15 +08:00
bpftool: Generate skeleton for global percpu data
Enhance bpftool to generate skeletons that properly handle global percpu
variables. The generated skeleton now includes a dedicated structure for
percpu data, allowing users to initialize and access percpu variables more
efficiently.
For global percpu variables, the skeleton now includes a nested
structure, e.g.:
struct test_global_percpu_data {
struct bpf_object_skeleton *skeleton;
struct bpf_object *obj;
struct {
struct bpf_map *percpu;
} maps;
// ...
struct test_global_percpu_data__percpu {
int data;
char run;
struct {
char set;
int i;
int nums[7];
} struct_data;
int nums[7];
} *percpu;
// ...
};
* The "struct test_global_percpu_data__percpu *percpu" points to
initialized data, which is actually "maps.percpu->mmaped".
* Before loading the skeleton, updating the
"struct test_global_percpu_data__percpu *percpu" modifies the initial
value of the corresponding global percpu variables.
* After loading the skeleton, "maps.percpu->mmaped" has been marked as
read-only in libbpf. If users want to update the global percpu
variables, they have to update the "maps.percpu" map instead.
* For lightweight skeleton, "lskel->percpu" will be protected by
"mprotect(p, sz, PROT_READ)".
* For subskeleton, those variables of global percpu data will be
skipped.
Assisted-by: Codex:gpt-5.5-xhigh
Signed-off-by: Leon Hwang <leon.hwang@linux.dev>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Quentin Monnet <qmo@kernel.org>
Link: https://lore.kernel.org/bpf/20260813152324.97937-7-leon.hwang@linux.dev
This commit is contained in:
1 parent
ef1ecc2725
commit
a98506ad02
1 file changed
+22
-2
+22
-2
@@ -131,8 +131,10 @@ static inline void skel_free_map_data(void *p, __u64 addr, size_t sz)
|
||||
{
|
||||
if (addr != ~0ULL)
|
||||
kvfree(p);
|
||||
/* When addr == ~0ULL the 'p' points to
|
||||
* ((struct bpf_array *)map)->value. See skel_finalize_map_data.
|
||||
/*
|
||||
* When addr == ~0ULL the init buffer has already been released.
|
||||
* For skel_finalize_map_data(), 'p' points to
|
||||
* ((struct bpf_array *)map)->value.
|
||||
*/
|
||||
}
|
||||
|
||||
@@ -170,6 +172,15 @@ out:
|
||||
return addr;
|
||||
}
|
||||
|
||||
static inline int skel_protect_map_data(void *p, __u64 *init_val, size_t sz)
|
||||
{
|
||||
(void)sz;
|
||||
|
||||
kvfree(p);
|
||||
*init_val = ~0ULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void *skel_alloc(size_t size)
|
||||
@@ -208,6 +219,15 @@ static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int
|
||||
return NULL;
|
||||
return addr;
|
||||
}
|
||||
|
||||
static inline int skel_protect_map_data(void *p, __u64 *init_val, size_t sz)
|
||||
{
|
||||
(void)init_val;
|
||||
|
||||
if (mprotect(p, sz, PROT_READ))
|
||||
return -errno;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int skel_closenz(int fd)
|
||||
|
||||
Reference in new issue
Block a user