vhost: convert poll work to be vq based
authorMike Christie <michael.christie@oracle.com>
Mon, 26 Jun 2023 23:22:57 +0000 (18:22 -0500)
committerMichael S. Tsirkin <mst@redhat.com>
Mon, 3 Jul 2023 16:15:13 +0000 (12:15 -0400)
This has the drivers pass in their poll to vq mapping and then converts
the core poll code to use the vq based helpers. In the next patches we
will allow vqs to be handled by different workers, so to allow drivers
to execute operations like queue, stop, flush, etc on specific polls/vqs
we need to know the mappings.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Message-Id: <20230626232307.97930-8-michael.christie@oracle.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
drivers/vhost/net.c
drivers/vhost/vhost.c
drivers/vhost/vhost.h

index 98bb957eb3b962379fe016cafeb3a88dbfc90c41..f2ed7167c848096ef8c8f338325bedc278df65fe 100644 (file)
@@ -1347,8 +1347,10 @@ static int vhost_net_open(struct inode *inode, struct file *f)
                       VHOST_NET_PKT_WEIGHT, VHOST_NET_WEIGHT, true,
                       NULL);
 
-       vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, EPOLLOUT, dev);
-       vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, EPOLLIN, dev);
+       vhost_poll_init(n->poll + VHOST_NET_VQ_TX, handle_tx_net, EPOLLOUT, dev,
+                       vqs[VHOST_NET_VQ_TX]);
+       vhost_poll_init(n->poll + VHOST_NET_VQ_RX, handle_rx_net, EPOLLIN, dev,
+                       vqs[VHOST_NET_VQ_RX]);
 
        f->private_data = n;
        n->page_frag.page = NULL;
index 2ea107e867a1628425984e7fd01edf3f1ef9ef41..b6149ed8acb418135c36ddfaa69de331c80d6aac 100644 (file)
@@ -187,13 +187,15 @@ EXPORT_SYMBOL_GPL(vhost_work_init);
 
 /* Init poll structure */
 void vhost_poll_init(struct vhost_poll *poll, vhost_work_fn_t fn,
-                    __poll_t mask, struct vhost_dev *dev)
+                    __poll_t mask, struct vhost_dev *dev,
+                    struct vhost_virtqueue *vq)
 {
        init_waitqueue_func_entry(&poll->wait, vhost_poll_wakeup);
        init_poll_funcptr(&poll->table, vhost_poll_func);
        poll->mask = mask;
        poll->dev = dev;
        poll->wqh = NULL;
+       poll->vq = vq;
 
        vhost_work_init(&poll->work, fn);
 }
@@ -297,7 +299,7 @@ EXPORT_SYMBOL_GPL(vhost_vq_has_work);
 
 void vhost_poll_queue(struct vhost_poll *poll)
 {
-       vhost_work_queue(poll->dev, &poll->work);
+       vhost_vq_work_queue(poll->vq, &poll->work);
 }
 EXPORT_SYMBOL_GPL(vhost_poll_queue);
 
@@ -508,7 +510,7 @@ void vhost_dev_init(struct vhost_dev *dev,
                vhost_vq_reset(dev, vq);
                if (vq->handle_kick)
                        vhost_poll_init(&vq->poll, vq->handle_kick,
-                                       EPOLLIN, dev);
+                                       EPOLLIN, dev, vq);
        }
 }
 EXPORT_SYMBOL_GPL(vhost_dev_init);
index ac1f4924e548a40ed1e3e8c3f198ea5e06a60529..f44eecd4fcf9e0e7fbadd1d6cc170ccbcdd720b7 100644 (file)
@@ -41,13 +41,15 @@ struct vhost_poll {
        struct vhost_work       work;
        __poll_t                mask;
        struct vhost_dev        *dev;
+       struct vhost_virtqueue  *vq;
 };
 
 void vhost_work_init(struct vhost_work *work, vhost_work_fn_t fn);
 bool vhost_work_queue(struct vhost_dev *dev, struct vhost_work *work);
 
 void vhost_poll_init(struct vhost_poll *poll, vhost_work_fn_t fn,
-                    __poll_t mask, struct vhost_dev *dev);
+                    __poll_t mask, struct vhost_dev *dev,
+                    struct vhost_virtqueue *vq);
 int vhost_poll_start(struct vhost_poll *poll, struct file *file);
 void vhost_poll_stop(struct vhost_poll *poll);
 void vhost_poll_queue(struct vhost_poll *poll);