Thread (26 messages) 26 messages, 4 authors, 2025-01-22

Re: [PATCH v4 2/8] vhost: Add the vhost_worker to support kthread

From: Cindy Lu <hidden>
Date: 2024-12-18 08:39:16
Also in: lkml, virtualization

On Wed, Dec 11, 2024 at 1:52 AM Stefano Garzarella [off-list ref] wrote:
On Wed, Dec 11, 2024 at 12:41:41AM +0800, Cindy Lu wrote:
quoted
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
s/change/changed
will fix this
quoted
commit 6e890c5d5021 ("vhost: use vhost_tasks for worker threads")
change to xarray in
"and to support multiple workers per device using xarray in"
will fix this
Thanks
Cindy
quoted
commit 1cdaafa1b8b4 ("vhost: replace single worker pointer with xarray")
quoted
Signed-off-by: Cindy Lu <redacted>
---
drivers/vhost/vhost.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index eaddbd39c29b..1feba29abf95 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
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help