[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH] Revert "x86/hvm: simplify 'mmio_direct' check in epte_get_entry_emt()"



> -----Original Message-----
> From: Roger Pau Monne <roger.pau@xxxxxxxxxx>
> Sent: 07 September 2020 18:09
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Roger Pau Monne <roger.pau@xxxxxxxxxx>; Jan Beulich <jbeulich@xxxxxxxx>; 
> Andrew Cooper
> <andrew.cooper3@xxxxxxxxxx>; Wei Liu <wl@xxxxxxx>; Paul Durrant <paul@xxxxxxx>
> Subject: [PATCH] Revert "x86/hvm: simplify 'mmio_direct' check in 
> epte_get_entry_emt()"
> 
> This reverts commit 81fd0d3ca4b2cd309403c6e8da662c325dd35750.
> 
> Original commit only takes into account the APIC access page being a
> 'special' page, but when running a PVH dom0 there are other pages that
> also fulfill the 'special' page check but shouldn't have it's cache
> type set to WB.
> 
> For example the ACPI regions are identity mapped into the guest but
> are also Xen heap pages, and forcing those to WB cache type is wrong.

I don't understand why reversion of this patch alone is sufficient then...
 
> 
> I've discovered this while trying to boot a PVH dom0, which fail to
> boot with this commit applied.
> 
> Revert the commit while this is sorted out: either we settle that the
> current code is correct, or we modify the way ACPI regions are mapped
> into a PVH dom0.
> 
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> Cc: Paul Durrant <paul@xxxxxxx>
> ---
>  xen/arch/x86/hvm/mtrr.c | 15 +++++++++++----
>  1 file changed, 11 insertions(+), 4 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c
> index fb051d59c3..2bd64e8025 100644
> --- a/xen/arch/x86/hvm/mtrr.c
> +++ b/xen/arch/x86/hvm/mtrr.c
> @@ -815,13 +815,23 @@ int epte_get_entry_emt(struct domain *d, unsigned long 
> gfn, mfn_t mfn,
>          return -1;
>      }
> 
> +    if ( direct_mmio )
> +    {
> +        if ( (mfn_x(mfn) ^ mfn_x(d->arch.hvm.vmx.apic_access_mfn)) >> order )
> +            return MTRR_TYPE_UNCACHABLE;
> +        if ( order )
> +            return -1;
> +        *ipat = 1;
> +        return MTRR_TYPE_WRBACK;
> +    }
> +
>      if ( !mfn_valid(mfn) )
>      {
>          *ipat = 1;
>          return MTRR_TYPE_UNCACHABLE;
>      }
> 
> -    if ( !direct_mmio && !is_iommu_enabled(d) && !cache_flush_permitted(d) )
> +    if ( !is_iommu_enabled(d) && !cache_flush_permitted(d) )
>      {
>          *ipat = 1;
>          return MTRR_TYPE_WRBACK;

... since just below this hunk, commit ca24b2ffdbd9 "x86/hvm: set 'ipat' in EPT 
for special pages" introduced the check:

+    for ( i = 0; i < (1ul << order); i++ )
+    {
+        if ( is_special_page(mfn_to_page(mfn_add(mfn, i))) )
+        {
+            if ( order )
+                return -1;
+            *ipat = 1;
+            return MTRR_TYPE_WRBACK;
+        }
+    }
+

So, would that not be catching the ACPI regions?

Also, why is it ok for ACPI regions to be WB if the IOMMU is not enabled? I 
know that this will never be the case for PVH dom0 but why do domUs also have 
to suffer? I think we need a more targeted patch.

  Paul

> @@ -838,9 +848,6 @@ int epte_get_entry_emt(struct domain *d, unsigned long 
> gfn, mfn_t mfn,
>          }
>      }
> 
> -    if ( direct_mmio )
> -        return MTRR_TYPE_UNCACHABLE;
> -
>      gmtrr_mtype = hvm_get_mem_pinned_cacheattr(d, _gfn(gfn), order);
>      if ( gmtrr_mtype >= 0 )
>      {
> --
> 2.28.0





 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.