|
[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 |