diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c index e0eb85bc3d..e3f1a8e111 100644 --- a/xen/arch/x86/mm/p2m-ept.c +++ b/xen/arch/x86/mm/p2m-ept.c @@ -874,12 +874,12 @@ out: ept_sync_domain(p2m); /* For host p2m, may need to change VT-d page table.*/ - if ( rc == 0 && p2m_is_hostp2m(p2m) && need_iommu(d) && + if ( rc == 0 && p2m_is_hostp2m(p2m) && need_modify_vtd_table ) { - if ( iommu_hap_pt_share ) + if ( iommu_use_hap_pt(d) ) rc = iommu_pte_flush(d, gfn, &ept_entry->epte, order, vtd_pte_present); - else + else if ( need_iommu(d) ) { dfn_t dfn = _dfn(gfn); diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c index 0569f1de80..50f7e72fc8 100644 --- a/xen/arch/x86/mm/p2m-pt.c +++ b/xen/arch/x86/mm/p2m-pt.c @@ -678,8 +678,8 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_, mfn_t mfn, && (gfn + (1UL << page_order) - 1 > p2m->max_mapped_pfn) ) p2m->max_mapped_pfn = gfn + (1UL << page_order) - 1; - if ( iommu_enabled && need_iommu(p2m->domain) && - (iommu_old_flags != iommu_pte_flags || old_mfn != mfn_x(mfn)) ) + if ( iommu_enabled && (iommu_old_flags != iommu_pte_flags || + old_mfn != mfn_x(mfn)) ) { ASSERT(rc == 0); @@ -688,7 +688,7 @@ p2m_pt_set_entry(struct p2m_domain *p2m, gfn_t gfn_, mfn_t mfn, if ( iommu_old_flags ) amd_iommu_flush_pages(p2m->domain, gfn, page_order); } - else + else if ( need_iommu(p2m->domain) ) { dfn_t dfn = _dfn(gfn); diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index e5c06e22c7..20e8f97d3c 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -2087,7 +2087,7 @@ static unsigned int mmio_order(const struct domain *d, * - exclude PV guests, should execution reach this code for such. * So be careful when altering this. */ - if ( !need_iommu(d) || !iommu_use_hap_pt(d) || + if ( !iommu_use_hap_pt(d) || (start_fn & ((1UL << PAGE_ORDER_2M) - 1)) || !(nr >> PAGE_ORDER_2M) ) return PAGE_ORDER_4K; diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index 7eae31c7df..898950c63a 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -487,7 +487,7 @@ int iommu_do_domctl( void iommu_share_p2m_table(struct domain* d) { - if ( iommu_enabled && iommu_use_hap_pt(d) ) + if ( iommu_use_hap_pt(d) ) iommu_get_ops()->share_p2m(d); } diff --git a/xen/include/asm-arm/iommu.h b/xen/include/asm-arm/iommu.h index 57d9b1e14a..8d1506c6f7 100644 --- a/xen/include/asm-arm/iommu.h +++ b/xen/include/asm-arm/iommu.h @@ -21,7 +21,7 @@ struct arch_iommu }; /* Always share P2M Table between the CPU and the IOMMU */ -#define iommu_use_hap_pt(d) (1) +#define iommu_use_hap_pt(d) (need_iommu(d)) const struct iommu_ops *iommu_get_ops(void); void __init iommu_set_ops(const struct iommu_ops *ops); diff --git a/xen/include/asm-x86/iommu.h b/xen/include/asm-x86/iommu.h index 0ed4a9e86d..7c3187c8ec 100644 --- a/xen/include/asm-x86/iommu.h +++ b/xen/include/asm-x86/iommu.h @@ -89,8 +89,9 @@ static inline int iommu_hardware_setup(void) return -ENODEV; } -/* Does this domain have a P2M table we can use as its IOMMU pagetable? */ -#define iommu_use_hap_pt(d) (hap_enabled(d) && iommu_hap_pt_share) +/* Are we using the domain P2M table as its IOMMU pagetable? */ +#define iommu_use_hap_pt(d) \ + (hap_enabled(d) && need_iommu(d) && iommu_hap_pt_share) void iommu_update_ire_from_apic(unsigned int apic, unsigned int reg, unsigned int value); unsigned int iommu_read_apic_from_ire(unsigned int apic, unsigned int reg);