[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 41/51] vhost: configure all host notifiers in a single MR transact
From: |
Michael S. Tsirkin |
Subject: |
[PULL 41/51] vhost: configure all host notifiers in a single MR transaction |
Date: |
Thu, 5 Jan 2023 04:16:34 -0500 |
From: Longpeng <longpeng2@huawei.com>
This allows the vhost device to batch the setup of all its host notifiers.
This significantly reduces the device starting time, e.g. the time spend
on enabling notifiers reduce from 376ms to 9.1ms 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-3-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>
---
hw/virtio/vhost.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index 87c49fa679..eb8c4c378c 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -1562,16 +1562,25 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev,
VirtIODevice *vdev)
return r;
}
+ /*
+ * Batch all the host notifiers in a single transaction to avoid
+ * quadratic time complexity in address_space_update_ioeventfds().
+ */
+ memory_region_transaction_begin();
+
for (i = 0; i < hdev->nvqs; ++i) {
r = virtio_bus_set_host_notifier(VIRTIO_BUS(qbus), hdev->vq_index + i,
true);
if (r < 0) {
error_report("vhost VQ %d notifier binding failed: %d", i, -r);
+ memory_region_transaction_commit();
vhost_dev_disable_notifiers(hdev, vdev);
return r;
}
}
+ memory_region_transaction_commit();
+
return 0;
}
@@ -1585,6 +1594,12 @@ void vhost_dev_disable_notifiers(struct vhost_dev *hdev,
VirtIODevice *vdev)
BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(vdev)));
int i, r;
+ /*
+ * Batch all the host notifiers in a single transaction to avoid
+ * quadratic time complexity in address_space_update_ioeventfds().
+ */
+ memory_region_transaction_begin();
+
for (i = 0; i < hdev->nvqs; ++i) {
r = virtio_bus_set_host_notifier(VIRTIO_BUS(qbus), hdev->vq_index + i,
false);
@@ -1592,6 +1607,15 @@ void vhost_dev_disable_notifiers(struct vhost_dev *hdev,
VirtIODevice *vdev)
error_report("vhost VQ %d notifier cleanup failed: %d", i, -r);
}
assert (r >= 0);
+ }
+
+ /*
+ * The transaction expects the ioeventfds to be open when it
+ * commits. Do it now, before the cleanup loop.
+ */
+ memory_region_transaction_commit();
+
+ for (i = 0; i < hdev->nvqs; ++i) {
virtio_bus_cleanup_host_notifier(VIRTIO_BUS(qbus), hdev->vq_index + i);
}
virtio_device_release_ioeventfd(vdev);
--
MST
- [PULL 30/51] include/hw/pci: Clean up a few things checkpatch.pl would flag, (continued)
- [PULL 30/51] include/hw/pci: Clean up a few things checkpatch.pl would flag, Michael S. Tsirkin, 2023/01/05
- [PULL 29/51] include/hw/cxl: Include hw/cxl/*.h where needed, Michael S. Tsirkin, 2023/01/05
- [PULL 31/51] include/hw/pci: Split pci_device.h off pci.h, Michael S. Tsirkin, 2023/01/05
- [PULL 34/51] include/hw/virtio: Break inclusion loop, Michael S. Tsirkin, 2023/01/05
- [PULL 35/51] include: Include headers where needed, Michael S. Tsirkin, 2023/01/05
- [PULL 36/51] include: Don't include qemu/osdep.h, Michael S. Tsirkin, 2023/01/05
- [PULL 37/51] docs/devel: Rules on #include in headers, Michael S. Tsirkin, 2023/01/05
- [PULL 39/51] vdpa: harden the error path if get_iova_range failed, Michael S. Tsirkin, 2023/01/05
- [PULL 40/51] vhost: simplify vhost_dev_enable_notifiers, Michael S. Tsirkin, 2023/01/05
- [PULL 41/51] vhost: configure all host notifiers in a single MR transaction,
Michael S. Tsirkin <=
- [PULL 43/51] virtio-pci: fix proxy->vector_irqfd leak in virtio_pci_set_guest_notifiers, Michael S. Tsirkin, 2023/01/05
- [PULL 38/51] vdpa-dev: get iova range explicitly, Michael S. Tsirkin, 2023/01/05
- [PULL 42/51] vdpa: commit all host notifier MRs in a single MR transaction, Michael S. Tsirkin, 2023/01/05
- [PULL 44/51] tests: virt: Allow changes to PPTT test table, Michael S. Tsirkin, 2023/01/05
- [PULL 45/51] hw/acpi/aml-build: Only generate cluster node in PPTT when specified, Michael S. Tsirkin, 2023/01/05
- [PULL 46/51] tests: virt: Update expected ACPI tables for virt test, Michael S. Tsirkin, 2023/01/05
- [PULL 47/51] tests: acpi: Add and whitelist *.topology blobs, Michael S. Tsirkin, 2023/01/05
- [PULL 48/51] tests: acpi: aarch64: Add topology test for aarch64, Michael S. Tsirkin, 2023/01/05
- [PULL 49/51] tests: acpi: aarch64: Add *.topology tables, Michael S. Tsirkin, 2023/01/05
- [PULL 50/51] acpi: cpuhp: fix guest-visible maximum access size to the legacy reg block, Michael S. Tsirkin, 2023/01/05