|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/3] xen/arm/dom0less-build: Alloc magic pages for Dom0less DomUs from hypervisor
Hi Henry,
On 26/04/2024 05:14, Henry Wang wrote:
> There are use cases (for example using the PV driver) in Dom0less
> setup that require Dom0less DomUs start immediately with Dom0, but
> initialize XenStore later after Dom0's successful boot and call to
> the init-dom0less application.
>
> An error message can seen from the init-dom0less application on
> 1:1 direct-mapped domains:
> ```
> Allocating magic pages
> memory.c:238:d0v0 mfn 0x39000 doesn't belong to d1
> Error on alloc magic pages
> ```
> This is because currently the magic pages for Dom0less DomUs are
> populated by the init-dom0less app through populate_physmap(), and
> populate_physmap() automatically assumes gfn == mfn for 1:1 direct
> mapped domains. This cannot be true for the magic pages that are
> allocated later from the init-dom0less application executed in Dom0.
> For domain using statically allocated memory but not 1:1 direct-mapped,
> similar error "failed to retrieve a reserved page" can be seen as the
> reserved memory list is empty at that time.
>
> To solve above issue, this commit allocates the magic pages for
> Dom0less DomUs at the domain construction time. The base address/PFN
> of the magic page region will be noted and communicated to the
> init-dom0less application in Dom0.
>
> Reported-by: Alec Kwapis <alec.kwapis@xxxxxxxxxxxxx>
> Suggested-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Henry Wang <xin.wang2@xxxxxxx>
> ---
> tools/libs/guest/xg_dom_arm.c | 1 -
> xen/arch/arm/dom0less-build.c | 22 ++++++++++++++++++++++
> xen/include/public/arch-arm.h | 1 +
> 3 files changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/tools/libs/guest/xg_dom_arm.c b/tools/libs/guest/xg_dom_arm.c
> index 2fd8ee7ad4..8cc7f27dbb 100644
> --- a/tools/libs/guest/xg_dom_arm.c
> +++ b/tools/libs/guest/xg_dom_arm.c
> @@ -25,7 +25,6 @@
>
> #include "xg_private.h"
>
> -#define NR_MAGIC_PAGES 4
Moving only this macro to arch-arm.h while leaving the offsets does not make
much sense to me.
I think they all should be moved. This would also allow init-dom0less.h not to
re-define XENSTORE_PFN_OFFSET.
> #define CONSOLE_PFN_OFFSET 0
> #define XENSTORE_PFN_OFFSET 1
> #define MEMACCESS_PFN_OFFSET 2
> diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
> index fb63ec6fd1..40dc85c759 100644
> --- a/xen/arch/arm/dom0less-build.c
> +++ b/xen/arch/arm/dom0less-build.c
> @@ -834,11 +834,33 @@ static int __init construct_domU(struct domain *d,
>
> if ( kinfo.dom0less_feature & DOM0LESS_XENSTORE )
> {
> + struct page_info *magic_pg;
> + mfn_t mfn;
> + gfn_t gfn;
> +
> ASSERT(hardware_domain);
> rc = alloc_xenstore_evtchn(d);
> if ( rc < 0 )
> return rc;
> d->arch.hvm.params[HVM_PARAM_STORE_PFN] = ~0ULL;
> +
> + d->max_pages += NR_MAGIC_PAGES;
> + magic_pg = alloc_domheap_pages(d,
> get_order_from_pages(NR_MAGIC_PAGES), 0);
80 char exceeded
> + if ( magic_pg == NULL )
> + return -ENOMEM;
> +
> + mfn = page_to_mfn(magic_pg);
> + if ( !is_domain_direct_mapped(d) )
> + gfn = gaddr_to_gfn(GUEST_MAGIC_BASE);
> + else
> + gfn = gaddr_to_gfn(mfn_to_maddr(mfn));
> +
> + rc = guest_physmap_add_pages(d, gfn, mfn, NR_MAGIC_PAGES);
> + if ( rc )
> + {
> + free_domheap_pages(magic_pg,
> get_order_from_pages(NR_MAGIC_PAGES));
> + return rc;
> + }
Please create a function alloc_magic_pages to encapsulate the above block.
> }
>
> return rc;
> diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h
> index e167e14f8d..f24e7bbe37 100644
> --- a/xen/include/public/arch-arm.h
> +++ b/xen/include/public/arch-arm.h
> @@ -475,6 +475,7 @@ typedef uint64_t xen_callback_t;
>
> #define GUEST_MAGIC_BASE xen_mk_ullong(0x39000000)
> #define GUEST_MAGIC_SIZE xen_mk_ullong(0x01000000)
> +#define NR_MAGIC_PAGES 4
>
> #define GUEST_RAM_BANKS 2
>
~Michal
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |