Blame SOURCES/kvm-vhost-Decouple-vhost_svq_add-from-VirtQueueElement.patch

29b115
From 5c8de23e185a1a1f0b19eac3c9fa03411c9f545c Mon Sep 17 00:00:00 2001
29b115
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
29b115
Date: Thu, 21 Jul 2022 15:38:55 +0200
29b115
Subject: [PATCH 14/32] vhost: Decouple vhost_svq_add from VirtQueueElement
29b115
MIME-Version: 1.0
29b115
Content-Type: text/plain; charset=UTF-8
29b115
Content-Transfer-Encoding: 8bit
29b115
29b115
RH-Author: Eugenio Pérez <eperezma@redhat.com>
29b115
RH-MergeRequest: 108: Net Control Virtqueue shadow Support
29b115
RH-Commit: [14/27] 463087dd316adc91b9c7a4e6634c6fc1745c1849 (eperezmartin/qemu-kvm)
29b115
RH-Bugzilla: 1939363
29b115
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
29b115
RH-Acked-by: Cindy Lu <lulu@redhat.com>
29b115
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
29b115
29b115
Bugzilla: https://bugzilla.redhat.com/1939363
29b115
29b115
Upstream Status: git://git.qemu.org/qemu.git
29b115
29b115
commit 1f46ae65d85f677b660bda46685dd3e94885a7cb
29b115
Author: Eugenio Pérez <eperezma@redhat.com>
29b115
Date:   Wed Jul 20 08:59:33 2022 +0200
29b115
29b115
    vhost: Decouple vhost_svq_add from VirtQueueElement
29b115
29b115
    VirtQueueElement comes from the guest, but we're heading SVQ to be able
29b115
    to modify the element presented to the device without the guest's
29b115
    knowledge.
29b115
29b115
    To do so, make SVQ accept sg buffers directly, instead of using
29b115
    VirtQueueElement.
29b115
29b115
    Add vhost_svq_add_element to maintain element convenience.
29b115
29b115
    Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
29b115
    Acked-by: Jason Wang <jasowang@redhat.com>
29b115
    Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
29b115
    Signed-off-by: Jason Wang <jasowang@redhat.com>
29b115
29b115
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
29b115
---
29b115
 hw/virtio/vhost-shadow-virtqueue.c | 33 ++++++++++++++++++++----------
29b115
 1 file changed, 22 insertions(+), 11 deletions(-)
29b115
29b115
diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c
29b115
index 1d2bab287b..3cec03d709 100644
29b115
--- a/hw/virtio/vhost-shadow-virtqueue.c
29b115
+++ b/hw/virtio/vhost-shadow-virtqueue.c
29b115
@@ -172,30 +172,31 @@ static bool vhost_svq_vring_write_descs(VhostShadowVirtqueue *svq, hwaddr *sg,
29b115
 }
29b115
 
29b115
 static bool vhost_svq_add_split(VhostShadowVirtqueue *svq,
29b115
-                                VirtQueueElement *elem, unsigned *head)
29b115
+                                const struct iovec *out_sg, size_t out_num,
29b115
+                                const struct iovec *in_sg, size_t in_num,
29b115
+                                unsigned *head)
29b115
 {
29b115
     unsigned avail_idx;
29b115
     vring_avail_t *avail = svq->vring.avail;
29b115
     bool ok;
29b115
-    g_autofree hwaddr *sgs = g_new(hwaddr, MAX(elem->out_num, elem->in_num));
29b115
+    g_autofree hwaddr *sgs = g_new(hwaddr, MAX(out_num, in_num));
29b115
 
29b115
     *head = svq->free_head;
29b115
 
29b115
     /* We need some descriptors here */
29b115
-    if (unlikely(!elem->out_num && !elem->in_num)) {
29b115
+    if (unlikely(!out_num && !in_num)) {
29b115
         qemu_log_mask(LOG_GUEST_ERROR,
29b115
                       "Guest provided element with no descriptors");
29b115
         return false;
29b115
     }
29b115
 
29b115
-    ok = vhost_svq_vring_write_descs(svq, sgs, elem->out_sg, elem->out_num,
29b115
-                                     elem->in_num > 0, false);
29b115
+    ok = vhost_svq_vring_write_descs(svq, sgs, out_sg, out_num, in_num > 0,
29b115
+                                     false);
29b115
     if (unlikely(!ok)) {
29b115
         return false;
29b115
     }
29b115
 
29b115
-    ok = vhost_svq_vring_write_descs(svq, sgs, elem->in_sg, elem->in_num, false,
29b115
-                                     true);
29b115
+    ok = vhost_svq_vring_write_descs(svq, sgs, in_sg, in_num, false, true);
29b115
     if (unlikely(!ok)) {
29b115
         return false;
29b115
     }
29b115
@@ -237,17 +238,19 @@ static void vhost_svq_kick(VhostShadowVirtqueue *svq)
29b115
  *
29b115
  * Return -EINVAL if element is invalid, -ENOSPC if dev queue is full
29b115
  */
29b115
-static int vhost_svq_add(VhostShadowVirtqueue *svq, VirtQueueElement *elem)
29b115
+static int vhost_svq_add(VhostShadowVirtqueue *svq, const struct iovec *out_sg,
29b115
+                          size_t out_num, const struct iovec *in_sg,
29b115
+                          size_t in_num, VirtQueueElement *elem)
29b115
 {
29b115
     unsigned qemu_head;
29b115
-    unsigned ndescs = elem->in_num + elem->out_num;
29b115
+    unsigned ndescs = in_num + out_num;
29b115
     bool ok;
29b115
 
29b115
     if (unlikely(ndescs > vhost_svq_available_slots(svq))) {
29b115
         return -ENOSPC;
29b115
     }
29b115
 
29b115
-    ok = vhost_svq_add_split(svq, elem, &qemu_head);
29b115
+    ok = vhost_svq_add_split(svq, out_sg, out_num, in_sg, in_num, &qemu_head);
29b115
     if (unlikely(!ok)) {
29b115
         g_free(elem);
29b115
         return -EINVAL;
29b115
@@ -258,6 +261,14 @@ static int vhost_svq_add(VhostShadowVirtqueue *svq, VirtQueueElement *elem)
29b115
     return 0;
29b115
 }
29b115
 
29b115
+/* Convenience wrapper to add a guest's element to SVQ */
29b115
+static int vhost_svq_add_element(VhostShadowVirtqueue *svq,
29b115
+                                 VirtQueueElement *elem)
29b115
+{
29b115
+    return vhost_svq_add(svq, elem->out_sg, elem->out_num, elem->in_sg,
29b115
+                         elem->in_num, elem);
29b115
+}
29b115
+
29b115
 /**
29b115
  * Forward available buffers.
29b115
  *
29b115
@@ -294,7 +305,7 @@ static void vhost_handle_guest_kick(VhostShadowVirtqueue *svq)
29b115
                 break;
29b115
             }
29b115
 
29b115
-            r = vhost_svq_add(svq, elem);
29b115
+            r = vhost_svq_add_element(svq, elem);
29b115
             if (unlikely(r != 0)) {
29b115
                 if (r == -ENOSPC) {
29b115
                     /*
29b115
-- 
29b115
2.31.1
29b115