lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