On Tue, Aug 26, 2025 at 04:31:23PM +0100, Mark Rutland wrote: > On Tue, Aug 26, 2025 at 03:35:48PM +0100, Robin Murphy wrote: > > On 2025-08-26 12:15 pm, Mark Rutland wrote: > > > On Wed, Aug 13, 2025 at 06:00:54PM +0100, Robin Murphy wrote:
> > > > diff --git a/drivers/perf/hisilicon/hisi_pcie_pmu.c > > > > b/drivers/perf/hisilicon/hisi_pcie_pmu.c > > > > index c5394d007b61..3b0b2f7197d0 100644 > > > > --- a/drivers/perf/hisilicon/hisi_pcie_pmu.c > > > > +++ b/drivers/perf/hisilicon/hisi_pcie_pmu.c > > > > @@ -338,21 +338,16 @@ static bool > > > > hisi_pcie_pmu_validate_event_group(struct perf_event *event) > > > > int counters = 1; > > > > int num; > > > > - event_group[0] = leader; > > > > - if (!is_software_event(leader)) { > > > > - if (leader->pmu != event->pmu) > > > > - return false; > > > > + if (leader == event) > > > > + return true; > > > > - if (leader != event && !hisi_pcie_pmu_cmp_event(leader, > > > > event)) > > > > - event_group[counters++] = event; > > > > - } > > > > + event_group[0] = event; > > > > + if (leader->pmu == event->pmu && > > > > !hisi_pcie_pmu_cmp_event(leader, event)) > > > > + event_group[counters++] = leader; > > > > > > Looking at this, the existing logic to share counters (which > > > hisi_pcie_pmu_cmp_event() is trying to permit) looks to be bogus, given > > > that the start/stop callbacks will reprogram the HW counters (and hence > > > can fight with one another). > > It does seem somewhat nonsensical to have multiple copies of the same event > > in the same group, but I imagine it could happen with some sort of scripted > > combination of metrics, and supporting it at this level saves needing > > explicit deduplication further up. So even though my initial instinct was to > > rip it out too, in the end I concluded that that doesn't seem justified. > > As above, I think it's clearly bogus. I don't think we should have > merged it as-is and it's not something I'd like to see others copy. > Other PMUs don't do this sort of event deduplication, and in general it > should be up to the user or userspace software to do that rather than > doing that badly in the kernel. > > Given it was implemented with no rationale I think we should rip it out. > If that breaks someone's scripting, then we can consider implementing > something that actually works. Having dug some more, I see that this was intended to handle the way the hardware shares a single config register between pairs of counter and counter_ext registers, with the idea being that two related events could be allocated into the same counter pair (but would only occupy a single counter each). I still think the code is wrong, but it is more complex than I made it out to be, and you're right that we should leave it as-is for now. I can follow up after we've got this series in. Mark.