|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 4/5] x86/nmi: Check MSR_MISC_ENABLE for all Intel platforms
Right now it's only checked in setup_p4_watchdog(), and not in
setup_p6_watchdog().
Perform the check in the common Intel path in
setup_apic_nmi_watchdog(), and pass misc_enable as a parameter into
setup_p4_watchdog() to aoid reading it twice.
Fixes: 0dfba864fbff ("NMI watchdog support in Xen.")
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <jbeulich@xxxxxxxx>
CC: Roger Pau Monné <roger@xxxxxxxxxxxxxx>
CC: Teddy Astie <teddy.astie@xxxxxxxxxx>
I presume this bug went unnoticed because watchdog is off-by-default.
---
xen/arch/x86/nmi.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/xen/arch/x86/nmi.c b/xen/arch/x86/nmi.c
index d9d07870a333..a8b0d79c7cf2 100644
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -295,14 +295,8 @@ static void setup_p6_watchdog(unsigned counter)
wrmsrns(MSR_P6_EVNTSEL(0), evntsel);
}
-static void setup_p4_watchdog(void)
+static void setup_p4_watchdog(uint64_t misc_enable)
{
- uint64_t misc_enable;
-
- rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
- if ( !(misc_enable & MSR_IA32_MISC_ENABLE_PERF_AVAIL) )
- return;
-
nmi_perfctr_msr = MSR_P4_IQ_PERFCTR0;
nmi_p4_cccr_val = P4_NMI_IQ_CCCR0;
if ( boot_cpu_data.x86_num_siblings == 2 )
@@ -337,6 +331,8 @@ static void setup_p4_watchdog(void)
void setup_apic_nmi_watchdog(void)
{
+ uint64_t misc;
+
if ( nmi_watchdog == NMI_NONE )
return;
@@ -347,6 +343,14 @@ void setup_apic_nmi_watchdog(void)
break;
case X86_VENDOR_INTEL:
+ misc = rdmsr(MSR_IA32_MISC_ENABLE);
+
+ if ( !(misc & MSR_IA32_MISC_ENABLE_PERF_AVAIL) )
+ {
+ printk(XENLOG_WARNING "Intel Perfmon unavailable\n");
+ goto disable;
+ }
+
switch ( boot_cpu_data.family )
{
case 6:
@@ -355,7 +359,7 @@ void setup_apic_nmi_watchdog(void)
: CORE_EVENT_CPU_CLOCKS_NOT_HALTED);
break;
case 15:
- setup_p4_watchdog();
+ setup_p4_watchdog(misc);
break;
}
break;
@@ -363,6 +367,7 @@ void setup_apic_nmi_watchdog(void)
if ( nmi_perfctr_msr == 0 )
{
+ disable:
printk(XENLOG_WARNING "Failed to configure NMI watchdog\n");
nmi_watchdog = NMI_NONE;
return;
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |