On Tue, Mar 28, 2023 at 10:17 AM Mike Christie <michael.christie@xxxxxxxxxx> wrote: > > This patch has the core work queueing function take a worker for when we > support multiple workers. It also adds a helper that takes a vq during > queueing so modules can control which vq/worker to queue work on. > > This temp leaves vhost_work_queue. It will be removed when the drivers > are converted in the next patches. > > Signed-off-by: Mike Christie <michael.christie@xxxxxxxxxx> Acked-by: Jason Wang <jasowang@xxxxxxxxxx> Thanks > --- > drivers/vhost/vhost.c | 44 +++++++++++++++++++++++++++---------------- > drivers/vhost/vhost.h | 1 + > 2 files changed, 29 insertions(+), 16 deletions(-) > > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c > index 6567aed69ebb..cc2628ba9a77 100644 > --- a/drivers/vhost/vhost.c > +++ b/drivers/vhost/vhost.c > @@ -231,6 +231,34 @@ void vhost_poll_stop(struct vhost_poll *poll) > } > EXPORT_SYMBOL_GPL(vhost_poll_stop); > > +static void vhost_work_queue_on(struct vhost_worker *worker, > + struct vhost_work *work) > +{ > + if (!worker) > + return; > + > + if (!test_and_set_bit(VHOST_WORK_QUEUED, &work->flags)) { > + /* We can only add the work to the list after we're > + * sure it was not in the list. > + * test_and_set_bit() implies a memory barrier. > + */ > + llist_add(&work->node, &worker->work_list); > + wake_up_process(worker->vtsk->task); > + } > +} > + > +void vhost_work_queue(struct vhost_dev *dev, struct vhost_work *work) > +{ > + vhost_work_queue_on(dev->worker, work); > +} > +EXPORT_SYMBOL_GPL(vhost_work_queue); > + > +void vhost_vq_work_queue(struct vhost_virtqueue *vq, struct vhost_work *work) > +{ > + vhost_work_queue_on(vq->worker, work); > +} > +EXPORT_SYMBOL_GPL(vhost_vq_work_queue); > + > void vhost_dev_flush(struct vhost_dev *dev) > { > struct vhost_flush_struct flush; > @@ -245,22 +273,6 @@ void vhost_dev_flush(struct vhost_dev *dev) > } > EXPORT_SYMBOL_GPL(vhost_dev_flush); > > -void vhost_work_queue(struct vhost_dev *dev, struct vhost_work *work) > -{ > - if (!dev->worker) > - return; > - > - if (!test_and_set_bit(VHOST_WORK_QUEUED, &work->flags)) { > - /* We can only add the work to the list after we're > - * sure it was not in the list. > - * test_and_set_bit() implies a memory barrier. > - */ > - llist_add(&work->node, &dev->worker->work_list); > - wake_up_process(dev->worker->vtsk->task); > - } > -} > -EXPORT_SYMBOL_GPL(vhost_work_queue); > - > /* A lockless hint for busy polling code to exit the loop */ > bool vhost_vq_has_work(struct vhost_virtqueue *vq) > { > diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h > index 0dde119fb0ee..b64ee4ef387d 100644 > --- a/drivers/vhost/vhost.h > +++ b/drivers/vhost/vhost.h > @@ -194,6 +194,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *, > struct vhost_log *log, unsigned int *log_num); > void vhost_discard_vq_desc(struct vhost_virtqueue *, int n); > > +void vhost_vq_work_queue(struct vhost_virtqueue *vq, struct vhost_work *work); > bool vhost_vq_has_work(struct vhost_virtqueue *vq); > bool vhost_vq_is_setup(struct vhost_virtqueue *vq); > int vhost_vq_init_access(struct vhost_virtqueue *); > -- > 2.25.1 > _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization