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