ed5979
From 760169d538a4e6ba61006f6796cd55af967a7f1e Mon Sep 17 00:00:00 2001
ed5979
From: =?UTF-8?q?Eugenio=20P=C3=A9rez?= <eperezma@redhat.com>
ed5979
Date: Thu, 15 Dec 2022 12:31:38 +0100
ed5979
Subject: [PATCH 06/14] vdpa: request iova_range only once
ed5979
MIME-Version: 1.0
ed5979
Content-Type: text/plain; charset=UTF-8
ed5979
Content-Transfer-Encoding: 8bit
ed5979
ed5979
RH-Author: Eugenio Pérez <eperezma@redhat.com>
ed5979
RH-MergeRequest: 136: vDPA ASID support in Qemu
ed5979
RH-Bugzilla: 2104412
ed5979
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
ed5979
RH-Acked-by: Cindy Lu <lulu@redhat.com>
ed5979
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
ed5979
RH-Commit: [6/13] 2a8ae2f46ae88f01c5535038f38cb7895098b610 (eperezmartin/qemu-kvm)
ed5979
ed5979
Currently iova range is requested once per queue pair in the case of
ed5979
net. Reduce the number of ioctls asking it once at initialization and
ed5979
reusing that value for each vhost_vdpa.
ed5979
ed5979
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
ed5979
Message-Id: <20221215113144.322011-7-eperezma@redhat.com>
ed5979
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
ed5979
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
ed5979
Acked-by: Jason Wang <jasonwang@redhat.com>
ed5979
(cherry picked from commit a585fad26b2e6ccca156d9e65158ad1c5efd268d)
ed5979
---
ed5979
 hw/virtio/vhost-vdpa.c | 15 ---------------
ed5979
 net/vhost-vdpa.c       | 27 ++++++++++++++-------------
ed5979
 2 files changed, 14 insertions(+), 28 deletions(-)
ed5979
ed5979
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
ed5979
index e65603022f..9e7cbf1776 100644
ed5979
--- a/hw/virtio/vhost-vdpa.c
ed5979
+++ b/hw/virtio/vhost-vdpa.c
ed5979
@@ -365,19 +365,6 @@ static int vhost_vdpa_add_status(struct vhost_dev *dev, uint8_t status)
ed5979
     return 0;
ed5979
 }
ed5979
 
