Re: [PATCH] perf python: Accept events larger than union perf_event

From: Ian Rogers

Date: Mon Nov 09 2026 - 13:40:46 EST


On Mon, Nov 9, 2026 at 9:58 AM Samuel Wu <wusamuel@xxxxxxxxxx> wrote:
>
> On Sun, Oct 18, 2026 at 12:45 AM Lalit Maganti <lalitmaganti@xxxxxxxxx> wrote:
> >
> > Samples recorded with --call-graph dwarf carry a copy of the user stack
> > and are larger than union perf_event, so session.process_events()
> > fails on the first one:
> >
> > $ perf record --call-graph dwarf -- ./workload
> > $ python3 tools/perf/python/stackcollapse.py
> > ...
> > TypeError: Unexpected event size: 4168 < 8424
> >
> > This makes all the standalone scripts unusable on such recordings.
> >
> > pyrf_event__new() rejects events larger than union perf_event, which
> > guarded the copy into the union that pyrf_event used to embed. Since
> > commit 2c672ffdad4b ("perf python: Lazily copy events and samples from
> > process_events") the event is borrowed, or copied to a buffer of
> > header.size bytes when a callback keeps it, so nothing depends on the
> > event fitting in the union any more. Remove the check.
> >
> > With this, stackcollapse.py and flamegraph.py process a DWARF recording
> > of a two-thread workload, with the same per-symbol sample counts as
> > perf script, also when the callback keeps the events after returning.
> >
> > Assisted-by: LLM
> > Signed-off-by: Lalit Maganti <lalitmaganti@xxxxxxxxx>

Probably worth having:

Fixes: 2c672ffdad4b ("perf python: Lazily copy events and samples from
process_events")

Reviewed-by: Ian Rogers <irogers@xxxxxxxxxx>

Thanks,
Ian

> > ---
> > tools/perf/util/python.c | 5 -----
> > 1 file changed, 5 deletions(-)
> >
> > diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
> > index 60dbe2dad5eb..8b4b2f3d0926 100644
> > --- a/tools/perf/util/python.c
> > +++ b/tools/perf/util/python.c
> > @@ -1792,11 +1792,6 @@ static PyObject *pyrf_event__new(const union perf_event *event, struct evsel *ev
> > event->header.size, event->header.type);
> > }
> >
> > - if (event->header.size > sizeof(union perf_event)) {
> > - return PyErr_Format(PyExc_TypeError, "Unexpected event size: %zu < %u",
> > - sizeof(union perf_event), event->header.size);
> > - }
> > -
> > pevent = PyObject_New(struct pyrf_event, pyrf_event__type[event->header.type]);
> > if (pevent == NULL)
> > return PyErr_NoMemory();
> >
> > base-commit: 1c90f0a3c8a1c4e38f9edd97af9e20848805a7fb
> > --
> > 2.56.0
> >
>
> Reviewed-by: Samuel Wu <wusamuel@xxxxxxxxxx>