diff --git a/arch/arm64/kernel/watchdog_sdei.c b/arch/arm64/kernel/watchdog_sdei.c index d1ad8c18429683c9b8092e77e61841dc62067385..19f47e24fa59f90503e7683d6dba33d482f96d0e 100644 --- a/arch/arm64/kernel/watchdog_sdei.c +++ b/arch/arm64/kernel/watchdog_sdei.c @@ -183,3 +183,13 @@ int __init sdei_watchdog_hardlockup_probe(void) return 0; } + +static int __init sdei_watchdog_hardlockup_init(void) +{ + /* sdei_watchdog needs to be initialized after sdei_init */ + if (!disable_sdei_nmi_watchdog) + lockup_detector_retry_init(); + + return 0; +} +device_initcall(sdei_watchdog_hardlockup_init) diff --git a/drivers/perf/arm_pmuv3.c b/drivers/perf/arm_pmuv3.c index baa700ab5e034cba2dbecde0088612520a32f94f..c5120668486336da07d64f2ef1df1315459299c6 100644 --- a/drivers/perf/arm_pmuv3.c +++ b/drivers/perf/arm_pmuv3.c @@ -1582,7 +1582,7 @@ static int __init armv8_pmu_driver_init(void) else ret = arm_pmu_acpi_probe(armv8_pmuv3_pmu_init); - if (!ret) + if (!ret && disable_sdei_nmi_watchdog) lockup_detector_retry_init(); return ret; diff --git a/init/main.c b/init/main.c index afead48c58e48e8f8720b38665f5a4b302d67917..f97f06547078741c11bf61a998c21eb484b2ca60 100644 --- a/init/main.c +++ b/init/main.c @@ -1546,8 +1546,7 @@ static noinline void __init kernel_init_freeable(void) rcu_init_tasks_generic(); do_pre_smp_initcalls(); - if (disable_sdei_nmi_watchdog) - lockup_detector_init(); + lockup_detector_init(); smp_init(); sched_init_smp(); @@ -1558,10 +1557,6 @@ static noinline void __init kernel_init_freeable(void) do_basic_setup(); - /* sdei_watchdog needs to be initialized after sdei_init */ - if (!disable_sdei_nmi_watchdog) - lockup_detector_init(); - kunit_run_all_tests(); wait_for_initramfs(); diff --git a/kernel/watchdog.c b/kernel/watchdog.c index ea5c5f9371b18d839504be8860a5e7769d6b808e..6313fe17bca7aa40296e9445f0fe2e130065d19e 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -986,7 +986,12 @@ static void __init lockup_detector_delay_init(struct work_struct *work) { int ret; - ret = watchdog_hardlockup_probe(); + if (disable_sdei_nmi_watchdog) { + ret = watchdog_hardlockup_probe(); + } else { + ret = sdei_watchdog_hardlockup_probe(); + } + if (ret) { pr_info("Delayed init of the lockup detector failed: %d\n", ret); pr_info("Hard watchdog permanently disabled\n"); @@ -1042,8 +1047,7 @@ void __init lockup_detector_init(void) cpumask_copy(&watchdog_cpumask, housekeeping_cpumask(HK_TYPE_TIMER)); - if ((!disable_sdei_nmi_watchdog && !sdei_watchdog_hardlockup_probe()) || - (disable_sdei_nmi_watchdog && !watchdog_hardlockup_probe())) + if (disable_sdei_nmi_watchdog && !watchdog_hardlockup_probe()) watchdog_hardlockup_available = true; else allow_lockup_detector_init_retry = true;