[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 11/22] virtio-iommu: Consolidate host reserved regions and propert
|
From: |
Cédric Le Goater |
|
Subject: |
[PULL 11/22] virtio-iommu: Consolidate host reserved regions and property set ones |
|
Date: |
Mon, 6 Nov 2023 15:36:42 +0100 |
From: Eric Auger <eric.auger@redhat.com>
Up to now we were exposing to the RESV_MEM probe requests the
reserved memory regions set though the reserved-regions array property.
Combine those with the host reserved memory regions if any. Those
latter are tagged as RESERVED. We don't have more information about
them besides then cannot be mapped. Reserved regions set by
property have higher priority.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: "Michael S. Tsirkin" <mst@redhat.com>
Tested-by: Yanghang Liu <yanghliu@redhat.com>
Signed-off-by: Cédric Le Goater <clg@redhat.com>
---
hw/virtio/virtio-iommu.c | 36 ++++++++++++++++++++++++++++++++++++
hw/virtio/trace-events | 1 +
2 files changed, 37 insertions(+)
diff --git a/hw/virtio/virtio-iommu.c b/hw/virtio/virtio-iommu.c
index
15aadd6fdd623a59eaaf56980857e0b7d0bf4ee0..dede0d41aa56efbe8af6ff50bc57c78a5917fe09
100644
--- a/hw/virtio/virtio-iommu.c
+++ b/hw/virtio/virtio-iommu.c
@@ -21,6 +21,7 @@
#include "qemu/log.h"
#include "qemu/iov.h"
#include "qemu/range.h"
+#include "qemu/reserved-region.h"
#include "exec/target_page.h"
#include "hw/qdev-properties.h"
#include "hw/virtio/virtio.h"
@@ -1156,6 +1157,40 @@ static int
virtio_iommu_set_page_size_mask(IOMMUMemoryRegion *mr,
return 0;
}
+/**
+ * rebuild_resv_regions: rebuild resv regions with both the
+ * info of host resv ranges and property set resv ranges
+ */
+static int rebuild_resv_regions(IOMMUDevice *sdev)
+{
+ GList *l;
+ int i = 0;
+
+ /* free the existing list and rebuild it from scratch */
+ g_list_free_full(sdev->resv_regions, g_free);
+ sdev->resv_regions = NULL;
+
+ /* First add host reserved regions if any, all tagged as RESERVED */
+ for (l = sdev->host_resv_ranges; l; l = l->next) {
+ ReservedRegion *reg = g_new0(ReservedRegion, 1);
+ Range *r = (Range *)l->data;
+
+ reg->type = VIRTIO_IOMMU_RESV_MEM_T_RESERVED;
+ range_set_bounds(®->range, range_lob(r), range_upb(r));
+ sdev->resv_regions = resv_region_list_insert(sdev->resv_regions, reg);
+ trace_virtio_iommu_host_resv_regions(sdev->iommu_mr.parent_obj.name, i,
+ range_lob(®->range),
+ range_upb(®->range));
+ i++;
+ }
+ /*
+ * then add higher priority reserved regions set by the machine
+ * through properties
+ */
+ add_prop_resv_regions(sdev);
+ return 0;
+}
+
/**
* virtio_iommu_set_iova_ranges: Conveys the usable IOVA ranges
*
@@ -1211,6 +1246,7 @@ static int virtio_iommu_set_iova_ranges(IOMMUMemoryRegion
*mr,
range_inverse_array(iova_ranges,
&sdev->host_resv_ranges,
0, UINT64_MAX);
+ rebuild_resv_regions(sdev);
return 0;
error:
diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events
index
0af7a2886cc58456279d441d0f1a3efb825c35ef..637cac4edf0f3459915d9d840bfc02501e7ca7a5
100644
--- a/hw/virtio/trace-events
+++ b/hw/virtio/trace-events
@@ -135,6 +135,7 @@ virtio_iommu_notify_flag_add(const char *name) "add
notifier to mr %s"
virtio_iommu_notify_flag_del(const char *name) "del notifier from mr %s"
virtio_iommu_switch_address_space(uint8_t bus, uint8_t slot, uint8_t fn, bool
on) "Device %02x:%02x.%x switching address space (iommu enabled=%d)"
virtio_iommu_freeze_granule(uint64_t page_size_mask) "granule set to 0x%"PRIx64
+virtio_iommu_host_resv_regions(const char *name, uint32_t index, uint64_t lob,
uint64_t upb) "mr=%s host-resv-reg[%d] = [0x%"PRIx64",0x%"PRIx64"]"
# virtio-mem.c
virtio_mem_send_response(uint16_t type) "type=%" PRIu16
--
2.41.0
- [PULL 05/22] range: Make range_compare() public, (continued)
- [PULL 05/22] range: Make range_compare() public, Cédric Le Goater, 2023/11/06
- [PULL 06/22] util/reserved-region: Add new ReservedRegion helpers, Cédric Le Goater, 2023/11/06
- [PULL 07/22] virtio-iommu: Introduce per IOMMUDevice reserved regions, Cédric Le Goater, 2023/11/06
- [PULL 03/22] vfio: Collect container iova range info, Cédric Le Goater, 2023/11/06
- [PULL 08/22] range: Introduce range_inverse_array(), Cédric Le Goater, 2023/11/06
- [PULL 09/22] virtio-iommu: Record whether a probe request has been issued, Cédric Le Goater, 2023/11/06
- [PULL 10/22] virtio-iommu: Implement set_iova_ranges() callback, Cédric Le Goater, 2023/11/06
- [PULL 12/22] test: Add some tests for range and resv-mem helpers, Cédric Le Goater, 2023/11/06
- [PULL 11/22] virtio-iommu: Consolidate host reserved regions and property set ones,
Cédric Le Goater <=
- [PULL 13/22] hw/pci: modify pci_setup_iommu() to set PCIIOMMUOps, Cédric Le Goater, 2023/11/06
- [PULL 14/22] util/uuid: Add UUID_STR_LEN definition, Cédric Le Goater, 2023/11/06
- [PULL 15/22] vfio/pci: Fix buffer overrun when writing the VF token, Cédric Le Goater, 2023/11/06
- [PULL 16/22] util/uuid: Remove UUID_FMT_LEN, Cédric Le Goater, 2023/11/06
- [PULL 17/22] util/uuid: Define UUID_STR_LEN from UUID_NONE string, Cédric Le Goater, 2023/11/06
- [PULL 18/22] vfio/container: Move IBM EEH related functions into spapr_pci_vfio.c, Cédric Le Goater, 2023/11/06
- [PULL 19/22] vfio/container: Move vfio_container_add/del_section_window into spapr.c, Cédric Le Goater, 2023/11/06
- [PULL 20/22] vfio/container: Move spapr specific init/deinit into spapr.c, Cédric Le Goater, 2023/11/06
- [PULL 21/22] vfio/spapr: Make vfio_spapr_create/remove_window static, Cédric Le Goater, 2023/11/06
- [PULL 22/22] vfio/common: Move vfio_host_win_add/del into spapr.c, Cédric Le Goater, 2023/11/06