Re: [PATCH] perf jevents: make events order more deterministic
From: Ian Rogers
Date: Mon Jul 06 2026 - 14:57:04 EST
On Mon, Jul 6, 2026 at 11:22 AM Nazar Kazakov
<nazar.kazakov@xxxxxxxxxxxxxxx> wrote:
>
> On 2026-07-06 19:04, Ian Rogers wrote:
> > On Mon, Jul 6, 2026 at 10:57 AM Nazar Kazakov
> > <nazar.kazakov@xxxxxxxxxxxxxxx> wrote:
> >>
> >> Some of the events have the same name, but differing descriptions.
> >> This
> >> leads to a non-deterministic sorting order, so fix by adding the
> >> description field to the order.
> >>
> >> Signed-off-by: Nazar Kazakov <nazar.kazakov@xxxxxxxxxxxxxxx>
> >
> > This shouldn't be an issue; can you give an example? I mean, with:
> > $ perf stat -e event1,event1 true
> > There's only one meaning for what event1 is. There is wildcard
> > support, but that's not the same as having the same event more than
> > once, differing only by description. Note, I deliberately use events
> > with perf stat in the example because the metrics build on the regular
> > event parsing code.
>
> I meant sorting order during build time:
> tools/perf/pmu-events/pmu-events.c
> changes between different builds, you can see an example of diffoscope
> output here
> https://freedesktop-sdk.gitlab.io/-/freedesktop-sdk/-/jobs/15174060131/artifacts/result_folder/components/perf.bst/index.html
>
> /* offset=5995059 */
> "lpm_l2_rfo_misses\000lpm_l2;lpm_l2_rfo\000d_ratio(L2_RQSTS.RFO_MISS,
> duration_time)\000\000L2 cache request for ownership (RFO) misses per
> second\000\0001misses/s\000\000\000\000000"
> /* offset=5995210 */
> "lpm_l2_rfo_misses\000lpm_l2;lpm_l2_rfo\000d_ratio(L2_RQSTS.RFO_MISS,
> L2_RQSTS.RFO_HIT + L2_RQSTS.RFO_MISS)\000\000L2 cache request for
> ownership (RFO) misses\000\000100%\000\000\000\000000"
>
> vs
>
> /* offset=5995059 */
> "lpm_l2_rfo_misses\000lpm_l2;lpm_l2_rfo\000d_ratio(L2_RQSTS.RFO_MISS,
> L2_RQSTS.RFO_HIT + L2_RQSTS.RFO_MISS)\000\000L2 cache request for
> ownership (RFO) misses\000\000100%\000\000\000\000000"
> /* offset=5995217 */
> "lpm_l2_rfo_misses\000lpm_l2;lpm_l2_rfo\000d_ratio(L2_RQSTS.RFO_MISS,
> duration_time)\000\000L2 cache request for ownership (RFO) misses per
> second\000\0001misses/s\000\000\000\000000"
>
> That leads to non-reproducible binaries, even though the functionality
> is probably the same.
I agree non-reproducible builds are bad. The functionality should be
the same, the offsets exist only to avoid a gazillion C-string
constants that massively inflate the perf binary size which is about
75% string constants on x86. We don't want to relocate all those
strings when the perf binary loads.
I see the problem from your example. I wonder a more complete fix
would be something like:
```
def __lt__(self, other):
"""Sort order."""
if self.name != other.name:
return self.name < other.name
if not self.expr.Equals(other.expr):
return self.expr.ToPerfJson() < other.expr.ToPerfJson()
return self.description < other.description
```
wdyt?
Thanks,
Ian
> Thanks,
> Nazar Kazakov