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; > > > +}