public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Alexander Nyberg <alexn@dsv.su.se>
To: Mikael Pettersson <mikpe@csd.uu.se>
Cc: akpm@osdl.org, linux-kernel@vger.kernel.org
Subject: Re: 2.6.12-rc2-mm3
Date: Mon, 18 Apr 2005 13:05:45 +0200	[thread overview]
Message-ID: <1113822345.365.14.camel@localhost.localdomain> (raw)
In-Reply-To: <200504172339.j3HNdIDF011543@harpo.it.uu.se>

[Proper patch now that goes all the way, sorry for spamming]

Patch below uses RETIRED_UOPS for a more constant rate of NMI sending.
This makes x64 deliver NMI interrupts every fourth second at a constant
rate when going through the local apic. Makes both cpus on my box to get
NMIs at constant rate that it previously did not, there could be long
delays when a CPU was idle.

This fixes misdetection in check_nmi_watchdog() that thought the NMI
sending was stuck although it was not because the perfctr did not
generate enough events with the previous mask. The 10-second
check_nmi_watchdog() delay is down to 10 msec now.

Tested on opteron SMP.


Index: x64_mm/arch/x86_64/kernel/nmi.c
===================================================================
--- x64_mm.orig/arch/x86_64/kernel/nmi.c	2005-04-18 12:56:05.000000000 +0200
+++ x64_mm/arch/x86_64/kernel/nmi.c	2005-04-18 14:47:14.000000000 +0200
@@ -59,16 +59,14 @@
 
 unsigned int nmi_watchdog = NMI_DEFAULT;
 static unsigned int nmi_hz = HZ;
+static int nmi_mult = 1;	/* nmi multiplier for longer intervals */
 unsigned int nmi_perfctr_msr;	/* the MSR to reset in NMI handler */
 
-/* Note that these events don't tick when the CPU idles. This means
-   the frequency varies with CPU load. */
-
 #define K7_EVNTSEL_ENABLE	(1 << 22)
 #define K7_EVNTSEL_INT		(1 << 20)
 #define K7_EVNTSEL_OS		(1 << 17)
 #define K7_EVNTSEL_USR		(1 << 16)
-#define K7_EVENT_CYCLES_PROCESSOR_IS_RUNNING	0x76
+#define K7_EVENT_CYCLES_PROCESSOR_IS_RUNNING	0xC1 /* Retired uops */
 #define K7_NMI_EVENT		K7_EVENT_CYCLES_PROCESSOR_IS_RUNNING
 
 #define P6_EVNTSEL0_ENABLE	(1 << 22)
@@ -78,6 +76,11 @@
 #define P6_EVENT_CPU_CLOCKS_NOT_HALTED	0x79
 #define P6_NMI_EVENT		P6_EVENT_CPU_CLOCKS_NOT_HALTED
 
+static inline unsigned long nmi_interval(void)
+{
+	return ((unsigned long)cpu_khz * 1000 * nmi_mult) / nmi_hz;
+}
+
 /* Run after command line and cpu_init init, but before all other checks */
 void __init nmi_watchdog_default(void)
 {
@@ -146,8 +149,10 @@
 
 	/* now that we know it works we can reduce NMI frequency to
 	   something more reasonable; makes a difference in some configs */
-	if (nmi_watchdog == NMI_LOCAL_APIC)
+	if (nmi_watchdog == NMI_LOCAL_APIC) {
 		nmi_hz = 1;
+		nmi_mult = 8;
+	}
 
 	return 0;
 }
@@ -305,9 +310,6 @@
 	int i;
 	unsigned int evntsel;
 
-	/* No check, so can start with slow frequency */
-	nmi_hz = 1; 
-
 	/* XXX should check these in EFER */
 
 	nmi_perfctr_msr = MSR_K7_PERFCTR0;
@@ -325,7 +327,7 @@
 		| K7_NMI_EVENT;
 
 	wrmsr(MSR_K7_EVNTSEL0, evntsel, 0);
-	wrmsrl(MSR_K7_PERFCTR0, -((u64)cpu_khz*1000) / nmi_hz);
+	wrmsrl(MSR_K7_PERFCTR0, -nmi_interval());
 	apic_write(APIC_LVTPC, APIC_DM_NMI);
 	evntsel |= K7_EVNTSEL_ENABLE;
 	wrmsr(MSR_K7_EVNTSEL0, evntsel, 0);
