linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Liang, Kan" <kan.liang@linux.intel.com>
To: Leo Yan <leo.yan@arm.com>
Cc: peterz@infradead.org, mingo@redhat.com, namhyung@kernel.org,
	irogers@google.com, mark.rutland@arm.com,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	eranian@google.com, ctshao@google.com, tmricht@linux.ibm.com,
	Aishwarya.TCV@arm.com
Subject: Re: [PATCH V4 01/16] perf: Fix the throttle logic for a group
Date: Tue, 27 May 2025 15:30:06 -0400	[thread overview]
Message-ID: <44e1c864-a6e1-41a8-9f11-0ea25999131c@linux.intel.com> (raw)
In-Reply-To: <20250527161656.GJ2566836@e132581.arm.com>



On 2025-05-27 12:16 p.m., Leo Yan wrote:
> Hi Kan,
> 
> [ + Aishwarya ]
> 
> On Tue, May 20, 2025 at 11:16:29AM -0700, kan.liang@linux.intel.com wrote:
> 
> [...]
> 
>> @@ -10331,8 +10358,7 @@ __perf_event_account_interrupt(struct perf_event *event, int throttle)
>>  	if (unlikely(throttle && hwc->interrupts >= max_samples_per_tick)) {
>>  		__this_cpu_inc(perf_throttled_count);
>>  		tick_dep_set_cpu(smp_processor_id(), TICK_DEP_BIT_PERF_EVENTS);
>> -		hwc->interrupts = MAX_INTERRUPTS;
>> -		perf_log_throttle(event, 0);
>> +		perf_event_throttle_group(event);
>>  		ret = 1;
>>  	}
> 
> Our (Arm) CI reports RCU stall that caused by this patch.  I can use a
> simple command to trigger system stuck with cpu-clock:
> 
>   perf record -a -e cpu-clock -- sleep 2
> 
> I confirmed that if removing throttling code for cpu-clock event, then
> the issue can be dimissed.  Based on reading code, the flow below:
> 
>   hrtimer interrupt:
>    `> __perf_event_account_interrupt()
>        `> perf_event_throttle_group()
>            `> perf_event_throttle()
>                `> cpu_clock_event_stop()
>                    `> perf_swevent_cancel_hrtimer()
>                        `> hrtimer_cancel()  -> Inifite loop.
> 
> In the hrtimer interrupt handler, it tries to cancel itself and causes
> inifite loop.  Please consider to fix the issue.
> 

