kernel/watchdog: introduce arch_touch_nmi_watchdog()
authorNicholas Piggin <npiggin@gmail.com>
Wed, 12 Jul 2017 21:35:43 +0000 (14:35 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 12 Jul 2017 23:26:02 +0000 (16:26 -0700)
For 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.

Link: http://lkml.kernel.org/r/20170616065715.18390-3-npiggin@gmail.com
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Don Zickus <dzickus@redhat.com>
Reviewed-by: Babu Moger <babu.moger@oracle.com>
Tested-by: Babu Moger <babu.moger@oracle.com> [sparc]
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/blackfin/include/asm/nmi.h
arch/blackfin/kernel/nmi.c
arch/mn10300/include/asm/nmi.h
arch/mn10300/kernel/mn10300-watchdog-low.S
arch/mn10300/kernel/mn10300-watchdog.c
arch/sparc/include/asm/nmi.h
arch/sparc/kernel/nmi.c
include/linux/nmi.h
kernel/watchdog_hld.c

index b9caac4fcfd854749a24ab7831d95edbd7d1d9b7..107d23705f465db6b363b10c5bff46203b2205f0 100644 (file)
@@ -9,4 +9,6 @@
 
 #include <linux/nmi.h>
 
+extern void arch_touch_nmi_watchdog(void);
+
 #endif
index 633c37083e877f3aa930c40acd197876d52834f7..1e714329fe8a186f59f7a6bf25de7393a14fb403 100644 (file)
@@ -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);
 }
index f3671cbbc1177c804613eb68818a4b8c9e66ca5a..b05627597b1ba251831d393f1b4b672dfd8c61eb 100644 (file)
@@ -11,4 +11,6 @@
 #ifndef _ASM_NMI_H
 #define _ASM_NMI_H
 
+extern void arch_touch_nmi_watchdog(void);
+
 #endif /* _ASM_NMI_H */
index f2f5c9cfaabd803e02b95fad30267e1cde8a35c3..34f8773de7d0379408be6c49800b921a47b2a525 100644 (file)
@@ -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
index a2d8e6938d6716bca53162a00775291bca58d227..0d5641beadf5cecfe37addd4aa569acdf2be8fc5 100644 (file)
@@ -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
index 26ad2b2607c66304c6a76e74293a83b32a373dd4..284eac3ffaf2cdbb4b281ad070ba6328eff7c9d0 100644 (file)
@@ -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);
 
index 95e73c63c99d43b257ec511c14ae894322fb9349..048ad783ea3fe45adfa5ce23d48a106910e02de4 100644 (file)
@@ -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)
 {
index 5e2e57536d98ce84f0c55af4726d4b9846d766d9..bd387ef8bccd2f98f5c9693318882df106d17dd1 100644 (file)
@@ -6,6 +6,9 @@
 
 #include <linux/sched.h>
 #include <asm/irq.h>
+#if defined(CONFIG_HAVE_NMI_WATCHDOG)
+#include <asm/nmi.h>
+#endif
 
 #ifdef CONFIG_LOCKUP_DETECTOR
 extern void touch_softlockup_watchdog_sched(void);
@@ -58,6 +61,18 @@ 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 hardlockup_detector_disable(void);
+#else
+static inline void hardlockup_detector_disable(void) {}
+#endif
+
+#if defined(CONFIG_HARDLOCKUP_DETECTOR) || defined(CONFIG_HAVE_NMI_WATCHDOG)
+extern void arch_touch_nmi_watchdog(void);
+#else
+static inline void arch_touch_nmi_watchdog(void) {}
+#endif
+
 /**
  * touch_nmi_watchdog - restart NMI watchdog timeout.
  * 
@@ -65,21 +80,11 @@ 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)
 {
+       arch_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
index 54a427d1f344543947867ea3a5a2b3c6e8274d47..90d688df6ce1cb3e8987337c15185b75169c71c1 100644 (file)
@@ -56,7 +56,7 @@ static int __init hardlockup_panic_setup(char *str)
 }
 __setup("nmi_watchdog=", hardlockup_panic_setup);
 
-void touch_nmi_watchdog(void)
+void arch_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(arch_touch_nmi_watchdog);
 
 static struct perf_event_attr wd_hw_attr = {
        .type           = PERF_TYPE_HARDWARE,