Now that vhost_task provides an API to safely wake a task without relying
on the caller to react to signals, make handle_sigkill() optional and
WARN if the "unsafe" __vhost_task_wake() is used without hooking sigkill.
Requiring the user to react to sigkill adds no meaningful value, e.g. it
didn't help KVM do the right thing with respect to signals, and adding a
sanity check in __vhost_task_wake() gives developers a hint as to what
needs to be done in response to sigkill.

Signed-off-by: Sean Christopherson <sea...@google.com>
---
 kernel/vhost_task.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/kernel/vhost_task.c b/kernel/vhost_task.c
index bd213d0b6da3..01bf7b0e2c5b 100644
--- a/kernel/vhost_task.c
+++ b/kernel/vhost_task.c
@@ -59,7 +59,8 @@ static int vhost_task_fn(void *data)
         */
        if (!test_bit(VHOST_TASK_FLAGS_STOP, &vtsk->flags)) {
                set_bit(VHOST_TASK_FLAGS_KILLED, &vtsk->flags);
-               vtsk->handle_sigkill(vtsk->data);
+               if (vtsk->handle_sigkill)
+                       vtsk->handle_sigkill(vtsk->data);
        }
        mutex_unlock(&vtsk->exit_mutex);
        complete(&vtsk->exited);
@@ -81,6 +82,13 @@ static void vhost_task_wake_up_process(struct vhost_task 
*vtsk)
  */
 void __vhost_task_wake(struct vhost_task *vtsk)
 {
+       /*
+        * Waking the task without taking exit_mutex is safe if and only if the
+        * implementation hooks sigkill, as that's the only way the caller can
+        * know if the task has exited prematurely due to a signal.
+        */
+       WARN_ON_ONCE(!vtsk->handle_sigkill);
+
        /*
         * Checking VHOST_TASK_FLAGS_KILLED can race with signal delivery, but
         * a race can only result in false negatives and this is just a sanity
-- 
2.51.0.268.g9569e192d0-goog


Reply via email to