--- x/drivers/vhost/vhost.c +++ y/drivers/vhost/vhost.c @@ -407,16 +407,14 @@ static int vhost_run_work_kthread_list(v kthread_use_mm(dev->mm); for (;;) { - /* mb paired w/ kthread_stop */ - set_current_state(TASK_INTERRUPTIBLE); - - if (kthread_should_stop()) { - __set_current_state(TASK_RUNNING); - break; - } node = llist_del_all(&worker->work_list); - if (!node) + if (!node) { + if (kthread_should_stop()) + break; + __set_current_state(TASK_INTERRUPTIBLE); schedule(); + continue; + } node = llist_reverse_order(node); /* make sure flag is seen after deletion */