|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 3/5] xen/arm: configure dom0less domain for enabling xenstore after boot
On Sat, 29 Jan 2022, Julien Grall wrote:
> On 28/01/2022 21:33, Stefano Stabellini wrote:
> > From: Luca Miccio <lucmiccio@xxxxxxxxx>
> >
> > If "xen,enhanced" is enabled, then add to dom0less domains:
> >
> > - the hypervisor node in device tree
> > - the xenstore event channel
> >
> > The xenstore event channel is also used for the first notification to
> > let the guest know that xenstore has become available.
> >
> > Signed-off-by: Luca Miccio <lucmiccio@xxxxxxxxx>
> > Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx>
> > Reviewed-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
> > CC: Julien Grall <julien@xxxxxxx>
> > CC: Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>
> > CC: Bertrand Marquis <bertrand.marquis@xxxxxxx>
> >
> > ---
> > Changes in v3:
> > - use evtchn_alloc_unbound
> >
> > Changes in v2:
> > - set HVM_PARAM_STORE_PFN to ~0ULL at domain creation
> > - in alloc_xenstore_evtchn do not call _evtchn_alloc_unbound
> > ---
> > xen/arch/arm/domain_build.c | 41 +++++++++++++++++++++++++++++++++++++
> > 1 file changed, 41 insertions(+)
> >
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index 9144d6c0b6..8e030a7f05 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -27,6 +27,7 @@
> > #include <asm/setup.h>
> > #include <asm/cpufeature.h>
> > #include <asm/domain_build.h>
> > +#include <xen/event.h>
> > #include <xen/irq.h>
> > #include <xen/grant_table.h>
> > @@ -2619,6 +2620,8 @@ static int __init prepare_dtb_domU(struct domain *d,
> > struct kernel_info *kinfo)
> > int ret;
> > kinfo->phandle_gic = GUEST_PHANDLE_GIC;
> > + kinfo->gnttab_start = GUEST_GNTTAB_BASE;
> > + kinfo->gnttab_size = GUEST_GNTTAB_SIZE;
> > addrcells = GUEST_ROOT_ADDRESS_CELLS;
> > sizecells = GUEST_ROOT_SIZE_CELLS;
> > @@ -2693,6 +2696,13 @@ static int __init prepare_dtb_domU(struct domain *d,
> > struct kernel_info *kinfo)
> > goto err;
> > }
> > + if ( kinfo->dom0less_enhanced )
> > + {
> > + ret = make_hypervisor_node(d, kinfo, addrcells, sizecells);
>
> Looking at the code, I think the extended regions will not work properly
> because we are looking at the host memory layout. In the case of domU, we want
> to use the guest layout. Please have a look how it was done in libxl.
Yeah you are right, I'll do that.
> > + if ( ret )
> > + goto err;
> > + }
> > +
> > ret = fdt_end_node(kinfo->fdt);
> > if ( ret < 0 )
> > goto err;
> > @@ -2959,6 +2969,25 @@ static int __init construct_domain(struct domain *d,
> > struct kernel_info *kinfo)
> > return 0;
> > }
> > +static int __init alloc_xenstore_evtchn(struct domain *d)
> > +{
> > + evtchn_alloc_unbound_t alloc;
> > + int rc;
> > +
> > + alloc.dom = d->domain_id;
> > + alloc.remote_dom = hardware_domain->domain_id;
>
> The first thing evtchn_alloc_unbound() will do is looking up the domain. This
> seems a bit pointless given that we have the domain in hand. Shouldn't we
> extend evtchn_alloc_unbound() to pass the domain?
That's a good point, but I actually think it is better to go back to
[2]. The evtchn_alloc_unbound discussion is still ongoing but I'll keep
this suggestion in mind.
[2] https://marc.info/?l=xen-devel&m=164203543615114
> > + rc = evtchn_alloc_unbound(&alloc, true);
> > + if ( rc )
> > + {
> > + printk("Failed allocating event channel for domain\n");
> > + return rc;
> > + }
> > +
> > + d->arch.hvm.params[HVM_PARAM_STORE_EVTCHN] = alloc.port;
> > +
> > + return 0;
> > +}
> > +
> > static int __init construct_domU(struct domain *d,
> > const struct dt_device_node *node)
> > {
> > @@ -3014,7 +3043,19 @@ static int __init construct_domU(struct domain *d,
> > return rc;
> > if ( kinfo.vpl011 )
> > + {
> > rc = domain_vpl011_init(d, NULL);
> > + if ( rc < 0 )
> > + return rc;
> > + }
> > +
> > + if ( kinfo.dom0less_enhanced )
> > + {
> > + rc = alloc_xenstore_evtchn(d);
> > + if ( rc < 0 )
> > + return rc;
> > + d->arch.hvm.params[HVM_PARAM_STORE_PFN] = ~0ULL;
>
> I think it would be easy to allocate the page right now. So what prevent us to
> do it right now?
Because (as you noted as a comment to the following patch) as soon as
d->arch.hvm.params[HVM_PARAM_STORE_PFN] is set the guest can continue
with the initialization and will expect the right data to be set on the
page. In other words: it is not enough to have the pfn allocated, we
also need xenstore to initialize it. At that point, it is better to do
both later from init-dom0less.c.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |