|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [for-4.7 1/2] xen/arm: p2m: apply_p2m_changes: Do not undo more than necessary
On Mon, 16 May 2016, Julien Grall wrote:
> Since commit 4b25423a "arch/arm: unmap partially-mapped memory regions",
> Xen has been undoing the P2M mappings when an error occurred during
> insertion or memory allocation.
>
> The function apply_p2m_changes can work with region not-aligned to a
> block size (2MB, 1G) or page size (4K). The mapping will be done by
> splitting the region in a set of regions aligned to the size supported
> by the page table.
>
> The mapping of a region could fail when it is not possible to allocate
> memory for an intermediate table (i.e a new or when shattering a block).
>
> When the mapping is undone, the end of the region is computed using the
> base address of the current region and the size of the failing level.
> However the failing level may not be the leaf one, therefore unrelated
> entries will be removed.
>
> Fix it by removing the mapping from the start address up to the last
> region that has been successfully mapped.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> This patch is a bug fix for Xen 4.7 and candidate for backporting
> up to Xen 4.5. Without this patch, Xen may undo mapping which are
> not part of the region mapped when memory allocation has failed.
>
> Note that Xen 4.7 has code to remove empty translation table (see
> commit de5162b "xen/arm: p2m: Remove translation table when it's
> empty"), however with this patch those tables will not be removed
> in case of failure. This will be fixed after the release as
> the change will be too intrusive for Xen 4.7.
> ---
> xen/arch/arm/p2m.c | 9 +++------
> 1 file changed, 3 insertions(+), 6 deletions(-)
>
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index db21433..68c67b0 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -1189,13 +1189,10 @@ out:
> {
> BUG_ON(addr == end_gpaddr);
> /*
> - * addr keeps the address of the last successfully-inserted mapping,
> - * while apply_p2m_changes() considers an address range which is
> - * exclusive of end_gpaddr: add level_size to addr to obtain the
> - * right end of the range
> + * addr keeps the address of the end of the last
> successfully-inserted
> + * mapping.
> */
> - apply_p2m_changes(d, REMOVE,
> - start_gpaddr, addr + level_sizes[level],
> orig_maddr,
> + apply_p2m_changes(d, REMOVE, start_gpaddr, addr, orig_maddr,
> mattr, 0, p2m_invalid, d->arch.p2m.default_access);
> }
>
> --
> 1.9.1
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |