From f022c4cac9c1013fa8820b0af01aaa98e38053f1 Mon Sep 17 00:00:00 2001 From: Yang Yingliang Date: Tue, 5 Aug 2025 15:24:10 +0800 Subject: [PATCH] sdei_watchdog: use lockup_detector_retry_init() to init sdei watchdog hulk inclusion category: other bugzilla: https://gitee.com/openeuler/kernel/issues/I8LQCC CVE: NA ------------------------------------------------- sdei watchdog needs to be initialized after sdei_init, so commit 1509d06c9c41 ("init: only move down lockup_detector_init() when sdei_watchdog is enabled") move down the lockup_detector_init(). Now Commit 930d8f8dbab9 ("watchdog/perf: adapt the watchdog_perf interface for async model") provide an API lockup_detector_retry_init() for anyone who needs to delayed init lockup detector, so use this API to delay init sdei watchdog. Signed-off-by: Yang Yingliang --- arch/arm64/kernel/watchdog_sdei.c | 10 ++++++++++ drivers/perf/arm_pmuv3.c | 2 +- init/main.c | 7 +------ kernel/watchdog.c | 10 +++++++--- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/arch/arm64/kernel/watchdog_sdei.c b/arch/arm64/kernel/watchdog_sdei.c index d1ad8c184296..19f47e24fa59 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 baa700ab5e03..c51206684863 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 afead48c58e4..f97f06547078 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 ea5c5f9371b1..6313fe17bca7 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; -- Gitee