Skip to contentSkip to conversation

perfctr: don't use CCCR_OVF_PMI1 on Pentium 4Ds

PATCH Applied Aristeu Rozanski 2 participants 6 messages Aug 14, 2008 – Aug 15, 2008 x86

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 perfctr: don't use CCCR_OVF_PMI1 on Pentium 4Ds

Currently, setup_p4_watchdog() use CCCR_OVF_PMI1 to enable the counter overflow interrupts to the second logical core. But this bit doesn't work on Pentium 4 Ds (model 4, stepping 4) and this patch avoids its use on these processors. Tested on 4 different machines that have this specific model with success.

---
 arch/x86/kernel/cpu/perfctr-watchdog.c |    8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
arch/x86/kernel/cpu/perfctr-watchdog.c +7 -1
@@ -478,7 +478,13 @@ static int setup_p4_watchdog(unsigned nm
 		perfctr_msr = MSR_P4_IQ_PERFCTR1;
 		evntsel_msr = MSR_P4_CRU_ESCR0;
 		cccr_msr = MSR_P4_IQ_CCCR1;
-		cccr_val = P4_CCCR_OVF_PMI1 | P4_CCCR_ESCR_SELECT(4);
+
+		/* Pentium 4 D processors don't support P4_CCCR_OVF_PMI1 */
+		if (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask == 4)
+			cccr_val = P4_CCCR_OVF_PMI0;
+		else
+			cccr_val = P4_CCCR_OVF_PMI1;
+		cccr_val |= P4_CCCR_ESCR_SELECT(4);
 	}
 
 	evntsel = P4_ESCR_EVENT_SELECT(0x3F)
Applied
#1 lore raw
Quoted 4 lines · Aristeu Rozanski

Currently, setup_p4_watchdog() use CCCR_OVF_PMI1 to enable the counter overflow interrupts to the second logical core. But this bit doesn't work on Pentium 4 Ds (model 4, stepping 4) and this patch avoids its use on these processors. [...]

btw., what was the effect - an oops on bootup, or a non-working watchdog?

Quoted 4 lines

[...] Tested on 4 different machines that have this specific model with success.

applied to tip/x86/urgent - thanks Aristeu.

Ingo

#2 lore raw

Hi Ingo,

Quoted 7 lines
Quoted 4 lines

Currently, setup_p4_watchdog() use CCCR_OVF_PMI1 to enable the counter overflow interrupts to the second logical core. But this bit doesn't work on Pentium 4 Ds (model 4, stepping 4) and this patch avoids its use on these processors. [...]

btw., what was the effect - an oops on bootup, or a non-working watchdog?

it just won't work at boot time - the second logic unit will be stuck:

Booting processor 1/2 APIC 0x1
Initializing CPU#1
Calibrating delay using timer specific routine.. 5586.12 BogoMIPS (lpj=2793063)
CPU: Trace cache: 12K uops, L1 D cache: 16K
CPU: L2 cache: 1024K
CPU: Physical Processor ID: 0
CPU: Processor Core ID: 1
CPU1: Thermal monitoring enabled (TM1)
Intel(R) Pentium(R) D CPU 2.80GHz stepping 04
Brought up 2 CPUs
testing NMI watchdog ... <4>WARNING: CPU#1: NMI appears to be stuck (0->0)!

Signature · 1 line
Aristeu
#3 lore raw

PATCH 1/1 NMI: fix watchdog failure message

Quoted 13 lines

it just won't work at boot time - the second logic unit will be stuck:

Booting processor 1/2 APIC 0x1
Initializing CPU#1
Calibrating delay using timer specific routine.. 5586.12 BogoMIPS (lpj=2793063)
CPU: Trace cache: 12K uops, L1 D cache: 16K
CPU: L2 cache: 1024K
CPU: Physical Processor ID: 0
CPU: Processor Core ID: 1
CPU1: Thermal monitoring enabled (TM1)
Intel(R) Pentium(R) D CPU 2.80GHz stepping 04
Brought up 2 CPUs
testing NMI watchdog ... <4>WARNING: CPU#1: NMI appears to be stuck (0->0)!

while at it...

---
 arch/x86/kernel/nmi.c |    4 ++++
 1 file changed, 4 insertions(+)
