kernel: refactoring uses flag bits for exiting instead of cleaning up the workflow

This commit is contained in:
ShirkNeko
2025-08-02 01:27:02 +08:00
parent bf5a8a8909
commit acfba3d0f8

View File

@@ -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