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

[xen stable-4.14] x86/p2m-pt: fix p2m_flags_to_access()



commit 4ff1d3b86fe901ac558310f41ab0331ed4a249ea
Author:     Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Sep 8 14:52:13 2021 +0200
Commit:     Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Sep 8 14:52:13 2021 +0200

    x86/p2m-pt: fix p2m_flags_to_access()
    
    The initial if() was inverted, invalidating all output from this
    function. Which in turn means the mirroring of P2M mappings into the
    IOMMU didn't always work as intended: Mappings may have got updated when
    there was no need to. There would not have been too few (un)mappings;
    what saves us is that alongside the flags comparison MFNs also get
    compared, with non-present entries always having an MFN of 0 or
    INVALID_MFN while present entries always have MFNs different from these
    two (0 in the table also meant to cover INVALID_MFN):
    
    OLD                                     NEW
    P W     access  MFN                     P W     access  MFN
    0 0     r       0                       0 0     n       0
    0 1     rw      0                       0 1     n       0
    1 0     n       non-0                   1 0     r       non-0
    1 1     n       non-0                   1 1     rw      non-0
    
    present <-> non-present transitions are fine because the MFNs differ.
    present -> present transitions as well as non-present -> non-present
    ones are potentially causing too many map/unmap operations, but never
    too few, because in that case old (bogus) and new access differ.
    
    Fixes: d1bb6c97c31e ("IOMMU: also pass p2m_access_t to 
p2m_get_iommu_flags())
    Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
    Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
    master commit: e70a9a043a5ce6d4025420f729bc473f711bf5d1
    master date: 2021-09-07 14:24:49 +0200
---
 xen/arch/x86/mm/p2m-pt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c
index 68744b74a4..28d1875820 100644
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -483,7 +483,7 @@ int p2m_pt_handle_deferred_changes(uint64_t gpa)
 /* Reconstruct a fake p2m_access_t from stored PTE flags. */
 static p2m_access_t p2m_flags_to_access(unsigned int flags)
 {
-    if ( flags & _PAGE_PRESENT )
+    if ( !(flags & _PAGE_PRESENT) )
         return p2m_access_n;
 
     /* No need to look at _PAGE_NX for now. */
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.14



 


Rackspace

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