The cpu-clock and task_clock are two special SW events, which rely on
the hrtimer. I missed them when checking the SW events. :(

For the two events, instead of invoking the stop(), the
HRTIMER_NORESTART is returned to stop the timer. Invoking the stop()
cause the issue.

There may be two ways to fix it.
- Add a check of MAX_INTERRUPTS in the event_stop. Return immediately if
the stop is invoked by the throttle.
- Introduce a PMU flag to track the case. Avoid the event_stop in
perf_event_throttle() if the flag is detected.

The latter looks more generic. It may be used if there are other cases
that want to avoid the stop. So the latter is implemented as below.

diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index 947ad12dfdbe..66f02f46595c 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -303,6 +303,7 @@ struct perf_event_pmu_context;
 #define PERF_PMU_CAP_AUX_OUTPUT			0x0080
 #define PERF_PMU_CAP_EXTENDED_HW_TYPE		0x0100
 #define PERF_PMU_CAP_AUX_PAUSE			0x0200
+#define PERF_PMU_CAP_NO_THROTTLE_STOP		0x0400

 /**
  * pmu::scope
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 8327ab0ee641..596597886d96 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -2655,7 +2655,8 @@ static void perf_event_unthrottle(struct
perf_event *event, bool start)

 static void perf_event_throttle(struct perf_event *event)
 {
-	event->pmu->stop(event, 0);
+	if (!(event->pmu->capabilities & PERF_PMU_CAP_NO_THROTTLE_STOP))
+		event->pmu->stop(event, 0);
 	event->hw.interrupts = MAX_INTERRUPTS;
 	perf_log_throttle(event, 0);
 }
@@ -11846,7 +11847,8 @@ static int cpu_clock_event_init(struct
perf_event *event)
 static struct pmu perf_cpu_clock = {
 	.task_ctx_nr	= perf_sw_context,

-	.capabilities	= PERF_PMU_CAP_NO_NMI,
+	.capabilities	= PERF_PMU_CAP_NO_NMI |
+			  PERF_PMU_CAP_NO_THROTTLE_STOP,
 	.dev		= PMU_NULL_DEV,

 	.event_init	= cpu_clock_event_init,
@@ -11928,7 +11930,8 @@ static int task_clock_event_init(struct
perf_event *event)
 static struct pmu perf_task_clock = {
 	.task_ctx_nr	= perf_sw_context,

-	.capabilities	= PERF_PMU_CAP_NO_NMI,
+	.capabilities	= PERF_PMU_CAP_NO_NMI |
+			  PERF_PMU_CAP_NO_THROTTLE_STOP,
 	.dev		= PMU_NULL_DEV,

 	.event_init	= task_clock_event_init,


Thanks,
Kan



  reply	other threads:[~2025-05-27 19:30 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-20 18:16 [PATCH V4 00/16] perf: Fix the throttle logic for group kan.liang
2025-05-20 18:16 ` [PATCH V4 01/16] perf: Fix the throttle logic for a group kan.liang
2025-05-20 22:02   ` Namhyung Kim
2025-05-21 12:16   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-27 16:16   ` [PATCH V4 01/16] " Leo Yan
2025-05-27 19:30     ` Liang, Kan [this message]
2025-05-28 10:28       ` Leo Yan
2025-05-28 14:51         ` Liang, Kan
2025-06-02  0:30   ` perf regression. Was: " Alexei Starovoitov
2025-06-02 12:55     ` Liang, Kan
2025-06-02 16:24       ` Alexei Starovoitov
2025-06-02 17:51         ` Liang, Kan
2025-06-02 18:14           ` Alexei Starovoitov
2025-05-20 18:16 ` [PATCH V4 02/16] perf: Only dump the throttle log for the leader kan.liang
2025-05-20 22:02   ` Namhyung Kim
2025-05-21 12:05   ` Peter Zijlstra
2025-05-21 13:55     ` Liang, Kan
2025-05-21 12:16   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 03/16] perf/x86/intel: Remove driver-specific throttle support kan.liang
2025-05-21 12:16   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 04/16] perf/x86/amd: " kan.liang
2025-05-21 12:16   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 05/16] perf/x86/zhaoxin: " kan.liang
2025-05-21 12:16   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 06/16] powerpc/perf: " kan.liang
2025-05-21 12:16   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 07/16] s390/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-07-23  8:06   ` [PATCH V4 07/16] " Sumanth Korikkar
2025-08-06  8:37     ` Sumanth Korikkar
2025-08-06 17:05       ` Liang, Kan
2025-08-11 14:02         ` Sumanth Korikkar
2025-05-20 18:16 ` [PATCH V4 08/16] perf/arm: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 09/16] perf/apple_m1: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 10/16] alpha/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 11/16] arc/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 12/16] csky/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 13/16] loongarch/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 14/16] sparc/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 15/16] xtensa/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang
2025-05-20 18:16 ` [PATCH V4 16/16] mips/perf: " kan.liang
2025-05-21 12:15   ` [tip: perf/core] " tip-bot2 for Kan Liang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=44e1c864-a6e1-41a8-9f11-0ea25999131c@linux.intel.com \
    --to=kan.liang@linux.intel.com \
    --cc=Aishwarya.TCV@arm.com \
    --cc=ctshao@google.com \
    --cc=eranian@google.com \
    --cc=irogers@google.com \
    --cc=leo.yan@arm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tmricht@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).