[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH V2 5/5] intel-iommu: send UNMAP notifications for domain or globa
From: |
Jason Wang |
Subject: |
[PATCH V2 5/5] intel-iommu: send UNMAP notifications for domain or global inv desc |
Date: |
Thu, 23 Feb 2023 14:59:24 +0800 |
From: Peter Xu <peterx@redhat.com>
We don't send UNMAP notification upon domain or global invalidation
which will lead the notifier can't work correctly. One example is to
use vhost remote IOTLB without enabling device IOTLB.
Fixing this by sending UNMAP notification.
Signed-off-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
hw/i386/intel_iommu.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index f006fa6031..a62896759c 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -1530,13 +1530,17 @@ static int
vtd_sync_shadow_page_table_range(VTDAddressSpace *vtd_as,
return vtd_page_walk(s, ce, addr, addr + size, &info, vtd_as->pasid);
}
-static int vtd_sync_shadow_page_table(VTDAddressSpace *vtd_as)
+static int vtd_address_space_sync(VTDAddressSpace *vtd_as)
{
int ret;
VTDContextEntry ce;
IOMMUNotifier *n;
- if (!(vtd_as->iommu.iommu_notify_flags & IOMMU_NOTIFIER_IOTLB_EVENTS)) {
+ /* If no MAP notifier registered, we simply invalidate all the cache */
+ if (!vtd_as_has_map_notifier(vtd_as)) {
+ IOMMU_NOTIFIER_FOREACH(n, &vtd_as->iommu) {
+ memory_region_unmap_iommu_notifier_range(n);
+ }
return 0;
}
@@ -2000,7 +2004,7 @@ static void vtd_iommu_replay_all(IntelIOMMUState *s)
VTDAddressSpace *vtd_as;
QLIST_FOREACH(vtd_as, &s->vtd_as_with_notifiers, next) {
- vtd_sync_shadow_page_table(vtd_as);
+ vtd_address_space_sync(vtd_as);
}
}
@@ -2082,7 +2086,7 @@ static void vtd_context_device_invalidate(IntelIOMMUState
*s,
* framework will skip MAP notifications if that
* happened.
*/
- vtd_sync_shadow_page_table(vtd_as);
+ vtd_address_space_sync(vtd_as);
}
}
}
@@ -2140,7 +2144,7 @@ static void vtd_iotlb_domain_invalidate(IntelIOMMUState
*s, uint16_t domain_id)
if (!vtd_dev_to_context_entry(s, pci_bus_num(vtd_as->bus),
vtd_as->devfn, &ce) &&
domain_id == vtd_get_domain_id(s, &ce, vtd_as->pasid)) {
- vtd_sync_shadow_page_table(vtd_as);
+ vtd_address_space_sync(vtd_as);
}
}
}
--
2.25.1
- [PATCH V2 0/5] Fix UNMAP notifier for intel-iommu, Jason Wang, 2023/02/23
- [PATCH V2 1/5] intel-iommu: fail MAP notifier without caching mode, Jason Wang, 2023/02/23
- [PATCH V2 2/5] intel-iommu: fail DEVIOTLB_UNMAP without dt mode, Jason Wang, 2023/02/23
- [PATCH V2 3/5] memory: introduce memory_region_unmap_iommu_notifier_range(), Jason Wang, 2023/02/23
- [PATCH V2 4/5] smmu: switch to use memory_region_unmap_iommu_notifier_range(), Jason Wang, 2023/02/23
- [PATCH V2 5/5] intel-iommu: send UNMAP notifications for domain or global inv desc,
Jason Wang <=
- Re: [PATCH V2 0/5] Fix UNMAP notifier for intel-iommu, Peter Xu, 2023/02/23