Merged: https://github.com/crash-utility/crash/commit/5190061bd7fee9009eb2d57bf68e3462b1a86ecc
On Fri, Oct 24, 2025 at 5:31 PM Tao Liu <[email protected]> wrote: > > On Fri, Oct 24, 2025 at 3:54 PM lijiang <[email protected]> wrote: > > > > On Mon, Sep 15, 2025 at 1:16 PM <[email protected]> > > wrote: > >> > >> Date: Thu, 11 Sep 2025 15:20:23 +1200 > >> From: Tao Liu <[email protected]> > >> Subject: [Crash-utility] [PATCH] bpf: Implement ringbuf_map memory > >> usage calculation > >> To: [email protected] > >> Cc: Tao Liu <[email protected]> > >> Message-ID: <[email protected]> > >> Content-Type: text/plain; charset="US-ASCII"; x-default=true > >> > >> This patch replicates the kernel code for bpf ringbuf_map mm usage > >> calculation. > >> > >> $ bpftool map create /sys/fs/bpf/rb0 type ringbuf key 0 value 0 entries > >> $((1<<24)) name rb0 > >> > >> Before: > >> crash> bpf -m 12 > >> ID BPF_MAP BPF_MAP_TYPE MAP_FLAGS > >> 12 ffff8dc4d7c0ed00 RINGBUF 00000000 > >> KEY_SIZE: 0 VALUE_SIZE: 0 MAX_ENTRIES: 16777216 MEMLOCK: > >> (unknown) > >> NAME: "rb0" UID: (unused) > >> > >> After: > >> crash> bpf -m 12 > >> ID BPF_MAP BPF_MAP_TYPE MAP_FLAGS > >> 12 ffff8dc4d7c0ed00 RINGBUF 00000000 > >> KEY_SIZE: 0 VALUE_SIZE: 0 MAX_ENTRIES: 16777216 MEMLOCK: 16855320 > >> NAME: "rb0" UID: (unused) > >> > >> Thus, the output will be the same as bpftool: > >> > >> $ bpftool map show id 12 > >> 12: ringbuf name rb0 flags 0x0 > >> key 0B value 0B max_entries 16777216 memlock 16855320B > >> > >> Signed-off-by: Tao Liu <[email protected]> > >> --- > >> bpf.c | 30 +++++++++++++++++++++++++++++- > >> defs.h | 5 +++++ > >> symbols.c | 5 +++++ > >> 3 files changed, 39 insertions(+), 1 deletion(-) > >> > >> diff --git a/bpf.c b/bpf.c > >> index 466b244..43e4ff5 100644 > >> --- a/bpf.c > >> +++ b/bpf.c > >> @@ -121,6 +121,26 @@ static ulong bpf_map_memory_size(int map_type, uint > >> value_size, > >> return roundup((max_entries * size), PAGESIZE()); > >> } > >> > >> +/* > >> + * Code replicated from kernel/bpf/ringbuf.c:ringbuf_map_mem_usage() > >> +*/ > >> +static ulong ringbuf_map_mem_usage(struct bpf_info *bpf, int i) > >> +{ > >> + ulong nr_pages; > >> + ulong usage = SIZE(bpf_ringbuf_map); > >> + ulong rb = (ulong)(bpf->maplist[i].value) - > >> OFFSET(bpf_ringbuf_map_map) > >> + + OFFSET(bpf_ringbuf_map_rb); > >> + readmem(rb, KVADDR, &rb, sizeof(ulong), "bpf_ringbuf *", > >> RETURN_ON_ERROR); > > > > > > It should be good to use the "FAULT_ON_ERROR" in readmem(), or you can > > check the returned error(if any) here. Both are fine to me. > > > Sure, I will update it when merge. > > Thanks, > Tao Liu > > >> + readmem(rb + OFFSET(bpf_ringbuf_nr_pages), KVADDR, &nr_pages, > >> + sizeof(ulong), "bpf_ringbuf.nr_pages", RETURN_ON_ERROR); > > > > > > Ditto. > > > > Other changes are good for me. > > > > Thanks > > Lianbo > > > >> + usage += (nr_pages << PAGESHIFT()); > >> + ulong nr_meta_pages = (OFFSET(bpf_ringbuf_consumer_pos) >> > >> PAGESHIFT()) + 2; > >> + ulong nr_data_pages = UINT(bpf->bpf_map_buf + > >> OFFSET(bpf_map_max_entries)) >> PAGESHIFT(); > >> + usage += (nr_meta_pages + 2 * nr_data_pages) * sizeof(void *); > >> + > >> + return usage; > >> +} > >> + > >> void > >> cmd_bpf(void) > >> { > >> @@ -217,6 +237,7 @@ bpf_init(struct bpf_info *bpf) > >> STRUCT_SIZE_INIT(bpf_prog_aux, "bpf_prog_aux"); > >> STRUCT_SIZE_INIT(bpf_map, "bpf_map"); > >> STRUCT_SIZE_INIT(bpf_insn, "bpf_insn"); > >> + STRUCT_SIZE_INIT(bpf_ringbuf_map, "bpf_ringbuf_map"); > >> MEMBER_OFFSET_INIT(bpf_prog_aux, "bpf_prog", "aux"); > >> MEMBER_OFFSET_INIT(bpf_prog_type, "bpf_prog", "type"); > >> MEMBER_OFFSET_INIT(bpf_prog_tag, "bpf_prog", "tag"); > >> @@ -228,6 +249,10 @@ bpf_init(struct bpf_info *bpf) > >> MEMBER_OFFSET_INIT(bpf_map_map_flags, "bpf_map", > >> "map_flags"); > >> MEMBER_OFFSET_INIT(bpf_prog_aux_used_maps, "bpf_prog_aux", > >> "used_maps"); > >> MEMBER_OFFSET_INIT(bpf_prog_aux_used_map_cnt, > >> "bpf_prog_aux", "used_map_cnt"); > >> + MEMBER_OFFSET_INIT(bpf_ringbuf_map_map, "bpf_ringbuf_map", > >> "map"); > >> + MEMBER_OFFSET_INIT(bpf_ringbuf_map_rb, "bpf_ringbuf_map", > >> "rb"); > >> + MEMBER_OFFSET_INIT(bpf_ringbuf_consumer_pos, > >> "bpf_ringbuf", "consumer_pos"); > >> + MEMBER_OFFSET_INIT(bpf_ringbuf_nr_pages, "bpf_ringbuf", > >> "nr_pages"); > >> if (!VALID_STRUCT(bpf_prog) || > >> !VALID_STRUCT(bpf_prog_aux) || > >> !VALID_STRUCT(bpf_map) || > >> @@ -664,7 +689,10 @@ do_map_only: > >> fprintf(fp, "%d\n", map_pages * > >> PAGESIZE()); > >> } else if ((msize = bpf_map_memory_size(type, > >> value_size, key_size, max_entries))) > >> fprintf(fp, "%ld\n", msize); > >> - else > >> +#define BPF_MAP_TYPE_RINGBUF (0x1BUL) > >> + else if (type == BPF_MAP_TYPE_RINGBUF) { > >> + fprintf(fp, "%ld\n", > >> ringbuf_map_mem_usage(bpf, i)); > >> + } else > >> fprintf(fp, "(unknown)"); > >> > >> fprintf(fp, " NAME: "); > >> diff --git a/defs.h b/defs.h > >> index 4fecb83..498c262 100644 > >> --- a/defs.h > >> +++ b/defs.h > >> @@ -2274,6 +2274,10 @@ struct offset_table { /* stash > >> of commonly-used offsets */ > >> long request_queue_tag_set; > >> long blk_mq_tag_set_flags; > >> long blk_mq_tag_set_shared_tags; > >> + long bpf_ringbuf_map_map; > >> + long bpf_ringbuf_map_rb; > >> + long bpf_ringbuf_consumer_pos; > >> + long bpf_ringbuf_nr_pages; > >> }; > >> > >> struct size_table { /* stash of commonly-used sizes */ > >> @@ -2452,6 +2456,7 @@ struct size_table { /* stash of > >> commonly-used sizes */ > >> long vmap_node; > >> long cpumask_t; > >> long task_struct_exit_state; > >> + long bpf_ringbuf_map; > >> }; > >> > >> struct array_table { > >> diff --git a/symbols.c b/symbols.c > >> index ce0b441..19e1316 100644 > >> --- a/symbols.c > >> +++ b/symbols.c > >> @@ -11868,6 +11868,10 @@ dump_offset_table(char *spec, ulong makestruct) > >> fprintf(fp, " thread_struct_gsbase: %ld\n", > >> OFFSET(thread_struct_gsbase)); > >> fprintf(fp, " thread_struct_fs: %ld\n", > >> OFFSET(thread_struct_fs)); > >> fprintf(fp, " thread_struct_gs: %ld\n", > >> OFFSET(thread_struct_gs)); > >> + fprintf(fp, " bpf_ringbuf_map_map: %ld\n", > >> OFFSET(bpf_ringbuf_map_map)); > >> + fprintf(fp, " bpf_ringbuf_map_rb: %ld\n", > >> OFFSET(bpf_ringbuf_map_rb)); > >> + fprintf(fp, " bpf_ringbuf_consumer_pos: %ld\n", > >> OFFSET(bpf_ringbuf_consumer_pos)); > >> + fprintf(fp, " bpf_ringbuf_nr_pages: %ld\n", > >> OFFSET(bpf_ringbuf_nr_pages)); > >> > >> fprintf(fp, "\n size_table:\n"); > >> fprintf(fp, " page: %ld\n", SIZE(page)); > >> @@ -12148,6 +12152,7 @@ dump_offset_table(char *spec, ulong makestruct) > >> > >> fprintf(fp, " percpu_counter: %ld\n", > >> SIZE(percpu_counter)); > >> fprintf(fp, " cpumask_t: %ld\n", > >> SIZE(cpumask_t)); > >> + fprintf(fp, " bpf_ringbuf_map: %ld\n", > >> SIZE(bpf_ringbuf_map)); > >> > >> fprintf(fp, "\n array_table:\n"); > >> /* > >> -- > >> 2.47.0 -- Crash-utility mailing list -- [email protected] To unsubscribe send an email to [email protected] https://${domain_name}/admin/lists/devel.lists.crash-utility.osci.io/ Contribution Guidelines: https://github.com/crash-utility/crash/wiki
