From 9f3da01cb7a23397743344caf419055dcdc1b73a Mon Sep 17 00:00:00 2001 From: Dong Kai Date: Thu, 15 Apr 2021 09:43:38 +0800 Subject: [PATCH] corelockup: Add detector enable support by cmdline ascend inclusion category: feature bugzilla: NA CVE: NA -------------------------------- Add cmdline params "enable_corelockup_detector" to support enable core suspend detector. And enable defaultly within ascend features. Signed-off-by: Dong Kai Reviewed-by: Kuohai Xu Signed-off-by: Yang Yingliang Signed-off-by: Zheng Zengkai --- arch/arm64/mm/init.c | 7 +++++++ include/linux/nmi.h | 1 + kernel/watchdog.c | 12 ++++++++---- kernel/watchdog_hld.c | 18 ++++++++++++++---- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 0773205251ca..fa37c4c2e755 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -771,6 +771,9 @@ __setup("keepinitrd", keepinitrd_setup); #ifdef CONFIG_ASCEND_FEATURES #include +#ifdef CONFIG_CORELOCKUP_DETECTOR +#include +#endif void ascend_enable_all_features(void) { @@ -797,6 +800,10 @@ void ascend_enable_all_features(void) #ifdef CONFIG_ARM64_PSEUDO_NMI enable_pseudo_nmi = true; #endif + +#ifdef CONFIG_CORELOCKUP_DETECTOR + enable_corelockup_detector = true; +#endif } static int __init ascend_enable_setup(char *__unused) diff --git a/include/linux/nmi.h b/include/linux/nmi.h index dd82ec94fae8..af906071ebc4 100644 --- a/include/linux/nmi.h +++ b/include/linux/nmi.h @@ -111,6 +111,7 @@ 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); +extern bool enable_corelockup_detector; #else static inline void hardlockup_detector_perf_stop(void) { } static inline void hardlockup_detector_perf_restart(void) { } diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 597607a74975..2441e2c66985 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -384,7 +384,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer) #ifdef CONFIG_CORELOCKUP_DETECTOR /* check hrtimer of detector cpu */ - watchdog_check_hrtimer(); + if (enable_corelockup_detector) + watchdog_check_hrtimer(); #endif /* kick the hardlockup detector */ @@ -575,7 +576,8 @@ int lockup_detector_online_cpu(unsigned int cpu) if (cpumask_test_cpu(cpu, &watchdog_allowed_mask)) { watchdog_enable(cpu); #ifdef CONFIG_CORELOCKUP_DETECTOR - corelockup_detector_online_cpu(cpu); + if (enable_corelockup_detector) + corelockup_detector_online_cpu(cpu); #endif } return 0; @@ -586,7 +588,8 @@ int lockup_detector_offline_cpu(unsigned int cpu) if (cpumask_test_cpu(cpu, &watchdog_allowed_mask)) { watchdog_disable(cpu); #ifdef CONFIG_CORELOCKUP_DETECTOR - corelockup_detector_offline_cpu(cpu); + if (enable_corelockup_detector) + corelockup_detector_offline_cpu(cpu); #endif } return 0; @@ -819,6 +822,7 @@ void __init lockup_detector_init(void) nmi_watchdog_available = true; lockup_detector_setup(); #ifdef CONFIG_CORELOCKUP_DETECTOR - corelockup_detector_init(); + if (enable_corelockup_detector) + corelockup_detector_init(); #endif } diff --git a/kernel/watchdog_hld.c b/kernel/watchdog_hld.c index 58d7acec4269..51ffc8f90520 100644 --- a/kernel/watchdog_hld.c +++ b/kernel/watchdog_hld.c @@ -91,6 +91,14 @@ static DEFINE_PER_CPU(unsigned long, hrint_missed); struct cpumask corelockup_cpumask __read_mostly; unsigned int close_wfi_wfe; static bool pmu_based_nmi; +bool enable_corelockup_detector; + +static int __init enable_corelockup_detector_setup(char *str) +{ + enable_corelockup_detector = true; + return 1; +} +__setup("enable_corelockup_detector", enable_corelockup_detector_setup); static void watchdog_nmi_interrupts(void) { @@ -324,11 +332,13 @@ static inline bool watchdog_check_timestamp(void) void watchdog_hardlockup_check(struct pt_regs *regs) { #ifdef CONFIG_CORELOCKUP_DETECTOR - /* Kick nmi interrupts */ - watchdog_nmi_interrupts(); + if (enable_corelockup_detector) { + /* Kick nmi interrupts */ + watchdog_nmi_interrupts(); - /* corelockup check */ - watchdog_corelockup_check(regs); + /* corelockup check */ + watchdog_corelockup_check(regs); + } #endif if (__this_cpu_read(watchdog_nmi_touch) == true) { -- GitLab