[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC 36/38] x86/hyperlaunch: enable unpausing mulitple domains
This commit enables the domain builder to unpause all domains that have been flagged to start on boot. Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx> --- xen/arch/x86/domain-builder/core.c | 20 ++++++++++++++++++++ xen/arch/x86/include/asm/boot-domain.h | 8 +++++--- xen/arch/x86/include/asm/domain-builder.h | 1 + xen/arch/x86/setup.c | 8 +++++++- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/domain-builder/core.c b/xen/arch/x86/domain-builder/core.c index 2712703e17e6..fa01b8390a23 100644 --- a/xen/arch/x86/domain-builder/core.c +++ b/xen/arch/x86/domain-builder/core.c @@ -6,6 +6,7 @@ #include <xen/init.h> #include <xen/kconfig.h> #include <xen/lib.h> +#include <xen/sched.h> #include <asm/bootinfo.h> #include <asm/domain-builder.h> @@ -206,6 +207,25 @@ unsigned int __init builder_create_domains(struct boot_info *bi) return build_count; } +int __init builder_unpause_domains(struct boot_info *bi) +{ + int i, count = 0; + + for ( i = 0; i < bi->nr_domains; i++ ) + { + struct boot_domain *bd = &bi->domains[i]; + + if ( bd->capabilities & BUILD_CAPS_HARDWARE || + bd->mode & BUILD_MODE_START_ON_BOOT ) + { + domain_unpause_by_systemcontroller(bd->d); + count++; + } + } + + return count; +} + /* * Local variables: * mode: C diff --git a/xen/arch/x86/include/asm/boot-domain.h b/xen/arch/x86/include/asm/boot-domain.h index a574f4941ed3..b592aef84b27 100644 --- a/xen/arch/x86/include/asm/boot-domain.h +++ b/xen/arch/x86/include/asm/boot-domain.h @@ -22,9 +22,11 @@ struct boot_domain { #define BUILD_CAPS_XENSTORE (1 << 2) uint32_t capabilities; - /* On | Off */ -#define BUILD_MODE_PARAVIRT (1 << 0) /* PV | PVH/HVM */ -#define BUILD_MODE_ENABLE_DM (1 << 1) /* HVM | PVH */ + /* On | Off */ +#define BUILD_MODE_PARAVIRT (1 << 0) /* PV | PVH/HVM */ +#define BUILD_MODE_ENABLE_DM (1 << 1) /* HVM | PVH */ +#define BUILD_MODE_LONG (1 << 2) /* 64 BIT | 32 BIT */ +#define BUILD_MODE_START_ON_BOOT (1 << 3) /* UNPAUSED | PAUSED */ uint32_t mode; unsigned long mem_pages; diff --git a/xen/arch/x86/include/asm/domain-builder.h b/xen/arch/x86/include/asm/domain-builder.h index 5dc5661bec07..df55cf52460c 100644 --- a/xen/arch/x86/include/asm/domain-builder.h +++ b/xen/arch/x86/include/asm/domain-builder.h @@ -9,6 +9,7 @@ int __init builder_get_cmdline( void builder_init(struct boot_info *bi); unsigned int builder_create_domains(struct boot_info *bi); +int builder_unpause_domains(struct boot_info *bi); struct domain *arch_create_dom( struct boot_info *bi, struct boot_domain *bd); diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 09b1fc94426d..ba0dd427c81b 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -787,6 +787,7 @@ static inline bool using_2M_mapping(void) static void noreturn init_done(void) { + struct boot_info *bi = &xen_boot_info; void *va; unsigned long start, end; int err; @@ -800,7 +801,12 @@ static void noreturn init_done(void) if ( IS_ENABLED(CONFIG_SELF_TESTS) && cpu_has_xen_shstk ) stub_selftest(); - domain_unpause_by_systemcontroller(dom0); + err = builder_unpause_domains(bi); + if ( err == 0 ) + panic("domain builder: failed to schedule any domain to start\n"); + else + printk("domain builder: unpaused %d of %d domains at boot\n", err, + bi->nr_domains); /* MUST be done prior to removing .init data. */ unregister_init_virtual_region(); -- 2.30.2
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |