mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
This patch introduces libxl_primary_console_exec: a new libxl function
that finds the domid and console number corresponding to the primary console of a given vm. The domid might be different from the domid of the VM and the console number might not be 0 when using stubdoms. The caller (xl_cmdimpl.c in this case) has to make sure that the stubdom is already created before calling libxl_primary_console_exec in the hvm case. In the PV case libxl_primary_console_exec has to be called before libxl_run_bootloader. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
This commit is contained in:
1 parent
6b331584fb
commit
402ddf4b39
3 files changed
+32
-13
No files matched your search
@@ -803,6 +803,15 @@ int libxl_console_exec(struct libxl_ctx *ctx, uint32_t domid, int cons_num)
|
||||
return execl(p, p, domid_s, "--num", cons_num_s, (void *)NULL) == 0 ? 0 : ERROR_FAIL;
|
||||
}
|
||||
|
||||
int libxl_primary_console_exec(struct libxl_ctx *ctx, uint32_t domid_vm)
|
||||
{
|
||||
uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
|
||||
if (stubdomid)
|
||||
return libxl_console_exec(ctx, stubdomid, 1);
|
||||
else
|
||||
return libxl_console_exec(ctx, domid_vm, 0);
|
||||
}
|
||||
|
||||
static char ** libxl_build_device_model_args(struct libxl_ctx *ctx,
|
||||
libxl_device_model_info *info,
|
||||
libxl_device_nic *vifs,
|
||||
|
||||
@@ -399,6 +399,14 @@ int libxl_domain_setmaxmem(struct libxl_ctx *ctx, uint32_t domid, uint32_t targe
|
||||
int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb, int enforce);
|
||||
|
||||
int libxl_console_exec(struct libxl_ctx *ctx, uint32_t domid, int cons_num);
|
||||
/* libxl_primary_console_exec finds the domid and console number
|
||||
* corresponding to the primary console of the given vm, then calls
|
||||
* libxl_console_exec with the right arguments (domid might be different
|
||||
* if the guest is using stubdoms).
|
||||
* This function can be called after creating the device model, in
|
||||
* case of HVM guests, and before libxl_run_bootloader in case of PV
|
||||
* guests using pygrub. */
|
||||
int libxl_primary_console_exec(struct libxl_ctx *ctx, uint32_t domid_vm);
|
||||
|
||||
int libxl_domain_info(struct libxl_ctx*, struct libxl_dominfo *info_r,
|
||||
uint32_t domid);
|
||||
|
||||
+15
-13
@@ -947,9 +947,9 @@ static void *xrealloc(void *ptr, size_t sz) {
|
||||
return r;
|
||||
}
|
||||
|
||||
int autoconnect_console(int cons_num)
|
||||
int autoconnect_console(int hvm)
|
||||
{
|
||||
int status;
|
||||
int status, options;
|
||||
pid_t pid, r;
|
||||
|
||||
/*
|
||||
@@ -966,14 +966,21 @@ int autoconnect_console(int cons_num)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Catch failure of the create process.
|
||||
* In the PV case we only catch failure of the create process, in
|
||||
* the HVM case we also wait for the creation process to be
|
||||
* completed so that the stubdom is already up and running and we
|
||||
* can connect to it.
|
||||
*/
|
||||
if (hvm)
|
||||
options = 0;
|
||||
else
|
||||
options = WNOHANG;
|
||||
sleep(1);
|
||||
r = waitpid(pid, &status, WNOHANG);
|
||||
r = waitpid(pid, &status, options);
|
||||
if (r > 0 && WIFEXITED(status) && WEXITSTATUS(status) != 0)
|
||||
_exit(WEXITSTATUS(status));
|
||||
|
||||
libxl_console_exec(&ctx, domid, cons_num);
|
||||
libxl_primary_console_exec(&ctx, domid);
|
||||
/* Do not return. xl continued in child process */
|
||||
fprintf(stderr, "Unable to attach console\n");
|
||||
_exit(1);
|
||||
@@ -1170,7 +1177,7 @@ start:
|
||||
}
|
||||
|
||||
if (dom_info->console_autoconnect) {
|
||||
ret = autoconnect_console(0);
|
||||
ret = autoconnect_console(info1.hvm);
|
||||
if (ret)
|
||||
goto error_out;
|
||||
}
|
||||
@@ -1624,18 +1631,13 @@ int main_cd_insert(int argc, char **argv)
|
||||
|
||||
int main_console(int argc, char **argv)
|
||||
{
|
||||
int opt = 0, cons_num = 0;
|
||||
int opt = 0;
|
||||
|
||||
while ((opt = getopt(argc, argv, "hn:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
help("console");
|
||||
exit(0);
|
||||
case 'n':
|
||||
if (optarg) {
|
||||
cons_num = strtol(optarg, NULL, 10);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "option not supported\n");
|
||||
break;
|
||||
@@ -1647,7 +1649,7 @@ int main_console(int argc, char **argv)
|
||||
}
|
||||
|
||||
find_domain(argv[optind]);
|
||||
libxl_console_exec(&ctx, domid, 0);
|
||||
libxl_primary_console_exec(&ctx, domid);
|
||||
fprintf(stderr, "Unable to attach console\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||