Mailing List Archive

[xen master] x86/shadow: make iommu_snoop usage consistent with HAP's
commit c609108b2190d1ef43582c2b17b1b2e0beae0fb0
Author: Jan Beulich <jbeulich@suse.com>
AuthorDate: Mon Feb 13 16:26:03 2023 +0100
Commit: Jan Beulich <jbeulich@suse.com>
CommitDate: Mon Feb 13 16:26:03 2023 +0100

x86/shadow: make iommu_snoop usage consistent with HAP's

First of all the variable is meaningful only when an IOMMU is in use for
a guest. Qualify the check accordingly, like done elsewhere. Furthermore
the controlling command line option is supposed to take effect on VT-d
only. Since command line parsing happens before we know whether we're
going to use VT-d, force the variable back to set when instead running
with AMD IOMMU(s).

Since it may end up misleading, also remove the clearing of the flag in
iommu_setup() and vtd_setup()'s error path. The variable simply is
meaningless with IOMMU(s) disabled, so there's no point touching it
there.

Finally also correct a relevant nearby comment.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Xenia Ragiadakou <burzalodowa@gmail.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
---
xen/arch/x86/mm/shadow/multi.c | 6 +++---
xen/drivers/passthrough/iommu.c | 3 ---
xen/drivers/passthrough/vtd/iommu.c | 3 ---
xen/drivers/passthrough/x86/iommu.c | 11 +++++++++++
4 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c
index cded39ef09..5f3e175bbe 100644
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -556,8 +556,8 @@ _sh_propagate(struct vcpu *v,

ASSERT(!(sflags & PAGE_CACHE_ATTRS));

- /* compute the PAT index for shadow page entry when VT-d is enabled
- * and device assigned.
+ /*
+ * Compute the PAT index for shadow page entry when IOMMU is enabled.
* 1) direct MMIO: compute the PAT index with gMTRR=UC and gPAT.
* 2) if enables snoop control, compute the PAT index as WB.
* 3) if disables snoop control, compute the PAT index with
@@ -577,7 +577,7 @@ _sh_propagate(struct vcpu *v,
gfn_to_paddr(target_gfn),
mfn_to_maddr(target_mfn),
X86_MT_UC);
- else if ( iommu_snoop )
+ else if ( is_iommu_enabled(d) && iommu_snoop )
sflags |= pat_type_2_pte_flags(X86_MT_WB);
else
sflags |= get_pat_flags(v,
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index b4dfa95dfd..921b71e819 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -587,9 +587,6 @@ int __init iommu_setup(void)
printk("I/O virtualisation %sabled\n", iommu_enabled ? "en" : "dis");
if ( !iommu_enabled )
{
-#ifndef iommu_snoop
- iommu_snoop = false;
-#endif
iommu_hwdom_passthrough = false;
iommu_hwdom_strict = false;
}
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 62e143125d..a9f4f28ad6 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -2746,9 +2746,6 @@ static int __init cf_check vtd_setup(void)

error:
iommu_enabled = 0;
-#ifndef iommu_snoop
- iommu_snoop = false;
-#endif
iommu_hwdom_passthrough = false;
iommu_qinval = 0;
iommu_intremap = iommu_intremap_off;
diff --git a/xen/drivers/passthrough/x86/iommu.c b/xen/drivers/passthrough/x86/iommu.c
index f671b0f2bb..5a8b28a4ca 100644
--- a/xen/drivers/passthrough/x86/iommu.c
+++ b/xen/drivers/passthrough/x86/iommu.c
@@ -56,6 +56,17 @@ void __init acpi_iommu_init(void)
if ( !acpi_disabled )
{
ret = acpi_dmar_init();
+
+#ifndef iommu_snoop
+ /*
+ * As long as there's no per-domain snoop control, and as long as on
+ * AMD we uniformly force coherent accesses, a possible command line
+ * override should affect VT-d only.
+ */
+ if ( ret )
+ iommu_snoop = true;
+#endif
+
if ( ret == -ENODEV )
ret = acpi_ivrs_init();
}
--
generated by git-patchbot for /home/xen/git/xen.git#master