[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 29/42] vfio/common: Extract vIOMMU code from vfio_sync_dirty_bitma
From: |
Cédric Le Goater |
Subject: |
[PULL 29/42] vfio/common: Extract vIOMMU code from vfio_sync_dirty_bitmap() |
Date: |
Mon, 24 Jun 2024 23:24:43 +0200 |
From: Avihai Horon <avihaih@nvidia.com>
Extract vIOMMU code from vfio_sync_dirty_bitmap() to a new function and
restructure the code.
This is done in preparation for optimizing vIOMMU device dirty page
tracking. No functional changes intended.
Signed-off-by: Avihai Horon <avihaih@nvidia.com>
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
[ clg: - Rebased on upstream
- Fixed typo in commit log ]
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
Tested-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
---
hw/vfio/common.c | 63 +++++++++++++++++++++++++++++-------------------
1 file changed, 38 insertions(+), 25 deletions(-)
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
index
fe215918bdf66ddbe3c5db803e10ce1aa9756b90..f28641bad5cf4b71fcdc0a6c9d42b24c8d786248
100644
--- a/hw/vfio/common.c
+++ b/hw/vfio/common.c
@@ -1302,37 +1302,50 @@
vfio_sync_ram_discard_listener_dirty_bitmap(VFIOContainerBase *bcontainer,
&vrdl);
}
+static int vfio_sync_iommu_dirty_bitmap(VFIOContainerBase *bcontainer,
+ MemoryRegionSection *section)
+{
+ VFIOGuestIOMMU *giommu;
+ bool found = false;
+ Int128 llend;
+ vfio_giommu_dirty_notifier gdn;
+ int idx;
+
+ QLIST_FOREACH(giommu, &bcontainer->giommu_list, giommu_next) {
+ if (MEMORY_REGION(giommu->iommu_mr) == section->mr &&
+ giommu->n.start == section->offset_within_region) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) {
+ return 0;
+ }
+
+ gdn.giommu = giommu;
+ idx = memory_region_iommu_attrs_to_index(giommu->iommu_mr,
+ MEMTXATTRS_UNSPECIFIED);
+
+ llend = int128_add(int128_make64(section->offset_within_region),
+ section->size);
+ llend = int128_sub(llend, int128_one());
+
+ iommu_notifier_init(&gdn.n, vfio_iommu_map_dirty_notify,
IOMMU_NOTIFIER_MAP,
+ section->offset_within_region, int128_get64(llend),
+ idx);
+ memory_region_iommu_replay(giommu->iommu_mr, &gdn.n);
+
+ return 0;
+}
+
static int vfio_sync_dirty_bitmap(VFIOContainerBase *bcontainer,
MemoryRegionSection *section, Error **errp)
{
ram_addr_t ram_addr;
if (memory_region_is_iommu(section->mr)) {
- VFIOGuestIOMMU *giommu;
-
- QLIST_FOREACH(giommu, &bcontainer->giommu_list, giommu_next) {
- if (MEMORY_REGION(giommu->iommu_mr) == section->mr &&
- giommu->n.start == section->offset_within_region) {
- Int128 llend;
- vfio_giommu_dirty_notifier gdn = { .giommu = giommu };
- int idx = memory_region_iommu_attrs_to_index(giommu->iommu_mr,
- MEMTXATTRS_UNSPECIFIED);
-
- llend =
int128_add(int128_make64(section->offset_within_region),
- section->size);
- llend = int128_sub(llend, int128_one());
-
- iommu_notifier_init(&gdn.n,
- vfio_iommu_map_dirty_notify,
- IOMMU_NOTIFIER_MAP,
- section->offset_within_region,
- int128_get64(llend),
- idx);
- memory_region_iommu_replay(giommu->iommu_mr, &gdn.n);
- break;
- }
- }
- return 0;
+ return vfio_sync_iommu_dirty_bitmap(bcontainer, section);
} else if (memory_region_has_ram_discard_manager(section->mr)) {
int ret;
--
2.45.2
- [PULL 17/42] intel_iommu: Check compatibility with host IOMMU capabilities, (continued)
- [PULL 17/42] intel_iommu: Check compatibility with host IOMMU capabilities, Cédric Le Goater, 2024/06/24
- [PULL 18/42] HostIOMMUDevice: Store the VFIO/VDPA agent, Cédric Le Goater, 2024/06/24
- [PULL 19/42] virtio-iommu: Implement set|unset]_iommu_device() callbacks, Cédric Le Goater, 2024/06/24
- [PULL 20/42] HostIOMMUDevice: Introduce get_iova_ranges callback, Cédric Le Goater, 2024/06/24
- [PULL 21/42] HostIOMMUDevice: Store the aliased bus and devfn, Cédric Le Goater, 2024/06/24
- [PULL 22/42] virtio-iommu: Compute host reserved regions, Cédric Le Goater, 2024/06/24
- [PULL 23/42] virtio-iommu: Remove the implementation of iommu_set_iova_range, Cédric Le Goater, 2024/06/24
- [PULL 24/42] hw/vfio: Remove memory_region_iommu_set_iova_ranges() call, Cédric Le Goater, 2024/06/24
- [PULL 26/42] vfio: Make vfio_devices_dma_logging_start() return bool, Cédric Le Goater, 2024/06/24
- [PULL 25/42] memory: Remove IOMMU MR iommu_set_iova_range API, Cédric Le Goater, 2024/06/24
- [PULL 29/42] vfio/common: Extract vIOMMU code from vfio_sync_dirty_bitmap(),
Cédric Le Goater <=
- [PULL 27/42] vfio: Remove unused declarations from vfio-common.h, Cédric Le Goater, 2024/06/24
- [PULL 32/42] vfio/container: Modify vfio_get_iommu_type() to use a container fd, Cédric Le Goater, 2024/06/24
- [PULL 33/42] vfio/container: Introduce vfio_get_iommu_class_name(), Cédric Le Goater, 2024/06/24
- [PULL 30/42] vfio/container: Introduce vfio_address_space_insert(), Cédric Le Goater, 2024/06/24
- [PULL 28/42] vfio/common: Move dirty tracking ranges update to helper, Cédric Le Goater, 2024/06/24
- [PULL 31/42] vfio/container: Simplify vfio_container_init(), Cédric Le Goater, 2024/06/24
- [PULL 34/42] vfio/container: Introduce vfio_create_container(), Cédric Le Goater, 2024/06/24
- [PULL 35/42] vfio/container: Discover IOMMU type before creating the container, Cédric Le Goater, 2024/06/24
- [PULL 37/42] vfio/container: Switch to QOM, Cédric Le Goater, 2024/06/24
- [PULL 38/42] vfio/container: Introduce an instance_init() handler, Cédric Le Goater, 2024/06/24