|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH RFCv2 11/15] xen/arm: mm: Allow page-table allocation from the boot allocator
On Sun, 25 Apr 2021, Julien Grall wrote:
> From: Julien Grall <julien.grall@xxxxxxx>
>
> At the moment, page-table can only be allocated from domheap. This means
> it is not possible to create mapping in the page-tables via
> map_pages_to_xen() if page-table needs to be allocated.
>
> In order to avoid open-coding page-tables update in early boot, we need
> to be able to allocate page-tables much earlier. Thankfully, we have the
> boot allocator for those cases.
>
> create_xen_table() is updated to cater early boot allocation by using
> alloc_boot_pages().
>
> Note, this is not sufficient to bootstrap the page-tables (i.e mapping
> before any memory is actually mapped). This will be addressed
> separately.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
> Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> Changes in v2:
> - New patch
> ---
> xen/arch/arm/mm.c | 20 ++++++++++++++------
> 1 file changed, 14 insertions(+), 6 deletions(-)
>
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index ae5a07ea956b..d090fdfd5994 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -1011,19 +1011,27 @@ static void xen_unmap_table(const lpae_t *table)
>
> static int create_xen_table(lpae_t *entry)
> {
> - struct page_info *pg;
> + mfn_t mfn;
> void *p;
> lpae_t pte;
>
> - pg = alloc_domheap_page(NULL, 0);
> - if ( pg == NULL )
> - return -ENOMEM;
> + if ( system_state != SYS_STATE_early_boot )
> + {
> + struct page_info *pg = alloc_domheap_page(NULL, 0);
> +
> + if ( pg == NULL )
> + return -ENOMEM;
> +
> + mfn = page_to_mfn(pg);
> + }
> + else
> + mfn = alloc_boot_pages(1, 1);
>
> - p = xen_map_table(page_to_mfn(pg));
> + p = xen_map_table(mfn);
> clear_page(p);
> xen_unmap_table(p);
>
> - pte = mfn_to_xen_entry(page_to_mfn(pg), MT_NORMAL);
> + pte = mfn_to_xen_entry(mfn, MT_NORMAL);
> pte.pt.table = 1;
> write_pte(entry, pte);
>
> --
> 2.17.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |