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

Reply via email to