"watchdog_timeout=0" is documented to disable the watchdog. Make sure
this also is true when there's a subsequent "watchdog" command line
option (and no further "watchdog_timeout=" one).
While there also switch watchdog_setup() to returning void, bringing it
in line with the !CONFIG_WATCHDOG case. Further amend command line
documentation to also mention the implicit effect of specifying a non-
zero timeout.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
Alternatively "watchdog" following "watchdog_timeout=0" could be taken
to mean to use the default timeout again.
Really I think the comment in watchdog_setup() is wrong, and the
function would hence better go away. The CPU notifier registration can
surely be done in a pre-SMP initcall, which would have the benefit of
boot-time AP bringup then working the same as runtime CPU-onlining. (In
particular the set_timer() out of CPU_UP_PREPARE is a little suspicious,
as the timer can't possibly be run right away when a CPU isn't online
yet.) Which would leave __start_xen() to call watchdog_enable() in the
place it's calling watchdog_setup() now.
--- a/docs/misc/xen-command-line.pandoc
+++ b/docs/misc/xen-command-line.pandoc
@@ -2795,7 +2795,7 @@ unknown NMIs will still be processed.
> Default: `5`
Set the NMI watchdog timeout in seconds. Specifying `0` will turn off
-the watchdog.
+the watchdog. Specifying a non-zero value enables the watchdog.
### x2apic (x86)
> `= <boolean>`
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -473,7 +473,16 @@ bool watchdog_enabled(void)
return !atomic_read(&watchdog_disable_count);
}
-int __init watchdog_setup(void)
+void __init watchdog_configure(void)
+{
+ if ( !opt_watchdog_timeout )
+ opt_watchdog = false;
+
+ if ( opt_watchdog )
+ nmi_watchdog = NMI_LOCAL_APIC;
+}
+
+void __init watchdog_setup(void)
{
unsigned int cpu;
@@ -486,7 +495,6 @@ int __init watchdog_setup(void)
register_cpu_notifier(&cpu_nmi_nfb);
watchdog_enable();
- return 0;
}
/* Returns false if this was not a watchdog NMI, true otherwise */
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -1783,8 +1783,7 @@ void asmlinkage __init noreturn __start_
open_softirq(NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ, new_tlbflush_clock_period);
- if ( opt_watchdog )
- nmi_watchdog = NMI_LOCAL_APIC;
+ watchdog_configure();
find_smp_config();
--- a/xen/include/xen/watchdog.h
+++ b/xen/include/xen/watchdog.h
@@ -11,8 +11,11 @@
#ifdef CONFIG_WATCHDOG
+/* Configure what, if any, watchdog to (try to) use. */
+void watchdog_configure(void);
+
/* Try to set up a watchdog. */
-int watchdog_setup(void);
+void watchdog_setup(void);
/* Enable the watchdog. */
void watchdog_enable(void);
this also is true when there's a subsequent "watchdog" command line
option (and no further "watchdog_timeout=" one).
While there also switch watchdog_setup() to returning void, bringing it
in line with the !CONFIG_WATCHDOG case. Further amend command line
documentation to also mention the implicit effect of specifying a non-
zero timeout.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
Alternatively "watchdog" following "watchdog_timeout=0" could be taken
to mean to use the default timeout again.
Really I think the comment in watchdog_setup() is wrong, and the
function would hence better go away. The CPU notifier registration can
surely be done in a pre-SMP initcall, which would have the benefit of
boot-time AP bringup then working the same as runtime CPU-onlining. (In
particular the set_timer() out of CPU_UP_PREPARE is a little suspicious,
as the timer can't possibly be run right away when a CPU isn't online
yet.) Which would leave __start_xen() to call watchdog_enable() in the
place it's calling watchdog_setup() now.
--- a/docs/misc/xen-command-line.pandoc
+++ b/docs/misc/xen-command-line.pandoc
@@ -2795,7 +2795,7 @@ unknown NMIs will still be processed.
> Default: `5`
Set the NMI watchdog timeout in seconds. Specifying `0` will turn off
-the watchdog.
+the watchdog. Specifying a non-zero value enables the watchdog.
### x2apic (x86)
> `= <boolean>`
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -473,7 +473,16 @@ bool watchdog_enabled(void)
return !atomic_read(&watchdog_disable_count);
}
-int __init watchdog_setup(void)
+void __init watchdog_configure(void)
+{
+ if ( !opt_watchdog_timeout )
+ opt_watchdog = false;
+
+ if ( opt_watchdog )
+ nmi_watchdog = NMI_LOCAL_APIC;
+}
+
+void __init watchdog_setup(void)
{
unsigned int cpu;
@@ -486,7 +495,6 @@ int __init watchdog_setup(void)
register_cpu_notifier(&cpu_nmi_nfb);
watchdog_enable();
- return 0;
}
/* Returns false if this was not a watchdog NMI, true otherwise */
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -1783,8 +1783,7 @@ void asmlinkage __init noreturn __start_
open_softirq(NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ, new_tlbflush_clock_period);
- if ( opt_watchdog )
- nmi_watchdog = NMI_LOCAL_APIC;
+ watchdog_configure();
find_smp_config();
--- a/xen/include/xen/watchdog.h
+++ b/xen/include/xen/watchdog.h
@@ -11,8 +11,11 @@
#ifdef CONFIG_WATCHDOG
+/* Configure what, if any, watchdog to (try to) use. */
+void watchdog_configure(void);
+
/* Try to set up a watchdog. */
-int watchdog_setup(void);
+void watchdog_setup(void);
/* Enable the watchdog. */
void watchdog_enable(void);