|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 12/23] xen/arm: introduce create_domUs
On Mon, 15 Oct 2018, Julien Grall wrote:
> Hi,
>
> On 05/10/2018 19:47, Stefano Stabellini wrote:
> > Call a new function, "create_domUs", from setup_xen to start DomU VMs.
> >
> > Introduce support for the "xen,domU" compatible node on device tree.
>
> s/xen,domU/xen,domain/
OK
> > Create new DomU VMs based on the information found on device tree under
> > "xen,domU". Calls construct_domU for each domain.
>
> Ditto
>
> s/Calls/Call/
OK
> >
> > Introduce a simple global variable named max_init_domid to keep track of
> > the initial allocated domids. It holds the max domid among the initial
> > domains.
> >
> > Move the discard_initial_modules after DomUs have been built.
> >
> > First create domUs, then start dom0 -- no point in trying to start dom0
> > when the cpu is busy.
> >
> > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx>
> > Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
> > CC: andrew.cooper3@xxxxxxxxxx
> > CC: jbeulich@xxxxxxxx
> > ---
> > Changes in v4:
> > - constify parameters
> > - nr_spis to 0 or GUEST_VPL011_SPI - 32 + 1 depending on vpl011
> > - remove pointless initializer
> > - remove change to domain_create for dom0 (useless)
> > - make construct_domU return error
> >
> > Changes in v3:
> > - move patch earlier and introduce empty construct_domU to fix bisection
> > builds
> > - fix max_init_domid to actually hold the max domid among initial
> > domains (instead of max_domid + 1)
> > - move domain_unpause_by_systemcontroller(dom0) after creating domUs
> >
> > Changes in v2:
> > - coding style
> > - set nr_spis to 32
> > - introduce create_domUs
> > ---
> > xen/arch/arm/domain_build.c | 51
> > +++++++++++++++++++++++++++++++++++++++++----
> > xen/arch/arm/setup.c | 5 +++++
> > xen/include/asm-arm/setup.h | 3 +++
> > xen/include/asm-x86/setup.h | 2 ++
> > 4 files changed, 57 insertions(+), 4 deletions(-)
> >
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index ba3dad1..547b624 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -7,6 +7,7 @@
> > #include <asm/irq.h>
> > #include <asm/regs.h>
> > #include <xen/errno.h>
> > +#include <xen/err.h>
> > #include <xen/device_tree.h>
> > #include <xen/libfdt/libfdt.h>
> > #include <xen/guest_access.h>
> > @@ -2290,6 +2291,51 @@ static int __init __construct_domain(struct domain
> > *d, struct kernel_info *kinfo
> > return 0;
> > }
> > +static int __init construct_domU(struct domain *d,
> > + const struct dt_device_node *node)
> > +{
> > + return -ENOSYS;
> > +}
> > +
> > +void __init create_domUs(void)
> > +{
> > + struct dt_device_node *node;
> > + const struct dt_device_node *chosen = dt_find_node_by_name(dt_host,
> > + "chosen");
>
> Newline
OK
> It would also be better to use dt_find_node_by_path("/chosen") because
> dt_find_node_by_name may return a different node (e.g /foo/chosen).
Good idea
> > + BUG_ON(chosen == NULL);
> > + dt_for_each_child_node(chosen, node)
> > + {
> > + u32 len;
> > + struct domain *d;
> > + struct xen_domctl_createdomain d_cfg = {
> > + .arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE,
> > + .arch.nr_spis = 0,
> > + .max_vcpus = 1,
> > + .max_evtchn_port = -1,
> > + .max_grant_frames = 64,
> > + .max_maptrack_frames = 1024,
> > + };
> > +
> > + if ( !dt_device_is_compatible(node, "xen,domain") )
> > + continue;
> > +
> > + if ( dt_get_property(node, "vpl011", &len) != NULL )
>
> dt_property_read_bool will do the right thing for you.
OK
> > + d_cfg.arch.nr_spis = GUEST_VPL011_SPI - 32 + 1;
> > + dt_property_read_u32(node, "cpus", &d_cfg.max_vcpus);
> > +
> > + d = domain_create(++max_init_domid, &d_cfg, false);
> > + if ( IS_ERR(d) )
> > + panic("Error creating domain %s", dt_node_name(node));
> > +
> > + d->is_console = 1;
>
> is_console is a bool, so this should be true.
OK
> > +
> > + if ( construct_domU(d, node) != 0 )
> > + panic("Could not set up domain %s", dt_node_name(node));
> > +
> > + domain_unpause_by_systemcontroller(d);
> > + }
> > +}
> > +
> > int __init construct_dom0(struct domain *d)
> > {
> > const struct bootcmdline *kernel =
> > boot_cmdline_find_by_kind(BOOTMOD_KERNEL);
> > @@ -2342,10 +2388,7 @@ int __init construct_dom0(struct domain *d)
> > if ( rc < 0 )
> > return rc;
> > - rc = __construct_domain(d, &kinfo);
> > - discard_initial_modules();
> > -
> > - return rc;
> > + return __construct_domain(d, &kinfo);
> > }
> > /*
> > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> > index d6d1546..8d8f180 100644
> > --- a/xen/arch/arm/setup.c
> > +++ b/xen/arch/arm/setup.c
> > @@ -64,8 +64,11 @@ static unsigned long opt_xenheap_megabytes __initdata;
> > integer_param("xenheap_megabytes", opt_xenheap_megabytes);
> > #endif
> > +domid_t __read_mostly max_init_domid;
> > +
> > static __used void init_done(void)
> > {
> > + discard_initial_modules();
> > free_init_memory();
> > startup_cpu_idle_loop();
> > }
> > @@ -926,6 +929,8 @@ void __init start_xen(unsigned long boot_phys_offset,
> > /* Must be done past setting system_state. */
> > unregister_init_virtual_region();
> > + create_domUs();
>
> I missed that bits in the previous version. I am not very sure this should be
> called after unregister_init_virtual_region(). If you call it after and get an
> hypervisor crash in init code, then the stack trace may miss some information
> (e.g bug frame).
>
> Looking at x86, unregister_init_virtual_region() is called from init_done. So
> we probably want to move that call there.
OK
> > +
> > domain_unpause_by_systemcontroller(dom0);
> > /* Switch on to the dynamically allocated stack for the idle vcpu
> > diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
> > index 177e8db..5620fe7 100644
> > --- a/xen/include/asm-arm/setup.h
> > +++ b/xen/include/asm-arm/setup.h
> > @@ -68,6 +68,8 @@ struct bootinfo {
> > extern struct bootinfo bootinfo;
> > +extern domid_t max_init_domid;
> > +
> > void arch_init_memory(void);
> > void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len);
> > @@ -84,6 +86,7 @@ void acpi_create_efi_mmap_table(struct domain *d,
> > int acpi_make_efi_nodes(void *fdt, struct membank tbl_add[]);
> > int construct_dom0(struct domain *d);
> > +void __init create_domUs(void);
> > void discard_initial_modules(void);
> > void dt_unreserved_regions(paddr_t s, paddr_t e,
> > diff --git a/xen/include/asm-x86/setup.h b/xen/include/asm-x86/setup.h
> > index 42fddeb..1c80783 100644
> > --- a/xen/include/asm-x86/setup.h
> > +++ b/xen/include/asm-x86/setup.h
> > @@ -66,4 +66,6 @@ extern bool opt_dom0_shadow;
> > #endif
> > extern bool dom0_pvh;
> > +#define max_init_domid (0)
> > +
> > #endif
> >
>
> Cheers,
>
> --
> Julien Grall
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |