Message ID | 20170519160839.20186-1-julien.grall@arm.com |
---|---|
State | Accepted |
Commit | 3fafdc28eb98dc1cb686379d83270516fc38049d |
Headers | show |
On Fri, 19 May 2017, Julien Grall wrote: > 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> > --- > This patch is a candidate for Xen 4.9 and also backporting to Xen 4.8. > Without this patch, removing superpage mapping (2MB, 1GB) will breakdown > into 4K mapping first then remove 4K by 4K. > --- > xen/arch/arm/p2m.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c > index 34d57760d7..752e948070 100644 > --- a/xen/arch/arm/p2m.c > +++ b/xen/arch/arm/p2m.c > @@ -1005,12 +1005,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) ) > -- > 2.11.0 >
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 34d57760d7..752e948070 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -1005,12 +1005,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) )
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> --- This patch is a candidate for Xen 4.9 and also backporting to Xen 4.8. Without this patch, removing superpage mapping (2MB, 1GB) will breakdown into 4K mapping first then remove 4K by 4K. --- xen/arch/arm/p2m.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)