From 650354dbc2626b643c12873275ca67782f1382c8 Mon Sep 17 00:00:00 2001 From: Tim Deegan Date: Thu, 14 Mar 2013 12:39:39 +0000 Subject: libxl: run libxl__arch_domain_create() much earlier. Among other things, arch_domain_create() sets the shadow(/hap/p2m) memory allocation, which must happen after vcpus are assigned (or the shadow op will fail) but before memory is allocated (or we might run out of p2m memory). libxl__build_pre(), which already sets similar things like maxmem, semes like a reasonable spot for it. That needed a bit of plumbing to get the right datastructure from the caller. As a side-effect, the return code from libxl__arch_domain_create() is no longer ignored. This bug was analysed in: From: "Jan Beulich" "Re: [Xen-devel] [xen-unstable test] 16788: regressions - FAIL" Date: Mon, 04 Mar 2013 16:34:53 +0000 http://lists.xen.org/archives/html/xen-devel/2013-03/msg00191.html Reported-by: Jan Beulich Signed-off-by: Tim Deegan Cc: Ian Jackson Cc: Stefano Stabellini Cc: Ian Campbell --- tools/libxl/libxl_create.c | 10 +++++----- tools/libxl/libxl_dm.c | 2 +- tools/libxl/libxl_dom.c | 10 +++++++--- tools/libxl/libxl_internal.h | 5 +++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 2ea628a893..30a4507dfc 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -315,15 +315,16 @@ static int init_console_info(libxl__device_console *console, int dev_num) } int libxl__domain_build(libxl__gc *gc, - libxl_domain_build_info *info, + libxl_domain_config *d_config, uint32_t domid, libxl__domain_build_state *state) { + libxl_domain_build_info *const info = &d_config->b_info; char **vments = NULL, **localents = NULL; struct timeval start_time; int i, ret; - ret = libxl__build_pre(gc, domid, info, state); + ret = libxl__build_pre(gc, domid, d_config, state); if (ret) goto out; @@ -750,14 +751,14 @@ static void domcreate_bootloader_done(libxl__egc *egc, dcs->dmss.callback = domcreate_devmodel_started; if ( restore_fd < 0 ) { - rc = libxl__domain_build(gc, &d_config->b_info, domid, state); + rc = libxl__domain_build(gc, d_config, domid, state); domcreate_rebuild_done(egc, dcs, rc); return; } /* Restore */ - rc = libxl__build_pre(gc, domid, info, state); + rc = libxl__build_pre(gc, domid, d_config, state); if (rc) goto out; @@ -1169,7 +1170,6 @@ static void domcreate_attach_pci(libxl__egc *egc, libxl__multidev *multidev, } } - libxl__arch_domain_create(gc, d_config, domid); domcreate_console_available(egc, dcs); domcreate_complete(egc, dcs, 0); diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index caca7b5033..82e30df6be 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -849,7 +849,7 @@ void libxl__spawn_stub_dm(libxl__egc *egc, libxl__stub_dm_spawn_state *sdss) if (ret) goto out; uint32_t dm_domid = sdss->pvqemu.guest_domid; - ret = libxl__domain_build(gc, &dm_config->b_info, dm_domid, stubdom_state); + ret = libxl__domain_build(gc, dm_config, dm_domid, stubdom_state); if (ret) goto out; diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index de555eedd9..2dd429f639 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -18,6 +18,7 @@ #include #include "libxl_internal.h" +#include "libxl_arch.h" #include #include @@ -199,10 +200,12 @@ static int numa_place_domain(libxl__gc *gc, uint32_t domid, } int libxl__build_pre(libxl__gc *gc, uint32_t domid, - libxl_domain_build_info *info, libxl__domain_build_state *state) + libxl_domain_config *d_config, libxl__domain_build_state *state) { + libxl_domain_build_info *const info = &d_config->b_info; libxl_ctx *ctx = libxl__gc_owner(gc); char *xs_domid, *con_domid; + int rc; xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus); @@ -216,7 +219,6 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, * whatever that turns out to be. */ if (libxl_defbool_val(info->numa_placement)) { - int rc; if (!libxl_bitmap_is_full(&info->cpumap)) { LOG(ERROR, "Can run NUMA placement only if no vcpu " @@ -243,7 +245,9 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid, state->console_port = xc_evtchn_alloc_unbound(ctx->xch, domid, state->console_domid); state->vm_generationid_addr = 0; - return 0; + rc = libxl__arch_domain_create(gc, d_config, domid); + + return rc; } int libxl__build_post(libxl__gc *gc, uint32_t domid, diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 8be086d6bb..3ba3a21850 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -884,7 +884,8 @@ typedef struct { } libxl__domain_build_state; _hidden int libxl__build_pre(libxl__gc *gc, uint32_t domid, - libxl_domain_build_info *info, libxl__domain_build_state *state); + libxl_domain_config * const d_config, + libxl__domain_build_state *state); _hidden int libxl__build_post(libxl__gc *gc, uint32_t domid, libxl_domain_build_info *info, libxl__domain_build_state *state, char **vms_ents, char **local_ents); @@ -1278,7 +1279,7 @@ _hidden int libxl__domain_make(libxl__gc *gc, uint32_t *domid); _hidden int libxl__domain_build(libxl__gc *gc, - libxl_domain_build_info *info, + libxl_domain_config *d_config, uint32_t domid, libxl__domain_build_state *state); -- cgit v1.2.3