[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250513094505.GD25891@noisy.programming.kicks-ass.net>
Date: Tue, 13 May 2025 11:45:05 +0200
From: Peter Zijlstra <peterz@...radead.org>
To: kan.liang@...ux.intel.com
Cc: mingo@...hat.com, namhyung@...nel.org, irogers@...gle.com,
mark.rutland@....com, linux-kernel@...r.kernel.org,
linux-perf-users@...r.kernel.org, eranian@...gle.com,
ctshao@...gle.com, tmricht@...ux.ibm.com
Subject: Re: [RFC PATCH 01/15] perf: Fix the throttle logic for a group
On Tue, May 13, 2025 at 11:41:55AM +0200, Peter Zijlstra wrote:
> On Tue, May 06, 2025 at 09:47:26AM -0700, kan.liang@...ux.intel.com wrote:
>
> > diff --git a/kernel/events/core.c b/kernel/events/core.c
> > index a84abc2b7f20..eb0dc871f4f1 100644
> > --- a/kernel/events/core.c
> > +++ b/kernel/events/core.c
> > @@ -2734,6 +2734,38 @@ void perf_event_disable_inatomic(struct perf_event *event)
> > static void perf_log_throttle(struct perf_event *event, int enable);
> > static void perf_log_itrace_start(struct perf_event *event);
> >
> > +static void perf_event_group_unthrottle(struct perf_event *event, bool start_event)
> > +{
> > + struct perf_event *leader = event->group_leader;
> > + struct perf_event *sibling;
> > +
> > + if (leader != event || start_event)
> > + leader->pmu->start(leader, 0);
> > + leader->hw.interrupts = 0;
> > +
> > + for_each_sibling_event(sibling, leader) {
> > + if (sibling != event || start_event)
> > + sibling->pmu->start(sibling, 0);
> > + sibling->hw.interrupts = 0;
> > + }
> > +
> > + perf_log_throttle(leader, 1);
> > +}
> > +
> > +static void perf_event_group_throttle(struct perf_event *event)
> > +{
> > + struct perf_event *leader = event->group_leader;
> > + struct perf_event *sibling;
> > +
> > + leader->hw.interrupts = MAX_INTERRUPTS;
> > + leader->pmu->stop(leader, 0);
> > +
> > + for_each_sibling_event(sibling, leader)
> > + sibling->pmu->stop(sibling, 0);
> > +
> > + perf_log_throttle(leader, 0);
> > +}
>
> Urgh, this seems inconsistent at best.
>
> - unthrottle will set interrupts to 0 for the whole group
> - throttle will set interrupts for leader
> while the old code would set interrupts for event.
> - interrupts was written with event stopped, while now you consistently
> write when started
> - both now issue perf_log_throttle() on leader, whereas previously it
> was issued on event.
>
> IOW
>
> before: after:
> event stops leader MAX_INTERRUPTS
> event MAX_INTERRUPTS event group stops
> event logs leader logs
>
> event 0 event group 0
> event starts event group starts
> event logs leader logs
Sorry, that should obviously be:
event 0 event group starts
event starts event group 0
event logs leader logs
Powered by blists - more mailing lists