ed5979
-static void vhost_vdpa_get_iova_range(struct vhost_vdpa *v)
ed5979
-{
ed5979
-    int ret = vhost_vdpa_call(v->dev, VHOST_VDPA_GET_IOVA_RANGE,
ed5979
-                              &v->iova_range);
ed5979
-    if (ret != 0) {
ed5979
-        v->iova_range.first = 0;
ed5979
-        v->iova_range.last = UINT64_MAX;
ed5979
-    }
ed5979
-
ed5979
-    trace_vhost_vdpa_get_iova_range(v->dev, v->iova_range.first,
ed5979
-                                    v->iova_range.last);
ed5979
-}
ed5979
-
ed5979
 /*
ed5979
  * The use of this function is for requests that only need to be
ed5979
  * applied once. Typically such request occurs at the beginning
ed5979
@@ -465,8 +452,6 @@ static int vhost_vdpa_init(struct vhost_dev *dev, void *opaque, Error **errp)
ed5979
         goto err;
ed5979
     }
ed5979
 
ed5979
-    vhost_vdpa_get_iova_range(v);
ed5979
-
ed5979
     if (!vhost_vdpa_first_dev(dev)) {
ed5979
         return 0;
ed5979
     }
ed5979
diff --git a/net/vhost-vdpa.c b/net/vhost-vdpa.c
ed5979
index 16a5ebe2dd..8d3ed095d0 100644
ed5979
--- a/net/vhost-vdpa.c
ed5979
+++ b/net/vhost-vdpa.c
ed5979
@@ -549,14 +549,15 @@ static const VhostShadowVirtqueueOps vhost_vdpa_net_svq_ops = {
ed5979
 };
ed5979
 
ed5979
 static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
ed5979
-                                           const char *device,
ed5979
-                                           const char *name,
ed5979
-                                           int vdpa_device_fd,
ed5979
-                                           int queue_pair_index,
ed5979
-                                           int nvqs,
ed5979
-                                           bool is_datapath,
ed5979
-                                           bool svq,
ed5979
-                                           VhostIOVATree *iova_tree)
ed5979
+                                       const char *device,
ed5979
+                                       const char *name,
ed5979
+                                       int vdpa_device_fd,
ed5979
+                                       int queue_pair_index,
ed5979
+                                       int nvqs,
ed5979
+                                       bool is_datapath,
ed5979
+                                       bool svq,
ed5979
+                                       struct vhost_vdpa_iova_range iova_range,
ed5979
+                                       VhostIOVATree *iova_tree)
ed5979
 {
ed5979
     NetClientState *nc = NULL;
ed5979
     VhostVDPAState *s;
ed5979
@@ -575,6 +576,7 @@ static NetClientState *net_vhost_vdpa_init(NetClientState *peer,
ed5979
     s->vhost_vdpa.device_fd = vdpa_device_fd;
ed5979
     s->vhost_vdpa.index = queue_pair_index;
ed5979
     s->vhost_vdpa.shadow_vqs_enabled = svq;
ed5979
+    s->vhost_vdpa.iova_range = iova_range;
ed5979
     s->vhost_vdpa.iova_tree = iova_tree;
ed5979
     if (!is_datapath) {
ed5979
         s->cvq_cmd_out_buffer = qemu_memalign(qemu_real_host_page_size(),
ed5979
@@ -654,6 +656,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
ed5979
     int vdpa_device_fd;
ed5979
     g_autofree NetClientState **ncs = NULL;
ed5979
     g_autoptr(VhostIOVATree) iova_tree = NULL;
ed5979
+    struct vhost_vdpa_iova_range iova_range;
ed5979
     NetClientState *nc;
ed5979
     int queue_pairs, r, i = 0, has_cvq = 0;
ed5979
 
ed5979
@@ -697,14 +700,12 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
ed5979
         return queue_pairs;
ed5979
     }
ed5979
 
ed5979
+    vhost_vdpa_get_iova_range(vdpa_device_fd, &iova_range);
ed5979
     if (opts->x_svq) {
ed5979
-        struct vhost_vdpa_iova_range iova_range;
ed5979
-
ed5979
         if (!vhost_vdpa_net_valid_svq_features(features, errp)) {
ed5979
             goto err_svq;
ed5979
         }
ed5979
 
ed5979
-        vhost_vdpa_get_iova_range(vdpa_device_fd, &iova_range);
ed5979
         iova_tree = vhost_iova_tree_new(iova_range.first, iova_range.last);
ed5979
     }
ed5979
 
ed5979
@@ -713,7 +714,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
ed5979
     for (i = 0; i < queue_pairs; i++) {
ed5979
         ncs[i] = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
ed5979
                                      vdpa_device_fd, i, 2, true, opts->x_svq,
ed5979
-                                     iova_tree);
ed5979
+                                     iova_range, iova_tree);
ed5979
         if (!ncs[i])
ed5979
             goto err;
ed5979
     }
ed5979
@@ -721,7 +722,7 @@ int net_init_vhost_vdpa(const Netdev *netdev, const char *name,
ed5979
     if (has_cvq) {
ed5979
         nc = net_vhost_vdpa_init(peer, TYPE_VHOST_VDPA, name,
ed5979
                                  vdpa_device_fd, i, 1, false,
ed5979
-                                 opts->x_svq, iova_tree);
ed5979
+                                 opts->x_svq, iova_range, iova_tree);
ed5979
         if (!nc)
ed5979
             goto err;
ed5979
     }
ed5979
-- 
ed5979
2.31.1
ed5979