@@ -393,10 +395,10 @@
 	if (last_irq_sums[cpu] == sum) {
 		/*
 		 * Ayiee, looks like this CPU is stuck ...
-		 * wait a few IRQs (5 seconds) before doing the oops ...
+		 * wait a few NMIs before doing the oops ...
 		 */
 		alert_counter[cpu]++;
-		if (alert_counter[cpu] == 5*nmi_hz) {
+		if (alert_counter[cpu] == 3*nmi_hz) {
 			if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT)
 							== NOTIFY_STOP) {
 				alert_counter[cpu] = 0; 
@@ -409,7 +411,7 @@
 		alert_counter[cpu] = 0;
 	}
 	if (nmi_perfctr_msr)
-		wrmsr(nmi_perfctr_msr, -(cpu_khz/nmi_hz*1000), -1);
+		wrmsr(nmi_perfctr_msr, -nmi_interval(), -1);
 }
 
 static int dummy_nmi_callback(struct pt_regs * regs, int cpu)



  parent reply	other threads:[~2005-04-18 11:06 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-04-17 23:39 2.6.12-rc2-mm3 Mikael Pettersson
2005-04-18  9:56 ` 2.6.12-rc2-mm3 Alexander Nyberg
2005-04-18 11:05 ` Alexander Nyberg [this message]
2005-04-18 11:14   ` 2.6.12-rc2-mm3 Arjan van de Ven
2005-04-18 14:10     ` 2.6.12-rc2-mm3 Alexander Nyberg
  -- strict thread matches above, loose matches on Subject: below --
2005-04-18 22:27 2.6.12-rc2-mm3 Mikael Pettersson
2005-04-13 18:36 2.6.12-rc2-mm3 Stas Sergeev
2005-04-13 20:04 ` 2.6.12-rc2-mm3 Ingo Molnar
2005-04-14 16:38   ` 2.6.12-rc2-mm3 Stas Sergeev
2005-04-11  8:25 2.6.12-rc2-mm3 Andrew Morton
2005-04-11  8:56 ` 2.6.12-rc2-mm3 J.A. Magallon
2005-04-11  9:43   ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-11 21:59     ` 2.6.12-rc2-mm3 Borislav Petkov
2005-04-11 22:22       ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-12  4:20         ` 2.6.12-rc2-mm3 Stas Sergeev
2005-04-12  4:27           ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-12 12:22           ` 2.6.12-rc2-mm3 Borislav Petkov
2005-04-11 10:34 ` 2.6.12-rc2-mm3 Jan Dittmer
2005-04-11 17:33 ` 2.6.12-rc2-mm3 Benoit Boissinot
2005-04-11 19:11 ` 2.6.12-rc2-mm3 Jindrich Makovicka
2005-04-12  0:22   ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-12  8:21     ` 2.6.12-rc2-mm3 Jindrich Makovicka
2005-04-11 20:46 ` 2.6.12-rc2-mm3 Martin J. Bligh
2005-04-11 22:24   ` 2.6.12-rc2-mm3 Benoit Boissinot
2005-04-12 22:32     ` 2.6.12-rc2-mm3 Martin J. Bligh
2005-04-12  1:18 ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-12  2:09   ` 2.6.12-rc2-mm3 Benjamin Herrenschmidt
2005-04-12  3:26   ` 2.6.12-rc2-mm3 Benjamin Herrenschmidt
2005-04-12  4:42     ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-12  6:34       ` 2.6.12-rc2-mm3 Benjamin Herrenschmidt
2005-04-12 18:08         ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-12 22:40           ` 2.6.12-rc2-mm3 Benjamin Herrenschmidt
2005-04-13  1:44             ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-15 18:23   ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-15 23:23     ` 2.6.12-rc2-mm3 Benjamin Herrenschmidt
2005-04-17  8:40       ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-24  0:01         ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-24  1:59           ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-24  2:15             ` 2.6.12-rc2-mm3 Benjamin Herrenschmidt
2005-04-24  3:14               ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-24  4:25               ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-24  9:53               ` 2.6.12-rc2-mm3 Oleg Nesterov
2005-04-24 23:11                 ` 2.6.12-rc2-mm3 Juergen Kreileder
2005-04-25  0:09                   ` 2.6.12-rc2-mm3 Benjamin Herrenschmidt
2005-05-03  6:29                 ` 2.6.12-rc2-mm3 Andrew Morton
2005-05-03 10:42                   ` 2.6.12-rc2-mm3 Oleg Nesterov
2005-04-12  5:00 ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-12  5:51   ` 2.6.12-rc2-mm3 Nick Piggin
2005-04-12  6:19     ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-12  6:49       ` 2.6.12-rc2-mm3 Nick Piggin
2005-04-12  7:50         ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-12 19:03           ` 2.6.12-rc2-mm3 Steven Pratt
2005-04-12 17:01       ` 2.6.12-rc2-mm3 Steven Pratt
2005-04-12  7:06   ` 2.6.12-rc2-mm3 Jens Axboe
2005-04-12 11:32 ` 2.6.12-rc2-mm3 Ed Tomlinson
2005-04-12 11:39   ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-14  0:15     ` 2.6.12-rc2-mm3 Ed Tomlinson
2005-04-14  0:20       ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-14  0:38         ` 2.6.12-rc2-mm3 Ed Tomlinson
2005-04-14  0:54           ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-17 22:27 ` 2.6.12-rc2-mm3 Alexander Nyberg
2005-04-17 22:36 ` 2.6.12-rc2-mm3 Alexander Nyberg
2005-04-26  0:49 ` 2.6.12-rc2-mm3 Randy.Dunlap
2005-04-26  1:06   ` 2.6.12-rc2-mm3 Andrew Morton
2005-04-26  3:17   ` 2.6.12-rc2-mm3 Greg KH
2005-04-26 16:15     ` 2.6.12-rc2-mm3 Randy.Dunlap
2005-04-27 10:41 ` 2.6.12-rc2-mm3 Alexander Nyberg

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=1113822345.365.14.camel@localhost.localdomain \
    --to=alexn@dsv.su.se \
    --cc=akpm@osdl.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mikpe@csd.uu.se \
    /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