From: Jacob Pan <jacob.jun.pan@linux.intel.com>
To: X86 Kernel <x86@kernel.org>, LKML <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Dave Hansen <dave.hansen@intel.com>,
"H. Peter Anvin" <hpa@zytor.com>,
"Ingo Molnar" <mingo@redhat.com>,
"Borislav Petkov" <bp@alien8.de>,
linux-perf-users@vger.kernel.org,
Peter Zijlstra <peterz@infradead.org>
Cc: Andi Kleen <andi.kleen@intel.com>, "Xin Li" <xin3.li@intel.com>,
Jacob Pan <jacob.jun.pan@linux.intel.com>
Subject: [PATCH 5/6] perf/x86: Enable NMI source reporting for perfmon
Date: Wed, 29 May 2024 13:33:24 -0700 [thread overview]
Message-ID: <20240529203325.3039243-6-jacob.jun.pan@linux.intel.com> (raw)
In-Reply-To: <20240529203325.3039243-1-jacob.jun.pan@linux.intel.com>
Program the designated NMI source vector into the performance monitoring
interrupt (PMI) of the local vector table. PMI handler will be directly
invoked when its NMI is generated. This avoids the latency of calling all
NMI handlers blindly.
Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
---
arch/x86/events/core.c | 8 ++++++--
arch/x86/events/intel/core.c | 6 +++---
arch/x86/include/asm/apic.h | 1 +
3 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
index 1ef2201e48ac..db8c30881f5c 100644
--- a/arch/x86/events/core.c
+++ b/arch/x86/events/core.c
@@ -46,6 +46,7 @@
struct x86_pmu x86_pmu __read_mostly;
static struct pmu pmu;
+u32 apic_perfmon_ctr = APIC_DM_NMI;
DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events) = {
.enabled = 1,
@@ -1680,7 +1681,7 @@ int x86_pmu_handle_irq(struct pt_regs *regs)
* This generic handler doesn't seem to have any issues where the
* unmasking occurs so it was left at the top.
*/
- apic_write(APIC_LVTPC, APIC_DM_NMI);
+ apic_write(APIC_LVTPC, apic_perfmon_ctr);
for (idx = 0; idx < x86_pmu.num_counters; idx++) {
if (!test_bit(idx, cpuc->active_mask))
@@ -1723,7 +1724,10 @@ void perf_events_lapic_init(void)
/*
* Always use NMI for PMU
*/
- apic_write(APIC_LVTPC, APIC_DM_NMI);
+ if (cpu_feature_enabled(X86_FEATURE_NMI_SOURCE))
+ apic_perfmon_ctr |= NMI_SOURCE_VEC_PMI;
+
+ apic_write(APIC_LVTPC, apic_perfmon_ctr);
}
static int
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 38c1b1f1deaa..b4a70457c678 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -3093,7 +3093,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
* NMI handler.
*/
if (!late_ack && !mid_ack)
- apic_write(APIC_LVTPC, APIC_DM_NMI);
+ apic_write(APIC_LVTPC, apic_perfmon_ctr);
intel_bts_disable_local();
cpuc->enabled = 0;
__intel_pmu_disable_all(true);
@@ -3130,7 +3130,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
done:
if (mid_ack)
- apic_write(APIC_LVTPC, APIC_DM_NMI);
+ apic_write(APIC_LVTPC, apic_perfmon_ctr);
/* Only restore PMU state when it's active. See x86_pmu_disable(). */
cpuc->enabled = pmu_enabled;
if (pmu_enabled)
@@ -3143,7 +3143,7 @@ static int intel_pmu_handle_irq(struct pt_regs *regs)
* Haswell CPUs.
*/
if (late_ack)
- apic_write(APIC_LVTPC, APIC_DM_NMI);
+ apic_write(APIC_LVTPC, apic_perfmon_ctr);
return handled;
}
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 9327eb00e96d..062a6edd36d3 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -59,6 +59,7 @@ extern int local_apic_timer_c2_ok;
extern bool apic_is_disabled;
extern unsigned int lapic_timer_period;
+extern u32 apic_perfmon_ctr;
extern enum apic_intr_mode_id apic_intr_mode;
enum apic_intr_mode_id {
--
2.25.1
next prev parent reply other threads:[~2024-05-29 20:28 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-29 20:33 [PATCH 0/6] Add support for NMI source reporting Jacob Pan
2024-05-29 20:33 ` [PATCH 1/6] x86/irq: Add enumeration of NMI source reporting CPU feature Jacob Pan
2024-05-29 20:49 ` H. Peter Anvin
2024-05-30 16:19 ` Jacob Pan
2024-05-30 20:39 ` Jacob Pan
2024-05-29 20:33 ` [PATCH 2/6] x86/irq: Extend NMI handler registration interface to include source Jacob Pan
2024-05-29 20:59 ` H. Peter Anvin
2024-05-30 17:49 ` Jacob Pan
2024-05-29 20:33 ` [PATCH 3/6] x86/irq: Factor out common NMI handling code Jacob Pan
2024-05-29 20:33 ` [PATCH 4/6] x86/irq: Process nmi sources in NMI handler Jacob Pan
2024-05-29 20:47 ` H. Peter Anvin
2024-05-30 16:10 ` Jacob Pan
2024-05-29 21:12 ` H. Peter Anvin
2024-05-30 17:52 ` Jacob Pan
2024-05-29 20:33 ` Jacob Pan [this message]
2024-05-29 20:33 ` [PATCH 6/6] x86/irq: Enable NMI source on IPIs delivered as NMI Jacob Pan
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=20240529203325.3039243-6-jacob.jun.pan@linux.intel.com \
--to=jacob.jun.pan@linux.intel.com \
--cc=andi.kleen@intel.com \
--cc=bp@alien8.de \
--cc=dave.hansen@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xin3.li@intel.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).