diff options
Diffstat (limited to 'include/linux/nmi.h')
| -rw-r--r-- | include/linux/nmi.h | 122 | 
1 files changed, 63 insertions, 59 deletions
| diff --git a/include/linux/nmi.h b/include/linux/nmi.h index a36abe2da13e..b8d868d23e79 100644 --- a/include/linux/nmi.h +++ b/include/linux/nmi.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   *  linux/include/linux/nmi.h   */ @@ -12,11 +13,31 @@  #ifdef CONFIG_LOCKUP_DETECTOR  void lockup_detector_init(void); +void lockup_detector_soft_poweroff(void); +void lockup_detector_cleanup(void); +bool is_hardlockup(void); + +extern int watchdog_user_enabled; +extern int nmi_watchdog_user_enabled; +extern int soft_watchdog_user_enabled; +extern int watchdog_thresh; +extern unsigned long watchdog_enabled; + +extern struct cpumask watchdog_cpumask; +extern unsigned long *watchdog_cpumask_bits; +#ifdef CONFIG_SMP +extern int sysctl_softlockup_all_cpu_backtrace; +extern int sysctl_hardlockup_all_cpu_backtrace;  #else -static inline void lockup_detector_init(void) -{ -} -#endif +#define sysctl_softlockup_all_cpu_backtrace 0 +#define sysctl_hardlockup_all_cpu_backtrace 0 +#endif /* !CONFIG_SMP */ + +#else /* CONFIG_LOCKUP_DETECTOR */ +static inline void lockup_detector_init(void) { } +static inline void lockup_detector_soft_poweroff(void) { } +static inline void lockup_detector_cleanup(void) { } +#endif /* !CONFIG_LOCKUP_DETECTOR */  #ifdef CONFIG_SOFTLOCKUP_DETECTOR  extern void touch_softlockup_watchdog_sched(void); @@ -24,29 +45,17 @@ 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 int soft_watchdog_enabled; -extern atomic_t watchdog_park_in_progress;  #else -static inline void touch_softlockup_watchdog_sched(void) -{ -} -static inline void touch_softlockup_watchdog(void) -{ -} -static inline void touch_softlockup_watchdog_sync(void) -{ -} -static inline void touch_all_softlockup_watchdogs(void) -{ -} +static inline void touch_softlockup_watchdog_sched(void) { } +static inline void touch_softlockup_watchdog(void) { } +static inline void touch_softlockup_watchdog_sync(void) { } +static inline void touch_all_softlockup_watchdogs(void) { }  #endif  #ifdef CONFIG_DETECT_HUNG_TASK  void reset_hung_task_detector(void);  #else -static inline void reset_hung_task_detector(void) -{ -} +static inline void reset_hung_task_detector(void) { }  #endif  /* @@ -54,12 +63,12 @@ static inline void reset_hung_task_detector(void)   * 'watchdog_enabled' variable. Each lockup detector has its dedicated bit -   * bit 0 for the hard lockup detector and bit 1 for the soft lockup detector.   * - * 'watchdog_user_enabled', 'nmi_watchdog_enabled' and 'soft_watchdog_enabled' - * are variables that are only used as an 'interface' between the parameters - * in /proc/sys/kernel and the internal state bits in 'watchdog_enabled'. The - * 'watchdog_thresh' variable is handled differently because its value is not - * boolean, and the lockup detectors are 'suspended' while 'watchdog_thresh' - * is equal zero. + * 'watchdog_user_enabled', 'nmi_watchdog_user_enabled' and + * 'soft_watchdog_user_enabled' are variables that are only used as an + * 'interface' between the parameters in /proc/sys/kernel and the internal + * state bits in 'watchdog_enabled'. The 'watchdog_thresh' variable is + * handled differently because its value is not boolean, and the lockup + * detectors are 'suspended' while 'watchdog_thresh' is equal zero.   */  #define NMI_WATCHDOG_ENABLED_BIT   0  #define SOFT_WATCHDOG_ENABLED_BIT  1 @@ -73,17 +82,41 @@ extern unsigned int hardlockup_panic;  static inline void hardlockup_detector_disable(void) {}  #endif +#if defined(CONFIG_HAVE_NMI_WATCHDOG) || defined(CONFIG_HARDLOCKUP_DETECTOR) +# define NMI_WATCHDOG_SYSCTL_PERM	0644 +#else +# define NMI_WATCHDOG_SYSCTL_PERM	0444 +#endif +  #if defined(CONFIG_HARDLOCKUP_DETECTOR_PERF)  extern void arch_touch_nmi_watchdog(void); +extern void hardlockup_detector_perf_stop(void); +extern void hardlockup_detector_perf_restart(void); +extern void hardlockup_detector_perf_disable(void); +extern void hardlockup_detector_perf_enable(void); +extern void hardlockup_detector_perf_cleanup(void); +extern int hardlockup_detector_perf_init(void);  #else -#if !defined(CONFIG_HAVE_NMI_WATCHDOG) +static inline void hardlockup_detector_perf_stop(void) { } +static inline void hardlockup_detector_perf_restart(void) { } +static inline void hardlockup_detector_perf_disable(void) { } +static inline void hardlockup_detector_perf_enable(void) { } +static inline void hardlockup_detector_perf_cleanup(void) { } +# if !defined(CONFIG_HAVE_NMI_WATCHDOG) +static inline int hardlockup_detector_perf_init(void) { return -ENODEV; }  static inline void arch_touch_nmi_watchdog(void) {} +# else +static inline int hardlockup_detector_perf_init(void) { return 0; } +# endif  #endif -#endif + +void watchdog_nmi_stop(void); +void watchdog_nmi_start(void); +int watchdog_nmi_probe(void);  /**   * touch_nmi_watchdog - restart NMI watchdog timeout. - *  + *   * If the architecture supports the NMI watchdog, touch_nmi_watchdog()   * may be used to reset the timeout - for code which intentionally   * disables interrupts for a long time. This call is stateless. @@ -153,22 +186,6 @@ static inline bool trigger_single_cpu_backtrace(int cpu)  u64 hw_nmi_get_sample_period(int watchdog_thresh);  #endif -#ifdef CONFIG_LOCKUP_DETECTOR -extern int nmi_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 int __read_mostly watchdog_suspended; -#ifdef CONFIG_SMP -extern int sysctl_softlockup_all_cpu_backtrace; -extern int sysctl_hardlockup_all_cpu_backtrace; -#else -#define sysctl_softlockup_all_cpu_backtrace 0 -#define sysctl_hardlockup_all_cpu_backtrace 0 -#endif -  #if defined(CONFIG_HARDLOCKUP_CHECK_TIMESTAMP) && \      defined(CONFIG_HARDLOCKUP_DETECTOR)  void watchdog_update_hrtimer_threshold(u64 period); @@ -176,7 +193,6 @@ void watchdog_update_hrtimer_threshold(u64 period);  static inline void watchdog_update_hrtimer_threshold(u64 period) { }  #endif -extern bool is_hardlockup(void);  struct ctl_table;  extern int proc_watchdog(struct ctl_table *, int ,  			 void __user *, size_t *, loff_t *); @@ -188,18 +204,6 @@ extern int proc_watchdog_thresh(struct ctl_table *, int ,  				void __user *, size_t *, loff_t *);  extern int proc_watchdog_cpumask(struct ctl_table *, int,  				 void __user *, size_t *, loff_t *); -extern int lockup_detector_suspend(void); -extern void lockup_detector_resume(void); -#else -static inline int lockup_detector_suspend(void) -{ -	return 0; -} - -static inline void lockup_detector_resume(void) -{ -} -#endif  #ifdef CONFIG_HAVE_ACPI_APEI_NMI  #include <asm/nmi.h> |