On Fri, Mar 28, 2025 at 06:02:46PM +0800, Cindy Lu wrote:
Add the previously removed function vhost_worker() back
to support the kthread and rename it to vhost_run_work_kthread_list.

The old function vhost_worker was change to support task in

nit: s/change/changed

commit 6e890c5d5021 ("vhost: use vhost_tasks for worker threads")
change to xarray in
commit 1cdaafa1b8b4 ("vhost: replace single worker pointer with xarray")

Signed-off-by: Cindy Lu <l...@redhat.com>
---
drivers/vhost/vhost.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)

I tried to build commit by commit (mainly to check bisection), and I
discovered that nowdays unused functions produce an error (yes, we can mute it for example by setting CONFIG_WERROR to N), but I wanted to point it out:

../drivers/vhost/vhost.c:391:12: error: ‘vhost_run_work_kthread_list’ defined 
but not used [-Werror=unused-function]
  391 | static int vhost_run_work_kthread_list(void *data)

So not sure if we need to squash this where we use it.

Same issue also for the next 2 patches.

Thanks,
Stefano


diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 250dc43f1786..9500e85b42ce 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -388,6 +388,44 @@ static void vhost_vq_reset(struct vhost_dev *dev,
        __vhost_vq_meta_reset(vq);
}

+static int vhost_run_work_kthread_list(void *data)
+{
+       struct vhost_worker *worker = data;
+       struct vhost_work *work, *work_next;
+       struct vhost_dev *dev = worker->dev;
+       struct llist_node *node;
+
+       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)
+                       schedule();
+
+               node = llist_reverse_order(node);
+               /* make sure flag is seen after deletion */
+               smp_wmb();
+               llist_for_each_entry_safe(work, work_next, node, node) {
+                       clear_bit(VHOST_WORK_QUEUED, &work->flags);
+                       __set_current_state(TASK_RUNNING);
+                       kcov_remote_start_common(worker->kcov_handle);
+                       work->fn(work);
+                       kcov_remote_stop();
+                       cond_resched();
+               }
+       }
+       kthread_unuse_mm(dev->mm);
+
+       return 0;
+}
+
static bool vhost_run_work_list(void *data)
{
        struct vhost_worker *worker = data;
--
2.45.0



Reply via email to