From acfba3d0f8a1ab92146f5c3beb7deb0bf8e77fd6 Mon Sep 17 00:00:00 2001 From: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com> Date: Sat, 2 Aug 2025 01:27:02 +0800 Subject: [PATCH] kernel: refactoring uses flag bits for exiting instead of cleaning up the workflow --- kernel/dynamic_sign.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/kernel/dynamic_sign.c b/kernel/dynamic_sign.c index 5bc2414b..848b13ea 100644 --- a/kernel/dynamic_sign.c +++ b/kernel/dynamic_sign.c @@ -55,6 +55,9 @@ static struct completion load_completion; static atomic_t save_retry_count = ATOMIC_INIT(0); static atomic_t load_retry_count = ATOMIC_INIT(0); +// Exit flag to prevent new operations +static atomic_t dynamic_sign_exiting = ATOMIC_INIT(0); + bool ksu_is_dynamic_sign_enabled(void) { unsigned long flags; @@ -251,7 +254,7 @@ static void ksu_rescan_manager_work_handler(struct work_struct *work) bool ksu_trigger_manager_rescan(void) { - if (!ksu_dynamic_wq) { + if (!ksu_dynamic_wq || atomic_read(&dynamic_sign_exiting)) { pr_err("Dynamic sign workqueue not initialized\n"); return false; } @@ -549,7 +552,7 @@ complete: static bool persistent_dynamic_sign(void) { - if (!ksu_dynamic_wq) { + if (!ksu_dynamic_wq || atomic_read(&dynamic_sign_exiting)) { pr_err("Dynamic sign workqueue not initialized\n"); return false; } @@ -586,7 +589,7 @@ static void do_clear_dynamic_sign_file(struct work_struct *work) static bool clear_dynamic_sign_file(void) { - if (!ksu_dynamic_wq) { + if (!ksu_dynamic_wq || atomic_read(&dynamic_sign_exiting)) { pr_err("Dynamic sign workqueue not initialized\n"); return false; } @@ -691,7 +694,7 @@ int ksu_handle_dynamic_sign(struct dynamic_sign_user_config *config) bool ksu_load_dynamic_sign(void) { - if (!ksu_dynamic_wq) { + if (!ksu_dynamic_wq || atomic_read(&dynamic_sign_exiting)) { pr_err("Dynamic sign workqueue not initialized\n"); return false; } @@ -742,17 +745,17 @@ void ksu_dynamic_sign_init(void) void ksu_dynamic_sign_exit(void) { + // Set exit flag to prevent new operations + atomic_set(&dynamic_sign_exiting, 1); + // Clear only dynamic managers on exit, preserve default manager clear_dynamic_managers_only(); // Wait for any pending operations to complete if (ksu_dynamic_wq) { - flush_workqueue(ksu_dynamic_wq); - destroy_workqueue(ksu_dynamic_wq); ksu_dynamic_wq = NULL; } - - pr_info("Dynamic sign exited, cleared dynamic managers, preserved default manager\n"); + pr_info("Dynamic sign exit flag set, cleared dynamic managers, preserved default manager\n"); } // Get dynamic sign configuration for signature verification