[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] x86/iommu: introduce a cache sync hook
commit 91526b460e5009fc56edbd6809e66c327281faba Author: Roger Pau Monné <roger.pau@xxxxxxxxxx> AuthorDate: Tue Jul 7 14:38:34 2020 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Jul 7 14:38:34 2020 +0200 x86/iommu: introduce a cache sync hook The hook is only implemented for VT-d and it uses the already existing iommu_sync_cache function present in VT-d code. The new hook is added so that the cache can be flushed by code outside of VT-d when using shared page tables. Note that alloc_pgtable_maddr must use the now locally defined sync_cache function, because IOMMU ops are not yet setup the first time the function gets called during IOMMU initialization. No functional change intended. This is part of XSA-321. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/drivers/passthrough/vtd/extern.h | 1 - xen/drivers/passthrough/vtd/iommu.c | 5 +++-- xen/include/asm-x86/iommu.h | 7 +++++++ xen/include/xen/iommu.h | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/xen/drivers/passthrough/vtd/extern.h b/xen/drivers/passthrough/vtd/extern.h index 52b5e1c60d..f15947af1f 100644 --- a/xen/drivers/passthrough/vtd/extern.h +++ b/xen/drivers/passthrough/vtd/extern.h @@ -43,7 +43,6 @@ void disable_qinval(struct vtd_iommu *iommu); int enable_intremap(struct vtd_iommu *iommu, int eim); void disable_intremap(struct vtd_iommu *iommu); -void iommu_sync_cache(const void *addr, unsigned int size); int iommu_alloc(struct acpi_drhd_unit *drhd); void iommu_free(struct acpi_drhd_unit *drhd); diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 55eb140033..93bcd72f84 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -147,7 +147,7 @@ static int context_get_domain_id(struct context_entry *context, static int iommus_incoherent; -void iommu_sync_cache(const void *addr, unsigned int size) +static void sync_cache(const void *addr, unsigned int size) { int i; static unsigned int clflush_size = 0; @@ -180,7 +180,7 @@ uint64_t alloc_pgtable_maddr(unsigned long npages, nodeid_t node) vaddr = __map_domain_page(cur_pg); memset(vaddr, 0, PAGE_SIZE); - iommu_sync_cache(vaddr, PAGE_SIZE); + sync_cache(vaddr, PAGE_SIZE); unmap_domain_page(vaddr); cur_pg++; } @@ -2778,6 +2778,7 @@ const struct iommu_ops __initconstrel intel_iommu_ops = { .iotlb_flush_all = iommu_flush_iotlb_all, .get_reserved_device_memory = intel_iommu_get_reserved_device_memory, .dump_p2m_table = vtd_dump_p2m_table, + .sync_cache = sync_cache, }; const struct iommu_init_ops __initconstrel intel_iommu_init_ops = { diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h index 85741f7c96..864e025078 100644 --- a/xen/include/asm-x86/iommu.h +++ b/xen/include/asm-x86/iommu.h @@ -121,6 +121,13 @@ extern bool untrusted_msi; int pi_update_irte(const struct pi_desc *pi_desc, const struct pirq *pirq, const uint8_t gvec); +#define iommu_sync_cache(addr, size) ({ \ + const struct iommu_ops *ops = iommu_get_ops(); \ + \ + if ( ops->sync_cache ) \ + iommu_vcall(ops, sync_cache, addr, size); \ +}) + #endif /* !__ARCH_X86_IOMMU_H__ */ /* * Local variables: diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h index 6264d3d07f..3272874958 100644 --- a/xen/include/xen/iommu.h +++ b/xen/include/xen/iommu.h @@ -275,6 +275,7 @@ struct iommu_ops { int (*setup_hpet_msi)(struct msi_desc *); int (*adjust_irq_affinities)(void); + void (*sync_cache)(const void *addr, unsigned int size); #endif /* CONFIG_X86 */ int __must_check (*suspend)(void); -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |