ipmi:ssif: Fix a shutdown race
authorCorey Minyard <corey@minyard.net>
Thu, 10 Apr 2025 19:44:26 +0000 (14:44 -0500)
committerCorey Minyard <corey@minyard.net>
Wed, 7 May 2025 22:25:48 +0000 (17:25 -0500)
It was possible for the SSIF thread to stop and quit before the
kthread_stop() call because ssif->stopping was set before the
stop.  So only exit the SSIF thread is kthread_should_stop()
returns true.

There is no need to wake the thread, as the wait will be interrupted
by kthread_stop().

Signed-off-by: Corey Minyard <cminyard@mvista.com>
drivers/char/ipmi/ipmi_ssif.c

index 0b45b07dec22cd388e8314c138f8ca8330bfc78f..5bf038e620c75f9474c6cb044012ce6ffb973d4a 100644 (file)
@@ -481,8 +481,6 @@ static int ipmi_ssif_thread(void *data)
                /* Wait for something to do */
                result = wait_for_completion_interruptible(
                                                &ssif_info->wake_thread);
-               if (ssif_info->stopping)
-                       break;
                if (result == -ERESTARTSYS)
                        continue;
                init_completion(&ssif_info->wake_thread);
@@ -1270,10 +1268,8 @@ static void shutdown_ssif(void *send_info)
        ssif_info->stopping = true;
        timer_delete_sync(&ssif_info->watch_timer);
        timer_delete_sync(&ssif_info->retry_timer);
-       if (ssif_info->thread) {
-               complete(&ssif_info->wake_thread);
+       if (ssif_info->thread)
                kthread_stop(ssif_info->thread);
-       }
 }
 
 static void ssif_remove(struct i2c_client *client)