* [Patch v2 1/4] perf/x86/intel: Clear stale ACR mask before updating new mask
[not found] <20260420024528.2130065-1-dapeng1.mi@linux.intel.com>
@ 2026-04-20 2:45 ` Dapeng Mi
2026-04-21 22:29 ` Andi Kleen
2026-04-20 2:45 ` [Patch v2 2/4] perf/x86/intel: Disable PMI for self-reloaded ACR events Dapeng Mi
2026-04-20 2:45 ` [Patch v2 3/4] perf/x86/intel: Enable auto counter reload for DMR Dapeng Mi
2 siblings, 1 reply; 7+ messages in thread
From: Dapeng Mi @ 2026-04-20 2:45 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Ian Rogers, Adrian Hunter, Alexander Shishkin,
Andi Kleen, Eranian Stephane
Cc: linux-kernel, linux-perf-users, Dapeng Mi, Zide Chen,
Falcon Thomas, Xudong Hao, Dapeng Mi, stable
The current implementation forgets to clear the ACR mask before applying
a new one. During event rescheduling, this allow bits from a previous
stale ACR mask to persist, leading to an incorrect hardware state.
Ensure that the ACR mask is zeroed out before setting the new mask to
prevent state pollution.
Cc: stable@vger.kernel.org
Fixes: ec980e4facef ("perf/x86/intel: Support auto counter reload")
Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
---
V2: Clear stale acr_mask for all events.
arch/x86/events/intel/core.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 4768236c054b..774ae9a4eeaf 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -3334,6 +3334,12 @@ static void intel_pmu_acr_late_setup(struct cpu_hw_events *cpuc)
struct perf_event *event, *leader;
int i, j, idx;
+ /* Clear stale ACR mask first. */
+ for (i = 0; i < cpuc->n_events; i++) {
+ event = cpuc->event_list[i];
+ event->hw.config1 = 0;
+ }
+
for (i = 0; i < cpuc->n_events; i++) {
leader = cpuc->event_list[i];
if (!is_acr_event_group(leader))
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [Patch v2 1/4] perf/x86/intel: Clear stale ACR mask before updating new mask
2026-04-20 2:45 ` [Patch v2 1/4] perf/x86/intel: Clear stale ACR mask before updating new mask Dapeng Mi
@ 2026-04-21 22:29 ` Andi Kleen
2026-04-22 0:57 ` Mi, Dapeng
0 siblings, 1 reply; 7+ messages in thread
From: Andi Kleen @ 2026-04-21 22:29 UTC (permalink / raw)
To: Dapeng Mi
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Ian Rogers, Adrian Hunter, Alexander Shishkin,
Eranian Stephane, linux-kernel, linux-perf-users, Dapeng Mi,
Zide Chen, Falcon Thomas, Xudong Hao, stable
> diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
> index 4768236c054b..774ae9a4eeaf 100644
> --- a/arch/x86/events/intel/core.c
> +++ b/arch/x86/events/intel/core.c
> @@ -3334,6 +3334,12 @@ static void intel_pmu_acr_late_setup(struct cpu_hw_events *cpuc)
> struct perf_event *event, *leader;
> int i, j, idx;
>
> + /* Clear stale ACR mask first. */
> + for (i = 0; i < cpuc->n_events; i++) {
> + event = cpuc->event_list[i];
> + event->hw.config1 = 0;
> + }
Are you sure nothing else could be using config1?
In principle ACR events can be used with some config1 setting.
-Andi
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [Patch v2 1/4] perf/x86/intel: Clear stale ACR mask before updating new mask
2026-04-21 22:29 ` Andi Kleen
@ 2026-04-22 0:57 ` Mi, Dapeng
0 siblings, 0 replies; 7+ messages in thread
From: Mi, Dapeng @ 2026-04-22 0:57 UTC (permalink / raw)
To: Andi Kleen
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Ian Rogers, Adrian Hunter, Alexander Shishkin,
Eranian Stephane, linux-kernel, linux-perf-users, Dapeng Mi,
Zide Chen, Falcon Thomas, Xudong Hao, stable
On 4/22/2026 6:29 AM, Andi Kleen wrote:
>> diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
>> index 4768236c054b..774ae9a4eeaf 100644
>> --- a/arch/x86/events/intel/core.c
>> +++ b/arch/x86/events/intel/core.c
>> @@ -3334,6 +3334,12 @@ static void intel_pmu_acr_late_setup(struct cpu_hw_events *cpuc)
>> struct perf_event *event, *leader;
>> int i, j, idx;
>>
>> + /* Clear stale ACR mask first. */
>> + for (i = 0; i < cpuc->n_events; i++) {
>> + event = cpuc->event_list[i];
>> + event->hw.config1 = 0;
>> + }
> Are you sure nothing else could be using config1?
>
> In principle ACR events can be used with some config1 setting.
Yes, the field "hw.config1" is introduced for support auto counter reload,
it's only used to store the ACR counter indices. Thanks.
https://lore.kernel.org/all/20250327195217.2683619-6-kan.liang@linux.intel.com/
>
>
> -Andi
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Patch v2 2/4] perf/x86/intel: Disable PMI for self-reloaded ACR events
[not found] <20260420024528.2130065-1-dapeng1.mi@linux.intel.com>
2026-04-20 2:45 ` [Patch v2 1/4] perf/x86/intel: Clear stale ACR mask before updating new mask Dapeng Mi
@ 2026-04-20 2:45 ` Dapeng Mi
2026-04-21 22:37 ` Andi Kleen
2026-04-20 2:45 ` [Patch v2 3/4] perf/x86/intel: Enable auto counter reload for DMR Dapeng Mi
2 siblings, 1 reply; 7+ messages in thread
From: Dapeng Mi @ 2026-04-20 2:45 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Ian Rogers, Adrian Hunter, Alexander Shishkin,
Andi Kleen, Eranian Stephane
Cc: linux-kernel, linux-perf-users, Dapeng Mi, Zide Chen,
Falcon Thomas, Xudong Hao, Dapeng Mi, stable
On platforms with Auto Counter Reload (ACR) support, such as NVL, a
"NMI received for unknown reason 30" warning is observed when running
multiple events in a group with ACR enabled:
$ perf record -e '{instructions/period=20000,acr_mask=0x2/u,\
cycles/period=40000,acr_mask=0x3/u}' ./test
The warning occurs because the Performance Monitoring Interrupt (PMI)
is enabled for the self-reloaded event (the cycles event in this case).
According to the Intel SDM, the overflow bit
(IA32_PERF_GLOBAL_STATUS.PMCn_OVF) is never set for self-reloaded events.
Since the bit is not set, the perf NMI handler cannot identify the source
of the interrupt, leading to the "unknown reason" message.
Furthermore, enabling PMI for self-reloaded events is unnecessary and
can lead to extraneous records that pollute the user's requested data.
Disable the interrupt bit for all events configured with ACR self-reload.
Reported-by: Andi Kleen <ak@linux.intel.com>
Cc: stable@vger.kernel.org
Fixes: ec980e4facef ("perf/x86/intel: Support auto counter reload")
Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
---
arch/x86/events/intel/core.c | 17 +++++++++++++----
arch/x86/events/perf_event.h | 10 ++++++++++
2 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 774ae9a4eeaf..510b087c9e89 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -3118,11 +3118,11 @@ static void intel_pmu_enable_fixed(struct perf_event *event)
intel_set_masks(event, idx);
/*
- * Enable IRQ generation (0x8), if not PEBS,
- * and enable ring-3 counting (0x2) and ring-0 counting (0x1)
- * if requested:
+ * Enable IRQ generation (0x8), if not PEBS and self-reloaded
+ * ACR event, and enable ring-3 counting (0x2) and ring-0
+ * counting (0x1) if requested:
*/
- if (!event->attr.precise_ip)
+ if (!event->attr.precise_ip && !is_acr_self_reload_event(event))
bits |= INTEL_FIXED_0_ENABLE_PMI;
if (hwc->config & ARCH_PERFMON_EVENTSEL_USR)
bits |= INTEL_FIXED_0_USER;
@@ -3306,6 +3306,15 @@ static void intel_pmu_enable_event(struct perf_event *event)
intel_set_masks(event, idx);
static_call_cond(intel_pmu_enable_acr_event)(event);
static_call_cond(intel_pmu_enable_event_ext)(event);
+ /*
+ * For self-reloaded ACR event, don't enable PMI since
+ * HW won't set overflow bit in GLOBAL_STATUS. Otherwise,
+ * the PMI would be recognized as a suspicious NMI.
+ */
+ if (is_acr_self_reload_event(event))
+ hwc->config &= ~ARCH_PERFMON_EVENTSEL_INT;
+ else if (!event->attr.precise_ip)
+ hwc->config |= ARCH_PERFMON_EVENTSEL_INT;
__x86_pmu_enable_event(hwc, enable_mask);
break;
case INTEL_PMC_IDX_FIXED ... INTEL_PMC_IDX_FIXED_BTS - 1:
diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
index fad87d3c8b2c..524668dcf4cc 100644
--- a/arch/x86/events/perf_event.h
+++ b/arch/x86/events/perf_event.h
@@ -137,6 +137,16 @@ static inline bool is_acr_event_group(struct perf_event *event)
return check_leader_group(event->group_leader, PERF_X86_EVENT_ACR);
}
+static inline bool is_acr_self_reload_event(struct perf_event *event)
+{
+ struct hw_perf_event *hwc = &event->hw;
+
+ if (hwc->idx < 0)
+ return false;
+
+ return test_bit(hwc->idx, (unsigned long *)&hwc->config1);
+}
+
struct amd_nb {
int nb_id; /* NorthBridge id */
int refcnt; /* reference count */
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [Patch v2 2/4] perf/x86/intel: Disable PMI for self-reloaded ACR events
2026-04-20 2:45 ` [Patch v2 2/4] perf/x86/intel: Disable PMI for self-reloaded ACR events Dapeng Mi
@ 2026-04-21 22:37 ` Andi Kleen
2026-04-22 1:24 ` Mi, Dapeng
0 siblings, 1 reply; 7+ messages in thread
From: Andi Kleen @ 2026-04-21 22:37 UTC (permalink / raw)
To: Dapeng Mi
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Ian Rogers, Adrian Hunter, Alexander Shishkin,
Eranian Stephane, linux-kernel, linux-perf-users, Dapeng Mi,
Zide Chen, Falcon Thomas, Xudong Hao, stable
On Mon, Apr 20, 2026 at 10:45:26AM +0800, Dapeng Mi wrote:
> @@ -3306,6 +3306,15 @@ static void intel_pmu_enable_event(struct perf_event *event)
> intel_set_masks(event, idx);
> static_call_cond(intel_pmu_enable_acr_event)(event);
> static_call_cond(intel_pmu_enable_event_ext)(event);
> + /*
> + * For self-reloaded ACR event, don't enable PMI since
> + * HW won't set overflow bit in GLOBAL_STATUS. Otherwise,
> + * the PMI would be recognized as a suspicious NMI.
> + */
> + if (is_acr_self_reload_event(event))
> + hwc->config &= ~ARCH_PERFMON_EVENTSEL_INT;
> + else if (!event->attr.precise_ip)
> + hwc->config |= ARCH_PERFMON_EVENTSEL_INT;
It seems weird to either clear or set the bit. You don't know the previous
state of the bit here? I would assume it starts with zero?
> +static inline bool is_acr_self_reload_event(struct perf_event *event)
> +{
> + struct hw_perf_event *hwc = &event->hw;
> +
> + if (hwc->idx < 0)
> + return false;
> +
> + return test_bit(hwc->idx, (unsigned long *)&hwc->config1);
Are you sure this doesn't conflict with some other non ACR usage of config1?
-Andi
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [Patch v2 2/4] perf/x86/intel: Disable PMI for self-reloaded ACR events
2026-04-21 22:37 ` Andi Kleen
@ 2026-04-22 1:24 ` Mi, Dapeng
0 siblings, 0 replies; 7+ messages in thread
From: Mi, Dapeng @ 2026-04-22 1:24 UTC (permalink / raw)
To: Andi Kleen
Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Ian Rogers, Adrian Hunter, Alexander Shishkin,
Eranian Stephane, linux-kernel, linux-perf-users, Dapeng Mi,
Zide Chen, Falcon Thomas, Xudong Hao, stable
On 4/22/2026 6:37 AM, Andi Kleen wrote:
> On Mon, Apr 20, 2026 at 10:45:26AM +0800, Dapeng Mi wrote:
>> @@ -3306,6 +3306,15 @@ static void intel_pmu_enable_event(struct perf_event *event)
>> intel_set_masks(event, idx);
>> static_call_cond(intel_pmu_enable_acr_event)(event);
>> static_call_cond(intel_pmu_enable_event_ext)(event);
>> + /*
>> + * For self-reloaded ACR event, don't enable PMI since
>> + * HW won't set overflow bit in GLOBAL_STATUS. Otherwise,
>> + * the PMI would be recognized as a suspicious NMI.
>> + */
>> + if (is_acr_self_reload_event(event))
>> + hwc->config &= ~ARCH_PERFMON_EVENTSEL_INT;
>> + else if (!event->attr.precise_ip)
>> + hwc->config |= ARCH_PERFMON_EVENTSEL_INT;
> It seems weird to either clear or set the bit. You don't know the previous
> state of the bit here? I would assume it starts with zero?
It's hard and unsafe to trace the previous state. Generally speaking, the
PMI bit would always be set by default at the initialization, then it would
be cleared later if it's a PEBS or ACR self-reloaded event.
>
>> +static inline bool is_acr_self_reload_event(struct perf_event *event)
>> +{
>> + struct hw_perf_event *hwc = &event->hw;
>> +
>> + if (hwc->idx < 0)
>> + return false;
>> +
>> + return test_bit(hwc->idx, (unsigned long *)&hwc->config1);
> Are you sure this doesn't conflict with some other non ACR usage of config1?
Yes, currently hw.config1 is only used to store ACR event indices.
Thanks.
>
>
> -Andi
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Patch v2 3/4] perf/x86/intel: Enable auto counter reload for DMR
[not found] <20260420024528.2130065-1-dapeng1.mi@linux.intel.com>
2026-04-20 2:45 ` [Patch v2 1/4] perf/x86/intel: Clear stale ACR mask before updating new mask Dapeng Mi
2026-04-20 2:45 ` [Patch v2 2/4] perf/x86/intel: Disable PMI for self-reloaded ACR events Dapeng Mi
@ 2026-04-20 2:45 ` Dapeng Mi
2 siblings, 0 replies; 7+ messages in thread
From: Dapeng Mi @ 2026-04-20 2:45 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Ian Rogers, Adrian Hunter, Alexander Shishkin,
Andi Kleen, Eranian Stephane
Cc: linux-kernel, linux-perf-users, Dapeng Mi, Zide Chen,
Falcon Thomas, Xudong Hao, Dapeng Mi, stable
Panther cove µarch starts to support auto counter reload (ACR), but the
static_call intel_pmu_enable_acr_event() is not updated for the Panther
Cove µarch used by DMR. It leads to the auto counter reload is not
really enabled on DMR.
Update static_call intel_pmu_enable_acr_event() in intel_pmu_init_pnc().
Cc: stable@vger.kernel.org
Fixes: d345b6bb8860 ("perf/x86/intel: Add core PMU support for DMR")
Signed-off-by: Dapeng Mi <dapeng1.mi@linux.intel.com>
---
V2: New patch.
arch/x86/events/intel/core.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 510b087c9e89..fa4073bf18fe 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -7506,6 +7506,7 @@ static __always_inline void intel_pmu_init_pnc(struct pmu *pmu)
hybrid(pmu, event_constraints) = intel_pnc_event_constraints;
hybrid(pmu, pebs_constraints) = intel_pnc_pebs_event_constraints;
hybrid(pmu, extra_regs) = intel_pnc_extra_regs;
+ static_call_update(intel_pmu_enable_acr_event, intel_pmu_enable_acr);
}
static __always_inline void intel_pmu_init_skt(struct pmu *pmu)
--
2.34.1
^ permalink raw reply related [flat|nested] 7+ messages in thread