arch/x86/kernel/nmi.c +4 -0
@@ -142,11 +142,15 @@ int __init check_nmi_watchdog(void)
 		if (!per_cpu(wd_enabled, cpu))
 			continue;
 		if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) {
+			printk("\n");
 			printk(KERN_WARNING "WARNING: CPU#%d: NMI "
 				"appears to be stuck (%d->%d)!\n",
 				cpu,
 				prev_nmi_count[cpu],
 				get_nmi_count(cpu));
+			printk(KERN_WARNING "Please report this to "
+			       "[email protected] and attach "
+			       "the output of 'dmesg' command.\n");
 			per_cpu(wd_enabled, cpu) = 0;
 			atomic_dec(&nmi_active);
 		}
Applied
#4 lore raw

Re: [PATCH] NMI: fix watchdog failure message

Quoted 13 lines · Aristeu Rozanski
Quoted 13 lines

it just won't work at boot time - the second logic unit will be stuck:

Booting processor 1/2 APIC 0x1
Initializing CPU#1
Calibrating delay using timer specific routine.. 5586.12 BogoMIPS (lpj=2793063)
CPU: Trace cache: 12K uops, L1 D cache: 16K
CPU: L2 cache: 1024K
CPU: Physical Processor ID: 0
CPU: Processor Core ID: 1
CPU1: Thermal monitoring enabled (TM1)
Intel(R) Pentium(R) D CPU 2.80GHz stepping 04
Brought up 2 CPUs
testing NMI watchdog ... <4>WARNING: CPU#1: NMI appears to be stuck (0->0)!

Quoted 3 lines

while at it...

applied to tip/x86/urgent, thanks Aristeu.

I've also done the cleanup below - those ugly linebreaks are gone this way as well.

Ingo

---------------------->

Quoted 1 line

From 8bb851900f5d0a79d3fddac808cc670d9894ef67 Mon Sep 17 00:00:00 2001

From: Ingo Molnar <[email protected]>
Date: Fri, 15 Aug 2008 15:34:32 +0200
Subject: [PATCH] x86, nmi: clean UP NMI watchdog failure message

clean up the failure message - and redirect people to bugzilla instead of lkml.

---
 arch/x86/kernel/nmi.c |   32 +++++++++++++++++++-------------
 1 files changed, 19 insertions(+), 13 deletions(-)
arch/x86/kernel/nmi.c +19 -13
index 919473a..abb78a2 100644
@@ -114,6 +114,23 @@ static __init void nmi_cpu_busy(void *data)
 }
 #endif
 
+static void report_broken_nmi(int cpu, int *prev_nmi_count)
+{
+	printk(KERN_CONT "\n");
+
+	printk(KERN_WARNING
+		"WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n",
+			cpu, prev_nmi_count[cpu], get_nmi_count(cpu));
+
+	printk(KERN_WARNING
+		"Please report this to bugzilla.kernel.org,\n");
+	printk(KERN_WARNING
+		"and attach the output of the 'dmesg' command.\n");
+
+	per_cpu(wd_enabled, cpu) = 0;
+	atomic_dec(&nmi_active);
+}
+
 int __init check_nmi_watchdog(void)
 {
 	unsigned int *prev_nmi_count;
@@ -141,19 +158,8 @@ int __init check_nmi_watchdog(void)
 	for_each_online_cpu(cpu) {
 		if (!per_cpu(wd_enabled, cpu))
 			continue;
-		if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) {
-			printk("\n");
-			printk(KERN_WARNING "WARNING: CPU#%d: NMI "
-				"appears to be stuck (%d->%d)!\n",
-				cpu,
-				prev_nmi_count[cpu],
-				get_nmi_count(cpu));
-			printk(KERN_WARNING "Please report this to "
-			       "[email protected] and attach "
-			       "the output of 'dmesg' command.\n");
-			per_cpu(wd_enabled, cpu) = 0;
-			atomic_dec(&nmi_active);
-		}
+		if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5)
+			report_broken_nmi(cpu, prev_nmi_count);
 	}
 	endflag = 1;
 	if (!atomic_read(&nmi_active)) {
#5 lore raw

Re: [PATCH] NMI: fix watchdog failure message

Quoted 4 lines

applied to tip/x86/urgent, thanks Aristeu.

I've also done the cleanup below - those ugly linebreaks are gone this way as well.

a lot better. thanks Ingo

Signature · 1 line
Aristeu