Fetch the repository succeeded.
This action will force synchronization from src-openEuler/qemu, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
From 72b7903e406b7011ccba7a3ebbdfe790b421e9fc Mon Sep 17 00:00:00 2001
From: Kunkun Jiang <jiangkunkun@huawei.com>
Date: Fri, 18 Nov 2022 15:22:43 +0800
Subject: [PATCH 23/36] Revert "vfio: Set up nested stage mappings"
This reverts commit 96581a5ee46e89dbc9e1ebe247b00adefb1c7a41.
Signed-off-by: Kunkun Jiang <jiangkunkun@huawei.com>
---
hw/vfio/common.c | 139 ++-----------------------------------------
hw/vfio/pci.c | 21 -------
hw/vfio/trace-events | 2 -
3 files changed, 5 insertions(+), 157 deletions(-)
diff --git a/hw/vfio/common.c b/hw/vfio/common.c
index 58f8a43a43..b3dc090840 100644
--- a/hw/vfio/common.c
+++ b/hw/vfio/common.c
@@ -707,73 +707,6 @@ static bool vfio_get_xlat_addr(IOMMUTLBEntry *iotlb, void **vaddr,
return true;
}
-/* Propagate a guest IOTLB invalidation to the host (nested mode) */
-static void vfio_iommu_unmap_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
-{
- VFIOGuestIOMMU *giommu = container_of(n, VFIOGuestIOMMU, n);
- struct vfio_iommu_type1_cache_invalidate ustruct = {};
- VFIOContainer *container = giommu->container;
- int ret;
-
- assert(iotlb->perm == IOMMU_NONE);
-
- ustruct.argsz = sizeof(ustruct);
- ustruct.flags = 0;
- ustruct.info.argsz = sizeof(struct iommu_cache_invalidate_info);
- ustruct.info.version = IOMMU_CACHE_INVALIDATE_INFO_VERSION_1;
- ustruct.info.cache = IOMMU_CACHE_INV_TYPE_IOTLB;
-
- switch (iotlb->granularity) {
- case IOMMU_INV_GRAN_DOMAIN:
- ustruct.info.granularity = IOMMU_INV_GRANU_DOMAIN;
- break;
- case IOMMU_INV_GRAN_PASID:
- {
- struct iommu_inv_pasid_info *pasid_info;
- int archid = -1;
-
- pasid_info = &ustruct.info.granu.pasid_info;
- ustruct.info.granularity = IOMMU_INV_GRANU_PASID;
- if (iotlb->flags & IOMMU_INV_FLAGS_ARCHID) {
- pasid_info->flags |= IOMMU_INV_ADDR_FLAGS_ARCHID;
- archid = iotlb->arch_id;
- }
- pasid_info->archid = archid;
- trace_vfio_iommu_asid_inv_iotlb(archid);
- break;
- }
- case IOMMU_INV_GRAN_ADDR:
- {
- hwaddr start = iotlb->iova + giommu->iommu_offset;
- struct iommu_inv_addr_info *addr_info;
- size_t size = iotlb->addr_mask + 1;
- int archid = -1;
-
- addr_info = &ustruct.info.granu.addr_info;
- ustruct.info.granularity = IOMMU_INV_GRANU_ADDR;
- if (iotlb->leaf) {
- addr_info->flags |= IOMMU_INV_ADDR_FLAGS_LEAF;
- }
- if (iotlb->flags & IOMMU_INV_FLAGS_ARCHID) {
- addr_info->flags |= IOMMU_INV_ADDR_FLAGS_ARCHID;
- archid = iotlb->arch_id;
- }
- addr_info->archid = archid;
- addr_info->addr = start;
- addr_info->granule_size = size;
- addr_info->nb_granules = 1;
- trace_vfio_iommu_addr_inv_iotlb(archid, start, size,
- 1, iotlb->leaf);
- break;
- }
- }
-
- ret = ioctl(container->fd, VFIO_IOMMU_CACHE_INVALIDATE, &ustruct);
- if (ret) {
- error_report("%p: failed to invalidate CACHE (%d)", container, ret);
- }
-}
-
static void vfio_iommu_map_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotlb)
{
VFIOGuestIOMMU *giommu = container_of(n, VFIOGuestIOMMU, n);
@@ -1107,35 +1040,6 @@ static void vfio_dma_unmap_ram_section(VFIOContainer *container,
}
}
-static void vfio_prereg_listener_region_add(MemoryListener *listener,
- MemoryRegionSection *section)
-{
- VFIOContainer *container =
- container_of(listener, VFIOContainer, prereg_listener);
- Error *err = NULL;
-
- if (!memory_region_is_ram(section->mr)) {
- return;
- }
-
- vfio_dma_map_ram_section(container, section, &err);
- if (err) {
- error_report_err(err);
- }
-}
-static void vfio_prereg_listener_region_del(MemoryListener *listener,
- MemoryRegionSection *section)
-{
- VFIOContainer *container =
- container_of(listener, VFIOContainer, prereg_listener);
-
- if (!memory_region_is_ram(section->mr)) {
- return;
- }
-
- vfio_dma_unmap_ram_section(container, section);
-}
-
static void vfio_listener_region_add(MemoryListener *listener,
MemoryRegionSection *section)
{
@@ -1246,10 +1150,9 @@ static void vfio_listener_region_add(MemoryListener *listener,
memory_region_ref(section->mr);
if (memory_region_is_iommu(section->mr)) {
- IOMMUNotify notify;
VFIOGuestIOMMU *giommu;
IOMMUMemoryRegion *iommu_mr = IOMMU_MEMORY_REGION(section->mr);
- int iommu_idx, flags;
+ int iommu_idx;
trace_vfio_listener_region_add_iommu(iova, end);
/*
@@ -1268,18 +1171,8 @@ static void vfio_listener_region_add(MemoryListener *listener,
llend = int128_sub(llend, int128_one());
iommu_idx = memory_region_iommu_attrs_to_index(iommu_mr,
MEMTXATTRS_UNSPECIFIED);
-
- if (container->iommu_type == VFIO_TYPE1_NESTING_IOMMU) {
- /* IOTLB unmap notifier to propagate guest IOTLB invalidations */
- flags = IOMMU_NOTIFIER_UNMAP;
- notify = vfio_iommu_unmap_notify;
- } else {
- /* MAP/UNMAP IOTLB notifier */
- flags = IOMMU_NOTIFIER_IOTLB_EVENTS;
- notify = vfio_iommu_map_notify;
- }
-
- iommu_notifier_init(&giommu->n, notify, flags,
+ iommu_notifier_init(&giommu->n, vfio_iommu_map_notify,
+ IOMMU_NOTIFIER_IOTLB_EVENTS,
section->offset_within_region,
int128_get64(llend),
iommu_idx);
@@ -1299,9 +1192,7 @@ static void vfio_listener_region_add(MemoryListener *listener,
goto fail;
}
QLIST_INSERT_HEAD(&container->giommu_list, giommu, giommu_next);
- if (flags & IOMMU_NOTIFIER_MAP) {
- memory_region_iommu_replay(giommu->iommu, &giommu->n);
- }
+ memory_region_iommu_replay(giommu->iommu, &giommu->n);
return;
}
@@ -1781,16 +1672,10 @@ static const MemoryListener vfio_memory_listener = {
.log_clear = vfio_listener_log_clear,
};
-static MemoryListener vfio_memory_prereg_listener = {
- .region_add = vfio_prereg_listener_region_add,
- .region_del = vfio_prereg_listener_region_del,
-};
-
static void vfio_listener_release(VFIOContainer *container)
{
memory_listener_unregister(&container->listener);
- if (container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU ||
- container->iommu_type == VFIO_TYPE1_NESTING_IOMMU) {
+ if (container->iommu_type == VFIO_SPAPR_TCE_v2_IOMMU) {
memory_listener_unregister(&container->prereg_listener);
}
}
@@ -2466,20 +2351,6 @@ static int vfio_connect_container(VFIOGroup *group, AddressSpace *as,
vfio_get_iommu_info_migration(container, info);
}
g_free(info);
-
- if (container->iommu_type == VFIO_TYPE1_NESTING_IOMMU) {
- container->prereg_listener = vfio_memory_prereg_listener;
- memory_listener_register(&container->prereg_listener,
- &address_space_memory);
- if (container->error) {
- memory_listener_unregister(&container->prereg_listener);
- ret = -1;
- error_propagate_prepend(errp, container->error,
- "RAM memory listener initialization failed "
- "for container");
- goto free_container_exit;
- }
- }
break;
}
case VFIO_SPAPR_TCE_v2_IOMMU:
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c
index ae5e014e5d..7b45353ce2 100644
--- a/hw/vfio/pci.c
+++ b/hw/vfio/pci.c
@@ -2797,25 +2797,6 @@ static void vfio_unregister_req_notifier(VFIOPCIDevice *vdev)
vdev->req_enabled = false;
}
-static int vfio_iommu_set_pasid_table(PCIBus *bus, int32_t devfn,
- IOMMUConfig *config)
-{
- PCIDevice *pdev = bus->devices[devfn];
- VFIOPCIDevice *vdev = DO_UPCAST(VFIOPCIDevice, pdev, pdev);
- VFIOContainer *container = vdev->vbasedev.group->container;
- struct vfio_iommu_type1_set_pasid_table info;
-
- info.argsz = sizeof(info);
- info.flags = VFIO_PASID_TABLE_FLAG_SET;
- memcpy(&info.config, &config->pasid_cfg, sizeof(config->pasid_cfg));
-
- return ioctl(container->fd, VFIO_IOMMU_SET_PASID_TABLE, &info);
-}
-
-static PCIPASIDOps vfio_pci_pasid_ops = {
- .set_pasid_table = vfio_iommu_set_pasid_table,
-};
-
static void vfio_realize(PCIDevice *pdev, Error **errp)
{
VFIOPCIDevice *vdev = VFIO_PCI(pdev);
@@ -3127,8 +3108,6 @@ static void vfio_realize(PCIDevice *pdev, Error **errp)
vfio_register_req_notifier(vdev);
vfio_setup_resetfn_quirk(vdev);
- pci_setup_pasid_ops(pdev, &vfio_pci_pasid_ops);
-
return;
out_deregister:
diff --git a/hw/vfio/trace-events b/hw/vfio/trace-events
index 20069935f5..a37563a315 100644
--- a/hw/vfio/trace-events
+++ b/hw/vfio/trace-events
@@ -118,8 +118,6 @@ vfio_region_sparse_mmap_header(const char *name, int index, int nr_areas) "Devic
vfio_region_sparse_mmap_entry(int i, unsigned long start, unsigned long end) "sparse entry %d [0x%lx - 0x%lx]"
vfio_get_dev_region(const char *name, int index, uint32_t type, uint32_t subtype) "%s index %d, %08x/%0x8"
vfio_dma_unmap_overflow_workaround(void) ""
-vfio_iommu_addr_inv_iotlb(int asid, uint64_t addr, uint64_t size, uint64_t nb_granules, bool leaf) "nested IOTLB invalidate asid=%d, addr=0x%"PRIx64" granule_size=0x%"PRIx64" nb_granules=0x%"PRIx64" leaf=%d"
-vfio_iommu_asid_inv_iotlb(int asid) "nested IOTLB invalidate asid=%d"
# platform.c
vfio_platform_base_device_init(char *name, int groupid) "%s belongs to group #%d"
--
2.27.0
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。