80 lines
2.5 KiB
Diff
80 lines
2.5 KiB
Diff
From aa9c65215f37fc54a280ce89a2cbfd6235e8ec9f Mon Sep 17 00:00:00 2001
|
|
From: Longpeng <longpeng2@huawei.com>
|
|
Date: Tue, 27 Dec 2022 15:20:15 +0800
|
|
Subject: [PATCH] vdpa: commit all host notifier MRs in a single MR transaction
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
This allows the vhost-vdpa device to batch the setup of all its MRs of
|
|
host notifiers.
|
|
|
|
This significantly reduces the device starting time, e.g. the time spend
|
|
on setup the host notifier MRs reduce from 423ms to 32ms for a VM with
|
|
64 vCPUs and 3 vhost-vDPA generic devices (vdpa_sim_blk, 64vq per device).
|
|
|
|
Signed-off-by: Longpeng <longpeng2@huawei.com>
|
|
Message-Id: <20221227072015.3134-4-longpeng2@huawei.com>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
|
Signed-off-by: fangyi <eric.fangyi@huawei.com>
|
|
---
|
|
hw/virtio/vhost-vdpa.c | 25 +++++++++++++++++++------
|
|
1 file changed, 19 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c
|
|
index f93fac538c..2fd7af1c6b 100644
|
|
--- a/hw/virtio/vhost-vdpa.c
|
|
+++ b/hw/virtio/vhost-vdpa.c
|
|
@@ -522,9 +522,18 @@ static void vhost_vdpa_host_notifiers_uninit(struct vhost_dev *dev, int n)
|
|
{
|
|
int i;
|
|
|
|
+ /*
|
|
+ * Pack all the changes to the memory regions in a single
|
|
+ * transaction to avoid a few updating of the address space
|
|
+ * topology.
|
|
+ */
|
|
+ memory_region_transaction_begin();
|
|
+
|
|
for (i = dev->vq_index; i < dev->vq_index + n; i++) {
|
|
vhost_vdpa_host_notifier_uninit(dev, i);
|
|
}
|
|
+
|
|
+ memory_region_transaction_commit();
|
|
}
|
|
|
|
static void vhost_vdpa_host_notifiers_init(struct vhost_dev *dev)
|
|
@@ -537,17 +546,21 @@ static void vhost_vdpa_host_notifiers_init(struct vhost_dev *dev)
|
|
return;
|
|
}
|
|
|
|
+ /*
|
|
+ * Pack all the changes to the memory regions in a single
|
|
+ * transaction to avoid a few updating of the address space
|
|
+ * topology.
|
|
+ */
|
|
+ memory_region_transaction_begin();
|
|
+
|
|
for (i = dev->vq_index; i < dev->vq_index + dev->nvqs; i++) {
|
|
if (vhost_vdpa_host_notifier_init(dev, i)) {
|
|
- goto err;
|
|
+ vhost_vdpa_host_notifiers_uninit(dev, i - dev->vq_index);
|
|
+ break;
|
|
}
|
|
}
|
|
|
|
- return;
|
|
-
|
|
-err:
|
|
- vhost_vdpa_host_notifiers_uninit(dev, i - dev->vq_index);
|
|
- return;
|
|
+ memory_region_transaction_commit();
|
|
}
|
|
|
|
static void vhost_vdpa_svq_cleanup(struct vhost_dev *dev)
|
|
--
|
|
2.27.0
|
|
|