[xen master] VT-d: reconcile iommu_inclusive_mapping and iommu=dom0-strict

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen master] VT-d: reconcile iommu_inclusive_mapping and iommu=dom0-strict

patchbot
commit 402ab7cb6611641bdfd344b09b26b05c29f7bdac
Author:     Paul Durrant <[hidden email]>
AuthorDate: Mon Jul 2 13:06:49 2018 +0200
Commit:     Jan Beulich <[hidden email]>
CommitDate: Mon Jul 2 13:06:49 2018 +0200

    VT-d: reconcile iommu_inclusive_mapping and iommu=dom0-strict
   
    The documentation for the iommu_inclusive_mapping Xen command line option
    states:
   
    "Use this to work around firmware issues providing incorrect RMRR entries"
   
    Unfortunately this workaround does not function correctly if the dom0-strict
    iommu option is also specified.
   
    The documentation goes on to say:
   
    "Rather than only mapping RAM pages for IOMMU accesses for Dom0, with this
     option all pages up to 4GB, not marked as unusable in the E820 table, will
     get a mapping established."
   
    This patch modifies the VT-d hardware domain initialization code such that
    the workaround will continue to function in dom0-strict mode, by mapping
    all pages not marked as unusable *unless* they are RAM pages not assigned
    to dom0.
   
    NOTE: This patch modifies the test in drivers/passthrough/vtd/iommu.c from
          need_iommu() to is_pv_domain() since dom0-strict implies need_iommu()
          so we no longer want to gate invocation of vtd_set_hwdom_mapping()
          on that.
          It also exports the iommu_dom0_strict flag so that the implementation
          of vtd_set_hwdom_mapping() can test it explicitly. It would be
          possible to test need_iommu() instead, but it is more illustrative
          to test the original flag rather than one of its side-effects.
   
    Signed-off-by: Paul Durrant <[hidden email]>
    Reviewed-by: Roger Pau Monne <[hidden email]>
    Acked-by: Kevin Tian <[hidden email]>
---
 docs/misc/xen-command-line.markdown   | 4 +++-
 xen/drivers/passthrough/vtd/iommu.c   | 2 +-
 xen/drivers/passthrough/vtd/x86/vtd.c | 8 ++++++++
 xen/include/xen/iommu.h               | 2 +-
 4 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown
index c0b7724ae9..ff8c7d4c2f 100644
--- a/docs/misc/xen-command-line.markdown
+++ b/docs/misc/xen-command-line.markdown
@@ -1213,7 +1213,9 @@ wait descriptor timed out', try increasing this value.
 Use this to work around firmware issues providing incorrect RMRR entries.
 Rather than only mapping RAM pages for IOMMU accesses for Dom0, with this
 option all pages up to 4GB, not marked as unusable in the E820 table, will
-get a mapping established.
+get a mapping established. Note that this option is only applicable to a
+PV dom0. Also note that if `dom0-strict` mode is enabled then conventional
+RAM pages not assigned to dom0 will not be mapped.
 
 ### irq\_ratelimit (x86)
 > `= <integer>`
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 08bce92d40..1710256823 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1304,7 +1304,7 @@ static void __hwdom_init intel_iommu_hwdom_init(struct domain *d)
 {
     struct acpi_drhd_unit *drhd;
 
-    if ( !iommu_passthrough && !need_iommu(d) )
+    if ( !iommu_passthrough && is_pv_domain(d) )
     {
         /* Set up 1:1 page table for hardware domain. */
         vtd_set_hwdom_mapping(d);
diff --git a/xen/drivers/passthrough/vtd/x86/vtd.c b/xen/drivers/passthrough/vtd/x86/vtd.c
index 2938f69fbb..cc2bfea162 100644
--- a/xen/drivers/passthrough/vtd/x86/vtd.c
+++ b/xen/drivers/passthrough/vtd/x86/vtd.c
@@ -144,6 +144,14 @@ void __hwdom_init vtd_set_hwdom_mapping(struct domain *d)
         if ( xen_in_range(pfn) )
             continue;
 
+        /*
+         * If dom0-strict mode is enabled then exclude conventional RAM
+         * and let the common code map dom0's pages.
+         */
+        if ( iommu_dom0_strict &&
+             page_is_ram_type(pfn, RAM_TYPE_CONVENTIONAL) )
+            continue;
+
         tmp = 1 << (PAGE_SHIFT - PAGE_SHIFT_4K);
         for ( j = 0; j < tmp; j++ )
         {
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 33c8b221dc..6b42e3b876 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -29,7 +29,7 @@
 #include <asm/iommu.h>
 
 extern bool_t iommu_enable, iommu_enabled;
-extern bool_t force_iommu, iommu_verbose;
+extern bool_t force_iommu, iommu_dom0_strict, iommu_verbose;
 extern bool_t iommu_workaround_bios_bug, iommu_igfx, iommu_passthrough;
 extern bool_t iommu_snoop, iommu_qinval, iommu_intremap, iommu_intpost;
 extern bool_t iommu_hap_pt_share;
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog