NMI: Command line parameter for watchdog timeout
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 8 Mar 2012 09:23:27 +0000 (09:23 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 8 Mar 2012 09:23:27 +0000 (09:23 +0000)
Introduce a command parameter to set the watchtog timeout.  Manually
specifying "watchdog_timeout=<seconds>" on the command line will also
turn the watchdog on.  For consistency, move opt_watchdog into nmi.c
along with opt_watchdog_timeout.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Committed-by: Keir Fraser <keir@xen.org>
docs/misc/xen-command-line.markdown
xen/arch/x86/nmi.c
xen/arch/x86/setup.c
xen/include/asm-x86/nmi.h

index 986264cdf41492efda97e3a15defa7000191f532..61f5328bdf03bae294e0f640cd8917e3fbdad1ef 100644 (file)
@@ -391,7 +391,17 @@ The optional `keep` parameter causes Xen to continue using the vga console even
 ### watchdog
 > `= <boolean>`
 
-Run an NMI watchdog on each processor.  Defaults to disabled.
+> Default: `false`
+
+Run an NMI watchdog on each processor.  If a processor is stuck for longer than the watchdog\_timeout, a panic occurs.
+
+### watchdog\_timeout
+> `= <integer>`
+
+> Default: `5`
+
+Set the NMI watchdog timeout in seconds.  Specifying `0` will turn off the watchdog.
+
 ### x2apic
 ### x2apic\_phys
 ### xencons
index 2fd864e8683be6956a7543fc397d8819a98671da..4e2cd53b7543185f8542e102d5221f022b7cbee3 100644 (file)
@@ -40,6 +40,19 @@ static unsigned int nmi_p4_cccr_val;
 static DEFINE_PER_CPU(struct timer, nmi_timer);
 static DEFINE_PER_CPU(unsigned int, nmi_timer_ticks);
 
+/* opt_watchdog: If true, run a watchdog NMI on each processor. */
+bool_t __initdata opt_watchdog = 0;
+boolean_param("watchdog", opt_watchdog);
+
+/* opt_watchdog_timeout: Number of seconds to wait before panic. */
+static unsigned int opt_watchdog_timeout = 5;
+static void parse_watchdog_timeout(char * s)
+{
+    opt_watchdog_timeout = simple_strtoull(s, NULL, 0);
+    opt_watchdog = !!opt_watchdog_timeout;
+}
+custom_param("watchdog_timeout", parse_watchdog_timeout);
+
 /*
  * lapic_nmi_owner tracks the ownership of the lapic NMI hardware:
  * - it may be reserved by some other driver, or not
@@ -425,11 +438,11 @@ void nmi_watchdog_tick(struct cpu_user_regs * regs)
          !atomic_read(&watchdog_disable_count) )
     {
         /*
-         * Ayiee, looks like this CPU is stuck ... wait a few IRQs (5 seconds) 
+         * Ayiee, looks like this CPU is stuck ... wait for the timeout
          * before doing the oops ...
          */
         this_cpu(alert_counter)++;
-        if ( this_cpu(alert_counter) == 5*nmi_hz )
+        if ( this_cpu(alert_counter) == opt_watchdog_timeout*nmi_hz )
         {
             console_force_unlock();
             printk("Watchdog timer detects that CPU%d is stuck!\n",
index ae236c94c3e3bdd712be94ea2ae37daec8c45b03..b9da9851c9999982c6fee70c2d4f602254960562 100644 (file)
@@ -45,6 +45,7 @@
 #include <asm/mach-generic/mach_apic.h> /* for generic_apic_probe */
 #include <asm/setup.h>
 #include <xen/cpu.h>
+#include <asm/nmi.h>
 
 /* opt_nosmp: If true, secondary processors are ignored. */
 static bool_t __initdata opt_nosmp;
@@ -54,10 +55,6 @@ boolean_param("nosmp", opt_nosmp);
 static unsigned int __initdata max_cpus;
 integer_param("maxcpus", max_cpus);
 
-/* opt_watchdog: If true, run a watchdog NMI on each processor. */
-static bool_t __initdata opt_watchdog;
-boolean_param("watchdog", opt_watchdog);
-
 /* smep: Enable/disable Supervisor Mode Execution Protection (default on). */
 static bool_t __initdata disable_smep;
 invbool_param("smep", disable_smep);
index af1ff2e00865b58c9d66c1e263cd6d215229f444..98b5e04341bf0e047ef2c7f8179e84c80126c3db 100644 (file)
@@ -5,6 +5,9 @@
 #include <public/nmi.h>
 
 struct cpu_user_regs;
+
+/* Watchdog boolean from the command line */
+extern bool_t opt_watchdog;
  
 typedef int (*nmi_callback_t)(struct cpu_user_regs *regs, int cpu);