Re: [PATCH 2/3] perf: collect BPF metadata from existing BPF programs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 29, 2025 at 4:21 PM Blake Jones <blakejones@xxxxxxxxxx> wrote:
>
> Hi Ian,
>
> On Thu, May 29, 2025 at 10:47 AM Ian Rogers <irogers@xxxxxxxxxx> wrote:
> > > +               bpf_metadata_event = &metadata->event->bpf_metadata;
> > > +               *bpf_metadata_event = (struct perf_record_bpf_metadata) {
> > > +                       .header = {
> > > +                               .type = PERF_RECORD_BPF_METADATA,
> > > +                               .size = metadata->event_size,
> >
> > nit: Could we set the header.size in bpf_metadata_alloc to remove
> > metadata->event_size. The code generally doesn't pass a pair of
> > perf_event + size around as the size should be in the header.
>
> I can do this initialization of metadata->event->bpf_metadata in
> bpf_metadata_alloc(). I'll need to do a bit more work in
> synthesize_perf_record_bpf_metadata() before I can get rid of
> metadata->event_size, because it needs to allocate an additional
> machine->id_hdr_size bytes (see below); I'd just have it get the
> value out of metadata->event->header.size instead. Sound good?

Sounds good. Thanks,
Ian

> Blake
>
> > > +static int synthesize_perf_record_bpf_metadata(const struct bpf_metadata *metadata,
> > > +                                              const struct perf_tool *tool,
> > > +                                              perf_event__handler_t process,
> > > +                                              struct machine *machine)
> > > +{
> > > +       union perf_event *event;
> > > +       int err = 0;
> > > +
> > > +       event = calloc(1, metadata->event_size + machine->id_hdr_size);
> > > +       if (!event)
> > > +               return -1;
> > > +       memcpy(event, metadata->event, metadata->event_size);
> > > +       memset((void *)event + event->header.size, 0, machine->id_hdr_size);
> > > +       event->header.size += machine->id_hdr_size;
> > > +       for (__u32 index = 0; index < metadata->nr_prog_names; index++) {
> > > +               memcpy(event->bpf_metadata.prog_name,
> > > +                      metadata->prog_names[index], BPF_PROG_NAME_LEN);
> > > +               err = perf_tool__process_synth_event(tool, event, machine,
> > > +                                                    process);
> > > +               if (err != 0)
> > > +                       break;
> > > +       }
> > > +
> > > +       free(event);
> > > +       return err;
> > > +}





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux