Improve watchdog config for arch watchdogs
Subsystems (6)
Nicholas Piggin
reviewercover Improve watchdog config for arch watchdogs
Hi Don,
These first 4 patches are a further progression of my effort to make some of the hard lockup watchdog framework usable by arch code NMI watchdog.
The last patch is a powerpc-specific implementation for reference to see how I'm using the changes.
Thanks,
Nick
Nicholas Piggin (5):
watchdog: remove unused declaration
watchdog: introduce arch_touch_nmi_watchdog()
watchdog: split up config options
watchdog: provide watchdog_reconfigure() for arch watchdogs powerpc/64s: SMP hardlockup watchdog
arch/blackfin/include/asm/nmi.h | 2 + arch/blackfin/kernel/nmi.c | 2 +- arch/mn10300/include/asm/nmi.h | 2 + arch/mn10300/kernel/mn10300-watchdog-low.S | 8 +- arch/mn10300/kernel/mn10300-watchdog.c | 2 +- arch/powerpc/Kconfig | 3 +- arch/powerpc/include/asm/nmi.h | 8 + arch/powerpc/include/asm/smp.h | 2 + arch/powerpc/kernel/Makefile | 1 + arch/powerpc/kernel/kvm.c | 7 + arch/powerpc/kernel/setup_64.c | 19 -- arch/powerpc/kernel/smp.c | 20 +- arch/powerpc/kernel/watchdog.c | 332 +++++++++++++++++++++++++++++ arch/sparc/include/asm/nmi.h | 1 + arch/sparc/kernel/nmi.c | 6 +- arch/x86/kernel/apic/hw_nmi.c | 2 +- include/linux/nmi.h | 58 +++-- kernel/Makefile | 2 +- kernel/sysctl.c | 18 +- kernel/watchdog.c | 262 +++++++++++++++-------- kernel/watchdog_hld.c | 37 +--- lib/Kconfig.debug | 27 ++- 22 files changed, 631 insertions(+), 190 deletions(-) create mode 100644 arch/powerpc/kernel/watchdog.c
Signature · 1 line
2.11.0
Nicholas Piggin
reviewerPATCH 1/5 watchdog: remove unused declaration
--- include/linux/nmi.h | 3 --- 1 file changed, 3 deletions(-)
include/linux/nmi.h +0 -3
@@ -12,9 +12,6 @@ extern void touch_softlockup_watchdog_sched(void);extern void touch_softlockup_watchdog (void );extern void touch_softlockup_watchdog_sync (void );extern void touch_all_softlockup_watchdogs (void ); -extern int proc_dowatchdog_thresh (struct ctl_table *table,int write, -void __user *buffer, -size_t *lenp,loff_t *ppos);extern unsigned int softlockup_panic;extern unsigned int hardlockup_panic;void lockup_detector_init (void );
Signature · 1 line
2.11.0
Nicholas Piggin
reviewerPATCH 2/5 watchdog: Introduce arch_touch_nmi_watchdog()
In reply to Nicholas PigginFor architectures that define HAVE_NMI_WATCHDOG, instead of having them provide the complete touch_nmi_watchdog() function, just have them provide arch_touch_nmi_watchdog().
This gives the generic code more flexibility in implementing this function, and arch implementations don't miss out on touching the softlockup watchdog or other generic details.
--- arch/blackfin/include/asm/nmi.h | 2 ++ arch/blackfin/kernel/nmi.c | 2 +- arch/mn10300/include/asm/nmi.h | 2 ++ arch/mn10300/kernel/mn10300-watchdog-low.S | 8 ++++---- arch/mn10300/kernel/mn10300-watchdog.c | 2 +- arch/sparc/include/asm/nmi.h | 1 + arch/sparc/kernel/nmi.c | 6 ++---- include/linux/nmi.h | 26 +++++++++++++++----------- kernel/watchdog_hld.c | 5 ++--- 9 files changed, 30 insertions(+), 24 deletions(-)
arch/blackfin/include/asm/nmi.h +2 -0
@@ -7,6 +7,8 @@#ifndef _BFIN_NMI_H_#define _BFIN_NMI_H_ +void arch_touch_nmi_watchdog (void ); +#include <linux/nmi.h> #endif
arch/blackfin/kernel/nmi.c +1 -1
@@ -190,7 +190,7 @@ static int __init init_nmi_wdt(void) }device_initcall (init_nmi_wdt); -void touch_nmi_watchdog (void ) +void arch_touch_nmi_watchdog (void ) {atomic_set (&nmi_touched[smp_processor_id ()],1 ); }
arch/mn10300/include/asm/nmi.h +2 -0
@@ -11,4 +11,6 @@#ifndef _ASM_NMI_H#define _ASM_NMI_H +void arch_touch_nmi_watchdog (void ); +#endif /* _ASM_NMI_H */
arch/mn10300/kernel/mn10300-watchdog-low.S +4 -4
@@ -50,9 +50,9 @@ watchdog_handler: # we can't inline it) # ############################################################################### - .globl touch_nmi_watchdog - .type touch_nmi_watchdog,@function -touch_nmi_watchdog: + .globl arch_touch_nmi_watchdog + .type arch_touch_nmi_watchdog,@function +arch_touch_nmi_watchdog: clr d0 clr d1 mov watchdog_alert_counter, a0
@@ -63,4 +63,4 @@ touch_nmi_watchdog: lne ret [],0 - .size touch_nmi_watchdog,.-touch_nmi_watchdog + .size arch_touch_nmi_watchdog,.-arch_touch_nmi_watchdog
arch/mn10300/kernel/mn10300-watchdog.c +1 -1
@@ -31,7 +31,7 @@ static unsigned int watchdog;static unsigned int watchdog_hz =1 ;unsigned int watchdog_alert_counter[NR_CPUS ]; -EXPORT_SYMBOL (touch_nmi_watchdog); +EXPORT_SYMBOL (arch_touch_nmi_watchdog);/* * the best way to detect whether a CPU has a 'hard lockup' problem
arch/sparc/include/asm/nmi.h +1 -0
@@ -7,6 +7,7 @@ void nmi_adjust_hz(unsigned int new_hz);extern atomic_t nmi_active; +void arch_touch_nmi_watchdog (void );void start_nmi_watchdog (void *unused);void stop_nmi_watchdog (void *unused);
arch/sparc/kernel/nmi.c +2 -4
@@ -51,7 +51,7 @@ static DEFINE_PER_CPU(unsigned int, last_irq_sum); static DEFINE_PER_CPU(long, alert_counter); static DEFINE_PER_CPU(int, nmi_touch); -void touch_nmi_watchdog (void ) +void arch_touch_nmi_watchdog (void ) {if (atomic_read (&nmi_active)) {int cpu;
@@ -61,10 +61,8 @@ void touch_nmi_watchdog(void)per_cpu (nmi_touch, cpu) =1 ; } } - -touch_softlockup_watchdog (); } -EXPORT_SYMBOL (touch_nmi_watchdog); +EXPORT_SYMBOL (arch_touch_nmi_watchdog);static void die_nmi (const char *str,struct pt_regs *regs,int do_panic) {
include/linux/nmi.h +15 -11
@@ -6,6 +6,9 @@#include <linux/sched.h> #include <asm/irq.h> +#if defined(CONFIG_HAVE_NMI_WATCHDOG ) || defined(CONFIG_HARDLOCKUP_DETECTOR ) +#include <asm/nmi.h> +#endif #ifdef CONFIG_LOCKUP_DETECTOR extern void touch_softlockup_watchdog_sched (void );
@@ -58,6 +61,14 @@ static inline void reset_hung_task_detector(void)#define NMI_WATCHDOG_ENABLED (1 << NMI_WATCHDOG_ENABLED_BIT)#define SOFT_WATCHDOG_ENABLED (1 << SOFT_WATCHDOG_ENABLED_BIT) +#if defined(CONFIG_HARDLOCKUP_DETECTOR ) +extern void hld_touch_nmi_watchdog (void ); +extern void hardlockup_detector_disable (void ); +#else +static inline void hld_touch_nmi_watchdog (void ) {} +static inline void hardlockup_detector_disable (void ) {} +#endif +/** * touch_nmi_watchdog - restart NMI watchdog timeout. *
@@ -65,21 +76,14 @@ static inline void reset_hung_task_detector(void)* may be used to reset the timeout - for code which intentionally * disables interrupts for a long time. This call is stateless. */ -#if defined(CONFIG_HAVE_NMI_WATCHDOG ) || defined(CONFIG_HARDLOCKUP_DETECTOR ) -#include <asm/nmi.h> -extern void touch_nmi_watchdog (void ); -#else static inline void touch_nmi_watchdog (void ) { +#if defined(CONFIG_HAVE_NMI_WATCHDOG ) +arch_touch_nmi_watchdog (); +#endif +hld_touch_nmi_watchdog ();touch_softlockup_watchdog (); } -#endif - -#if defined(CONFIG_HARDLOCKUP_DETECTOR ) -extern void hardlockup_detector_disable (void ); -#else -static inline void hardlockup_detector_disable (void ) {} -#endif /* * Create trigger_all_cpu_backtrace() out of the arch-provided
kernel/watchdog_hld.c +2 -3
@@ -56,7 +56,7 @@ static int __init hardlockup_panic_setup(char *str) }__setup ("nmi_watchdog=" , hardlockup_panic_setup); -void touch_nmi_watchdog (void ) +void hld_touch_nmi_watchdog (void ) {/* * Using __raw here because some code paths have
@@ -66,9 +66,8 @@ void touch_nmi_watchdog(void)* going off. */ raw_cpu_write (watchdog_nmi_touch, true); -touch_softlockup_watchdog (); } -EXPORT_SYMBOL (touch_nmi_watchdog); +EXPORT_SYMBOL (hld_touch_nmi_watchdog);static struct perf_event_attr wd_hw_attr = { .type =PERF_TYPE_HARDWARE ,
Signature · 1 line
2.11.0
Nicholas Piggin
reviewerPATCH 3/5 watchdog: Split up config options
In reply to Nicholas PigginSplit SOFTLOCKUP_DETECTOR from LOCKUP_DETECTOR, and split HARDLOCKUP_DETECTOR_PERF from HARDLOCKUP_DETECTOR.
LOCKUP_DETECTOR provides the boot, sysctl, and programming interfaces for lockup detectors. An architecture that defines HAVE_NMI_WATCHDOG need not use this this if it has a very basic watchdog or uses its own options and interfaces (e.g., sparc). touch_nmi_watchdog() will continue to call their arch_touch_nmi_watchdog().
HARDLOCKUP_DETECTOR_PERF is the perf-based lockup detector.
HARDLOCKUP_DETECTOR is the framework for arch NMI_WATCHDOG hard lockup detectors that conform to the LOCKUP_DETECTOR interfaces.
--- arch/powerpc/kernel/setup_64.c | 2 +- arch/x86/kernel/apic/hw_nmi.c | 2 +- include/linux/nmi.h | 35 ++++-- kernel/Makefile | 2 +- kernel/sysctl.c | 18 ++-- kernel/watchdog.c | 238 ++++++++++++++++++++++++++--------------- kernel/watchdog_hld.c | 32 ------ lib/Kconfig.debug | 27 +++-- 8 files changed, 212 insertions(+), 144 deletions(-)
arch/powerpc/kernel/setup_64.c +1 -1
@@ -727,7 +727,7 @@ struct ppc_pci_io ppc_pci_io;EXPORT_SYMBOL (ppc_pci_io);#endif -#ifdef CONFIG_HARDLOCKUP_DETECTOR +#ifdef CONFIG_HARDLOCKUP_DETECTOR_PERF u64 hw_nmi_get_sample_period (int watchdog_thresh) {return ppc_proc_freq * watchdog_thresh;
arch/x86/kernel/apic/hw_nmi.c +1 -1
@@ -19,7 +19,7 @@#include <linux/init.h> #include <linux/delay.h> -#ifdef CONFIG_HARDLOCKUP_DETECTOR +#ifdef CONFIG_HARDLOCKUP_DETECTOR_PERF u64 hw_nmi_get_sample_period (int watchdog_thresh) {return (u64)(cpu_khz) *1000 * watchdog_thresh;
include/linux/nmi.h +24 -11
@@ -11,13 +11,21 @@#endif #ifdef CONFIG_LOCKUP_DETECTOR +void lockup_detector_init (void ); +#else +static inline void lockup_detector_init (void ) +{ +} +#endif + +#ifdef CONFIG_SOFTLOCKUP_DETECTOR extern void touch_softlockup_watchdog_sched (void );extern void touch_softlockup_watchdog (void );extern void touch_softlockup_watchdog_sync (void );extern void touch_all_softlockup_watchdogs (void );extern unsigned int softlockup_panic; -extern unsigned int hardlockup_panic; -void lockup_detector_init (void ); +extern int soft_watchdog_enabled; +extern atomic_t watchdog_park_in_progress;#else static inline void touch_softlockup_watchdog_sched (void ) {
@@ -31,9 +39,6 @@ static inline void touch_softlockup_watchdog_sync(void)static inline void touch_all_softlockup_watchdogs (void ) { } -static inline void lockup_detector_init (void ) -{ -}#endif #ifdef CONFIG_DETECT_HUNG_TASK
@@ -61,14 +66,19 @@ static inline void reset_hung_task_detector(void)#define NMI_WATCHDOG_ENABLED (1 << NMI_WATCHDOG_ENABLED_BIT)#define SOFT_WATCHDOG_ENABLED (1 << SOFT_WATCHDOG_ENABLED_BIT) -#if defined(CONFIG_HARDLOCKUP_DETECTOR ) -extern void hld_touch_nmi_watchdog (void ); +#ifdef CONFIG_HARDLOCKUP_DETECTOR extern void hardlockup_detector_disable (void ); +extern unsigned int hardlockup_panic;#else -static inline void hld_touch_nmi_watchdog (void ) {}static inline void hardlockup_detector_disable (void ) {}#endif +#ifdef CONFIG_HARDLOCKUP_DETECTOR_PERF +extern void hld_touch_nmi_watchdog (void ); +#else +static inline void hld_touch_nmi_watchdog (void ) {} +#endif +/** * touch_nmi_watchdog - restart NMI watchdog timeout. *
@@ -140,15 +150,18 @@ static inline bool trigger_single_cpu_backtrace(int cpu) }#endif -#ifdef CONFIG_LOCKUP_DETECTOR +#ifdef CONFIG_HARDLOCKUP_DETECTOR_PERF u64 hw_nmi_get_sample_period (int watchdog_thresh); +#endif + +#ifdef CONFIG_LOCKUP_DETECTOR extern int nmi_watchdog_enabled; -extern int soft_watchdog_enabled;extern int watchdog_user_enabled;extern int watchdog_thresh;extern unsigned long watchdog_enabled; +extern struct cpumask watchdog_cpumask;extern unsigned long *watchdog_cpumask_bits; -extern atomic_t watchdog_park_in_progress; +extern int __read_mostly watchdog_suspended;#ifdef CONFIG_SMP extern int sysctl_softlockup_all_cpu_backtrace;extern int sysctl_hardlockup_all_cpu_backtrace;
kernel/Makefile +1 -1
@@ -82,7 +82,7 @@ obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_KGDB) += debug/ obj-$(CONFIG_DETECT_HUNG_TASK) += hung_task.o obj-$(CONFIG_LOCKUP_DETECTOR) += watchdog.o -obj-$(CONFIG_HARDLOCKUP_DETECTOR) += watchdog_hld.o +obj-$(CONFIG_HARDLOCKUP_DETECTOR_PERF) += watchdog_hld.o obj-$(CONFIG_SECCOMP) += seccomp.o obj-$(CONFIG_RELAY) += relay.o obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
kernel/sysctl.c +10 -8
@@ -873,13 +873,21 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = proc_nmi_watchdog, .extra1 = &zero, -#if defined(CONFIG_HAVE_NMI_WATCHDOG ) || defined(CONFIG_HARDLOCKUP_DETECTOR ) +#ifdef CONFIG_HARDLOCKUP_DETECTOR .extra2 = &one, #else .extra2 = &zero, #endif }, { + .procname ="watchdog_cpumask" , + .data = &watchdog_cpumask_bits, + .maxlen = NR_CPUS, + .mode = 0644, + .proc_handler = proc_watchdog_cpumask, + }, +#ifdef CONFIG_SOFTLOCKUP_DETECTOR + { .procname ="soft_watchdog" , .data = &soft_watchdog_enabled, .maxlen = sizeof (int),
@@ -889,13 +897,6 @@ static struct ctl_table kern_table[] = { .extra2 = &one, }, { - .procname = "watchdog_cpumask", - .data = &watchdog_cpumask_bits, - .maxlen = NR_CPUS, - .mode = 0644, - .proc_handler = proc_watchdog_cpumask, - }, - { .procname = "softlockup_panic", .data = &softlockup_panic, .maxlen = sizeof(int),
@@ -904,6 +905,7 @@ static struct ctl_table kern_table[] = { .extra1 = &zero, .extra2 = &one, }, +#endif #ifdef CONFIG_HARDLOCKUP_DETECTOR { .procname = "hardlockup_panic",
kernel/watchdog.c +154 -84
314 lines not on this page · raw message
kernel/watchdog_hld.c +0 -32
@@ -22,39 +22,7 @@ static DEFINE_PER_CPU(bool, hard_watchdog_warn); static DEFINE_PER_CPU(bool, watchdog_nmi_touch); static DEFINE_PER_CPU(struct perf_event *, watchdog_ev); -/* boot commands */ -/* -* Should we panic when a soft-lockup or hard-lockup occurs: -*/ -unsigned int __read_mostly hardlockup_panic = -CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE ;static unsigned long hardlockup_allcpu_dumped; -/* -* We may not want to enable hard lockup detection by default in all cases, -* for example when running the kernel as a guest on a hypervisor. In these -* cases this function can be called to disable hard lockup detection. This -* function should only be executed once by the boot processor before the -* kernel command line parameters are parsed, because otherwise it is not -* possible to override this in hardlockup_panic_setup(). -*/ -void hardlockup_detector_disable (void ) -{ - watchdog_enabled &= ~NMI_WATCHDOG_ENABLED ; -} - -static int __init hardlockup_panic_setup (char *str) -{ -if (!strncmp (str,"panic" ,5 )) - hardlockup_panic =1 ; -else if (!strncmp (str,"nopanic" ,7 )) - hardlockup_panic =0 ; -else if (!strncmp (str,"0" ,1 )) - watchdog_enabled &= ~NMI_WATCHDOG_ENABLED ; -else if (!strncmp (str,"1" ,1 )) - watchdog_enabled |=NMI_WATCHDOG_ENABLED ; -return 1 ; -} -__setup ("nmi_watchdog=" , hardlockup_panic_setup);void hld_touch_nmi_watchdog (void ) {
lib/Kconfig.debug +21 -6
@@ -801,10 +801,25 @@ config LOCKUP_DETECTOR The frequency of hrtimer and NMI events and the soft and hard lockup thresholds can be controlled through the sysctl watchdog_thresh. +config SOFTLOCKUP_DETECTOR + bool "Detect Soft Lockups" + depends on LOCKUP_DETECTOR + +config HARDLOCKUP_DETECTOR_PERF + bool + select SOFTLOCKUP_DETECTOR + +# +# arch/ can define HAVE_NMI_WATCHDOG to provide their own NMI watchdog +# rather than the perf based detector. +# +# The arch may do its own thing, or select HARDLOCKUP_DETECTOR, which +# config HARDLOCKUP_DETECTOR - def_bool y - depends on LOCKUP_DETECTOR && !HAVE_NMI_WATCHDOG - depends on PERF_EVENTS && HAVE_PERF_EVENTS_NMI + bool "Detect Hard Lockups" + depends on LOCKUP_DETECTOR + depends on !HAVE_NMI_WATCHDOG || (PERF_EVENTS && HAVE_PERF_EVENTS_NMI) + select HARDLOCKUP_DETECTOR_PERF if !HAVE_NMI_WATCHDOG config BOOTPARAM_HARDLOCKUP_PANIC bool "Panic (Reboot) On Hard Lockups"
@@ -826,7 +841,7 @@ config BOOTPARAM_HARDLOCKUP_PANIC_VALUE config BOOTPARAM_SOFTLOCKUP_PANIC bool "Panic (Reboot) On Soft Lockups" - depends on LOCKUP_DETECTOR + depends on SOFTLOCKUP_DETECTOR help Say Y here to enable the kernel to panic on "soft lockups", which are bugs that cause the kernel to loop in kernel
@@ -843,7 +858,7 @@ config BOOTPARAM_SOFTLOCKUP_PANIC config BOOTPARAM_SOFTLOCKUP_PANIC_VALUE int - depends on LOCKUP_DETECTOR + depends on SOFTLOCKUP_DETECTOR range 0 1 default 0 if !BOOTPARAM_SOFTLOCKUP_PANIC default 1 if BOOTPARAM_SOFTLOCKUP_PANIC
@@ -851,7 +866,7 @@ config BOOTPARAM_SOFTLOCKUP_PANIC_VALUE config DETECT_HUNG_TASK bool "Detect Hung Tasks" depends on DEBUG_KERNEL - default LOCKUP_DETECTOR + default SOFTLOCKUP_DETECTOR help Say Y here to enable the kernel to detect "hung tasks", which are bugs that cause the task to be stuck in
Signature · 1 line
2.11.0
kbuild test robot
build botRe: [PATCH 3/5] watchdog: Split up config options
url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/Improve-watchdog-config-for-arch-watchdogs/20170523-200254 config: alpha-allmodconfig (attached as .config) compiler…
Hi Nicholas,
[auto build test ERROR on linus/master]
[also build test ERROR on v4.12-rc2 next-20170523]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/Improve-watchdog-config-for-arch-watchdogs/20170523-200254
config: alpha-allmodconfig (attached as .config)
compiler: alpha-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=alpha
All errors (new ones prefixed by >>):
In file included from drivers/tty/sysrq.c:31:0:
>> include/linux/nmi.h:10:21: fatal error: asm/nmi.h: No such file or directory
#include <asm/nmi.h>
^compilation terminated.
vim +10 include/linux/nmi.h
^1da177e Linus Torvalds 2005-04-16 4 #ifndef LINUX_NMI_H ^1da177e Linus Torvalds 2005-04-16 5 #define LINUX_NMI_H ^1da177e Linus Torvalds 2005-04-16 6 9938406a Michal Schmidt 2006-09-29 7 #include <linux/sched.h> ^1da177e Linus Torvalds 2005-04-16 8 #include <asm/irq.h> d6075be4 Nicholas Piggin 2017-05-22 9 #if defined(CONFIG_HAVE_NMI_WATCHDOG) || defined(CONFIG_HARDLOCKUP_DETECTOR) d6075be4 Nicholas Piggin 2017-05-22 @10 #include <asm/nmi.h> d6075be4 Nicholas Piggin 2017-05-22 11 #endif ^1da177e Linus Torvalds 2005-04-16 12 d151b27d Ingo Molnar 2017-02-02 13 #ifdef CONFIG_LOCKUP_DETECTOR
:::::: The code at line 10 was first introduced by commit
:::::: d6075be461c5c70e888e0ea6db700f06f6e03c6e watchdog: Introduce arch_touch_nmi_watchdog()
:::::: TO: Nicholas Piggin <[email protected]>
:::::: CC: 0day robot <[email protected]>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Nicholas Piggin
reviewerPATCH 4/5 watchdog: Provide watchdog_reconfigure() for arch watchdogs
In reply to Nicholas PigginAfter reconfiguring watchdog sysctls etc., architecture specific watchdogs may not get all their parameters updated.
watchdog_reconfigure() can be implemented to pull the new values in and set the arch NMI watchdog.
--- kernel/watchdog.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-)
kernel/watchdog.c +24 -4
@@ -120,6 +120,11 @@ void __weak watchdog_nmi_disable(unsigned int cpu) { } +void __weak watchdog_nmi_reconfigure (void ) +{ +} + +#ifdef CONFIG_SOFTLOCKUP_DETECTOR /* Helper for online, unparked cpus. */
@@ -597,6 +602,12 @@ static void watchdog_disable_all_cpus(void) } } +static int watchdog_update_cpus (void ) +{ +return smpboot_update_cpumask_percpu_thread ( + &watchdog_threads, &watchdog_cpumask); +} +#else /* SOFTLOCKUP */ static int watchdog_park_threads (void ) {
@@ -616,6 +627,10 @@ static void watchdog_disable_all_cpus(void) { } +static int watchdog_update_cpus (void ) +{ +} +static void set_sample_period (void ) { }
@@ -648,6 +663,8 @@ int lockup_detector_suspend(void) watchdog_enabled =0 ; } +watchdog_nmi_reconfigure (); +mutex_unlock (&watchdog_proc_mutex);return ret;
@@ -668,6 +685,8 @@ void lockup_detector_resume(void)if (watchdog_running && !watchdog_suspended)watchdog_unpark_threads (); +watchdog_nmi_reconfigure (); +mutex_unlock (&watchdog_proc_mutex);put_online_cpus (); }
@@ -693,6 +712,8 @@ static int proc_watchdog_update(void)else watchdog_disable_all_cpus (); +watchdog_nmi_reconfigure (); +return err; }
@@ -878,12 +899,11 @@ int proc_watchdog_cpumask(struct ctl_table *table, int write,* a temporary cpumask, so we are likely not in a * position to do much else to make things better. */ -#ifdef CONFIG_SOFTLOCKUP_DETECTOR -if (smpboot_update_cpumask_percpu_thread ( - &watchdog_threads, &watchdog_cpumask) !=0 ) +if (watchdog_update_cpus () !=0 )pr_err ("cpumask update failed\n" ); -#endif } + +watchdog_nmi_reconfigure (); } out:mutex_unlock (&watchdog_proc_mutex);
Signature · 1 line
2.11.0
kbuild test robot
build botRe: [PATCH 4/5] watchdog: Provide watchdog_reconfigure() for arch watchdogs
url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/Improve-watchdog-config-for-arch-watchdogs/20170523-200254 config: tile-tilegx_defconfig (attached as .config) compiler…
Hi Nicholas,
[auto build test WARNING on linus/master]
[also build test WARNING on v4.12-rc2 next-20170523]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Nicholas-Piggin/Improve-watchdog-config-for-arch-watchdogs/20170523-200254
config: tile-tilegx_defconfig (attached as .config)
compiler: tilegx-linux-gcc (GCC) 4.6.2
reproduce:
wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=tile
All warnings (new ones prefixed by >>):
kernel/watchdog.c: In function 'watchdog_update_cpus':
>> kernel/watchdog.c:632:1: warning: no return statement in function returning non-void [-Wreturn-type]
vim +632 kernel/watchdog.c
616
617 static void watchdog_unpark_threads(void)
618 {
619 }
620
621 static int watchdog_enable_all_cpus(void)
622 {
623 return 0;
624 }
625
626 static void watchdog_disable_all_cpus(void)
627 {
628 }
629
630 static int watchdog_update_cpus(void)
631 {
> 632 }
633
634 static void set_sample_period(void)
635 {
636 }
637 #endif /* SOFTLOCKUP */
638
639 /*
640 * Suspend the hard and soft lockup detector by parking the watchdog threads.
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
Nicholas Piggin
reviewerPATCH 5/5 powerpc/64s: SMP hardlockup watchdog
In reply to Nicholas PigginImplement a new SMP based watchdog rather than use the perf based hardlockup detector. The new watchdog uses all SMP threads to watch each other for lockups, by pinging a shared cpumask.
This has nothing really to do with NMIs at the moment, but it looks into a couple of kernel options and APIs that have NMI in the name.
In the interests of size and simplicity, I have avoided grabbing the pseudo-NMI from underneath the soft IRQ masking code. One issue there is I want to avoid reusing process stacks when Linux irqs are disabled.
This will become most useful with NMI IPIs to crash stuck CPUs with. Probably needs some small build fixes on other archs which do their own watchdogs like sparc, but it works on powerpc.
--- arch/powerpc/Kconfig | 3 +- arch/powerpc/include/asm/nmi.h | 8 + arch/powerpc/include/asm/smp.h | 2 + arch/powerpc/kernel/Makefile | 1 + arch/powerpc/kernel/kvm.c | 7 + arch/powerpc/kernel/setup_64.c | 19 --- arch/powerpc/kernel/smp.c | 20 ++- arch/powerpc/kernel/watchdog.c | 332 +++++++++++++++++++++++++++++++++++++++++ lib/Kconfig.debug | 2 +- 9 files changed, 372 insertions(+), 22 deletions(-) create mode 100644 arch/powerpc/kernel/watchdog.c
arch/powerpc/Kconfig +2 -1
@@ -198,7 +198,8 @@ config PPC select HAVE_MEMBLOCK select HAVE_MEMBLOCK_NODE_MAP select HAVE_MOD_ARCH_SPECIFIC - select HAVE_NMI if PERF_EVENTS + select HAVE_NMI if PERF_EVENTS || (PPC64 && PPC_BOOK3S) + select HAVE_NMI_WATCHDOG if (PPC64 && PPC_BOOK3S && SMP) select HAVE_OPROFILE select HAVE_OPTPROBES if PPC64 select HAVE_PERF_EVENTS
arch/powerpc/include/asm/nmi.h +8 -0
@@ -1,4 +1,12 @@#ifndef _ASM_NMI_H#define _ASM_NMI_H +#ifdef CONFIG_HARDLOCKUP_DETECTOR +void arch_touch_nmi_watchdog (void ); +#else +static inline void arch_touch_nmi_watchdog (void ) +{ +} +#endif +#endif /* _ASM_NMI_H */
arch/powerpc/include/asm/smp.h +2 -0
@@ -55,6 +55,8 @@ struct smp_ops_t {int (*cpu_bootable)(unsigned int nr); }; +extern void smp_flush_nmi_ipi (u64 delay_us); +extern int smp_send_nmi_ipi (int cpu,void (*fn)(struct pt_regs *),u64 delay_us);extern void smp_send_debugger_break (void );extern void start_secondary_resume (void );extern void smp_generic_give_timebase (void );
arch/powerpc/kernel/Makefile +1 -0
@@ -40,6 +40,7 @@ obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ signal_64.o ptrace32.o \ paca.o nvram_64.o firmware.o obj-$(CONFIG_VDSO32) += vdso32/ +obj-$(CONFIG_HARDLOCKUP_DETECTOR) += watchdog.o obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_power.o
arch/powerpc/kernel/kvm.c +7 -0
@@ -25,6 +25,7 @@#include <linux/kvm_para.h> #include <linux/slab.h> #include <linux/of.h> +#include <linux/nmi.h> /* hardlockup_detector_disable() */ #include <asm/reg.h> #include <asm/sections.h>
@@ -718,6 +719,12 @@ static __init void kvm_free_tmp(void)static int __init kvm_guest_init (void ) { +/* +* The hardlockup detector is likely to get false positives in +* KVM guests, so disable it by default. +*/ +hardlockup_detector_disable (); +if (!kvm_para_available ()) goto free_tmp;
arch/powerpc/kernel/setup_64.c +0 -19
@@ -726,22 +726,3 @@ unsigned long memory_block_size_bytes(void)struct ppc_pci_io ppc_pci_io;EXPORT_SYMBOL (ppc_pci_io);#endif - -#ifdef CONFIG_HARDLOCKUP_DETECTOR_PERF -u64 hw_nmi_get_sample_period (int watchdog_thresh) -{ -return ppc_proc_freq * watchdog_thresh; -} - -/* -* The hardlockup detector breaks PMU event based branches and is likely -* to get false positives in KVM guests, so disable it by default. -*/ -static int __init disable_hardlockup_detector (void ) -{ -hardlockup_detector_disable (); - -return 0 ; -} -early_initcall (disable_hardlockup_detector); -#endif
arch/powerpc/kernel/smp.c +19 -1
@@ -433,13 +433,31 @@ static void do_smp_send_nmi_ipi(int cpu) } } +void smp_flush_nmi_ipi (u64 delay_us) +{ +unsigned long flags; + +nmi_ipi_lock_start (&flags); +while (nmi_ipi_busy_count) { +nmi_ipi_unlock_end (&flags); +udelay (1 ); +if (delay_us) { + delay_us--; +if (!delay_us) +return ; + } +nmi_ipi_lock_start (&flags); + } +nmi_ipi_unlock_end (&flags); +} +/* * - cpu is the target CPU (must not be this CPU), or NMI_IPI_ALL_OTHERS. * - fn is the target callback function. * - delay_us > 0 is the delay before giving up waiting for targets to * enter the handler, == 0 specifies indefinite delay. */ -static int smp_send_nmi_ipi (int cpu,void (*fn)(struct pt_regs *),u64 delay_us) +int smp_send_nmi_ipi (int cpu,void (*fn)(struct pt_regs *),u64 delay_us) {unsigned long flags;int me =raw_smp_processor_id ();
arch/powerpc/kernel/watchdog.c new file +332 -0
332 lines not on this page · raw message
lib/Kconfig.debug +1 -1
@@ -818,7 +818,7 @@ config HARDLOCKUP_DETECTOR_PERF config HARDLOCKUP_DETECTOR bool "Detect Hard Lockups" depends on LOCKUP_DETECTOR - depends on !HAVE_NMI_WATCHDOG || (PERF_EVENTS && HAVE_PERF_EVENTS_NMI) + depends on PPC64 || !HAVE_NMI_WATCHDOG || (PERF_EVENTS && HAVE_PERF_EVENTS_NMI) select HARDLOCKUP_DETECTOR_PERF if !HAVE_NMI_WATCHDOG config BOOTPARAM_HARDLOCKUP_PANIC
Signature · 1 line
2.11.0