]> xenbits.xensource.com Git - xen.git/commitdiff
xen/arm: p2m: Fix incorrect mapping of superpages
authorJulien Grall <julien.grall@arm.com>
Fri, 19 May 2017 16:08:39 +0000 (17:08 +0100)
committerStefano Stabellini <sstabellini@kernel.org>
Mon, 12 Jun 2017 21:39:54 +0000 (14:39 -0700)
The same set of functions is used to set as well as to clean P2M
entries, except for clean operations (INVALID_MFN ~0UL) is passed as a
parameter. Unfortunately, when calculating an appropriate target order
for a particular mapping INVALID_MFN is taken into account which leads
to 4K page target order being set each time even for 2MB and 1GB
mappings.

This will result to break down the superpage into 4K mappings and leave
empty tables allocated.

This was introduced by commit 2ef3e36ec7 "xen/arm: p2m: Introduce
p2m_set_entry and __p2m_set_entry".

Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
master-commit-id: 3fafdc28eb98dc1cb686379d83270516fc38049d

xen/arch/arm/p2m.c

index c7c726b25778d947dbfb8c8f305debd0a29b712c..f85424b1adaf77dfaf4c499066695da54afe524b 100644 (file)
@@ -1085,12 +1085,18 @@ int p2m_set_entry(struct p2m_domain *p2m,
 
     while ( nr )
     {
+        unsigned long mask;
+        unsigned long order;
+
         /*
+         * Don't take into account the MFN when removing mapping (i.e
+         * MFN_INVALID) to calculate the correct target order.
+         *
          * XXX: Support superpage mappings if nr is not aligned to a
          * superpage size.
          */
-        unsigned long mask = gfn_x(sgfn) | mfn_x(smfn) | nr;
-        unsigned long order;
+        mask = !mfn_eq(smfn, INVALID_MFN) ? mfn_x(smfn) : 0;
+        mask |= gfn_x(sgfn) | nr;
 
         /* Always map 4k by 4k when memaccess is enabled */
         if ( unlikely(p2m->mem_access_enabled) )