aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Jackson <ian.jackson@eu.citrix.com>2013-04-09 15:44:07 +0100
committerIan Jackson <Ian.Jackson@eu.citrix.com>2013-04-09 15:44:07 +0100
commitc70ce4614ea99bc31450141359ec6c5c53a9f7b2 (patch)
treee0dd36c9f9e1e36ffa28b8ad180b361058657c85
parent0984c2b63a7c3e9dfa770b29dac51a5124aecaab (diff)
downloadxen-c70ce4614ea99bc31450141359ec6c5c53a9f7b2.tar.gz
xen-c70ce4614ea99bc31450141359ec6c5c53a9f7b2.tar.bz2
xen-c70ce4614ea99bc31450141359ec6c5c53a9f7b2.zip
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" <JBeulich@xxxxxxxx> "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 <JBeulich@suse.com> Signed-off-by: Tim Deegan <tim@xen.org> Cc: Ian Jackson <ian.jackson@eu.citrix.com> Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Cc: Ian Campbell <ian.campbell@citrix.com> (Cherry-picked from 650354dbc2626b643c12873275ca67782f1382c8.) Conflicts: tools/libxl/libxl_dom.c Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
-rw-r--r--tools/libxl/libxl_create.c10
-rw-r--r--tools/libxl/libxl_dm.c2
-rw-r--r--tools/libxl/libxl_dom.c10
-rw-r--r--tools/libxl/libxl_internal.h5
4 files changed, 16 insertions, 11 deletions
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index e9a5148713..c6011fae2d 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -328,15 +328,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;
@@ -761,14 +762,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;
@@ -1127,7 +1128,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 423e4a4fcb..80b497307c 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -817,7 +817,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 95da18e560..3e6622c3a5 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -18,6 +18,7 @@
#include <glob.h>
#include "libxl_internal.h"
+#include "libxl_arch.h"
#include <xc_dom.h>
#include <xen/hvm/hvm_info_table.h>
@@ -199,12 +200,14 @@ 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);
int tsc_mode;
char *xs_domid, *con_domid;
uint32_t rtc_timeoffset;
+ int rc;
xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus);
@@ -218,7 +221,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 "
@@ -288,7 +290,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 9603b99cb3..13fa509e73 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -881,7 +881,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);
@@ -1274,7 +1275,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);