Is there a particular reason behind the lack of blktap2 support in xen-4.1 packages? I remember there was license issues when packaging xen-4.0 but they had been solved since a long time. Cheers, Darkbasic
> On Wed, 27 Apr 2011 16:42:00 +0200 <darkbasic4 at gmail.com> wrote: > > Is there a particular reason behind the lack of blktap2 support in > xen-4.1 packages? > I remember there was license issues when packaging xen-4.0 but they had > been solved since a long time. >The change-log shows that blktap2 has been enabled in Debian xen 4.1 packages since 4.1.0~rc6-1. If the enabled blktap2 support differs from the upstream blktap2, I am not sure. [snip] xen (4.1.0~rc6-1) unstable; urgency=low ?? * New upstream release candidate. ?? * Build documentation using pdflatex. ?? * Use python 2.6. (closes: #596545) ?? * Fix lintian override. ?? * Install new tools: xl, xenpaging. ?? * Enable blktap2. ???? - Use own md5 implementation. ???? - Fix includes. ???? - Fix linking of blktap2 binaries. ???? - Remove optimization setting. ?? * Temporarily disable hvmloader, wants to download ipxe. ?? * Remove xenstored pid check from xl. ?-- Bastian Blank <waldi at debian.org>? Thu, 17 Mar 2011 16:12:45 +0100 [/snip] -M
----- Original message -----> I found why it hanged without any kind of output: I had > bootloader="/usr/lib/xen-4.0/bin/pygrub" instead of 4.1 -.-because you have Xen to set: /etc/alternatives/xen-default I often manually set a symlink in /usr/lib/xen. This avoids such mistakes and enable smooth upgrades.> Anyway I still have problems: > 1) If module blktap is loaded the vm does not load and I get this error: > failed to run bootloader: -3 > 2) Networking (routed) does not work > > Darkbasicplease paste your full config file for your domU. Thomas
On Wed, Apr 27, 2011 at 04:42:00PM +0200, Niccol? Belli wrote:> Is there a particular reason behind the lack of blktap2 support in > xen-4.1 packages?I never needed it and never got to test it. The current state is as follows: - blktap2 is built and anything is linked correctly. - The tapdisk2 binary is missing and the library is not able to find it properly if installed. Bastian -- Love sometimes expresses itself in sacrifice. -- Kirk, "Metamorphosis", stardate 3220.3
Ian Campbell
2011-May-04 14:51 UTC
[Xen-devel] [PATCH 1 of 4] libxl: check that device model binary is executable
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1304499810 -3600
# Node ID 1e3a986b6d298628c6ef8839448860fd41771b2a
# Parent 4d0e906543dc115b5b2f90e0cb44f6affb3f1f99
libxl: check that device model binary is executable.
This causes us to fail more quickly in more obvious failure case of not
having the right binary installed.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 4d0e906543dc -r 1e3a986b6d29 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c Tue May 03 16:53:22 2011 +0100
+++ b/tools/libxl/libxl_dm.c Wed May 04 10:03:30 2011 +0100
@@ -762,7 +762,12 @@ int libxl__create_device_model(libxl__gc
rc = ERROR_FAIL;
goto out;
}
-
+ if (access(dm, X_OK) < 0) {
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+ "device model %s is not executable", dm);
+ rc = ERROR_FAIL;
+ goto out;
+ }
args = libxl__build_device_model_args(gc, dm, info, disks, num_disks,
vifs, num_vifs);
if (!args) {
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Campbell
2011-May-04 14:51 UTC
[Xen-devel] [PATCH 2 of 4] libxl: remove redundant call to libxl_domain_device_model
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1304516240 -3600
# Node ID cba88f487f7c5a2d08b0dd5a484c0895c6dee17f
# Parent 1e3a986b6d298628c6ef8839448860fd41771b2a
libxl: remove redundant call to libxl_domain_device_model
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r 1e3a986b6d29 -r cba88f487f7c tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c Wed May 04 10:03:30 2011 +0100
+++ b/tools/libxl/libxl_dm.c Wed May 04 14:37:20 2011 +0100
@@ -830,9 +830,7 @@ retry_transaction:
goto out_close;
if (!rc) { /* inner child */
setsid();
- libxl__exec(null, logfile_w, logfile_w,
- libxl__domain_device_model(gc, info),
- args);
+ libxl__exec(null, logfile_w, logfile_w, dm, args);
}
rc = 0;
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Campbell
2011-May-04 14:51 UTC
[Xen-devel] [PATCH 3 of 4] libxl: pass libxl__spawn_starting to libxl__spawn_spawn
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1304516241 -3600
# Node ID ec008dc43727191f472cd4bd5e59d9d35d9d36c2
# Parent cba88f487f7c5a2d08b0dd5a484c0895c6dee17f
libxl: pass libxl__spawn_starting to libxl__spawn_spawn.
Passing a libxl__device_model_starting to a generic function and expecting it
to scrobble inside for the generic data structure is a strange interface.
Instead pass in a libxl__spawn_starting and an opaque hook data pointer.
The for_spawn member of libxl__device_model_starting was annotated with
"first!", suggesting that someone intended to use pointer casting
tricks to
move between the outer and inner struct. However the field is a pointer not a
inline struct so this doesn''t work (and it isn''t used this way
anyhow). Remove
the comment, and move the field away from the front for good measure.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r cba88f487f7c -r ec008dc43727 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c Wed May 04 14:37:20 2011 +0100
+++ b/tools/libxl/libxl_dm.c Wed May 04 14:37:21 2011 +0100
@@ -825,7 +825,8 @@ retry_transaction:
}
}
- rc = libxl__spawn_spawn(gc, p, "device model",
dm_xenstore_record_pid);
+ rc = libxl__spawn_spawn(gc, p->for_spawn, "device model",
+ dm_xenstore_record_pid, p);
if (rc < 0)
goto out_close;
if (!rc) { /* inner child */
diff -r cba88f487f7c -r ec008dc43727 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c Wed May 04 14:37:20 2011 +0100
+++ b/tools/libxl/libxl_exec.c Wed May 04 14:37:21 2011 +0100
@@ -92,16 +92,16 @@ void libxl_report_child_exitstatus(libxl
}
int libxl__spawn_spawn(libxl__gc *gc,
- libxl__device_model_starting *starting,
+ libxl__spawn_starting *for_spawn,
const char *what,
void (*intermediate_hook)(void *for_spawn,
- pid_t innerchild))
+ pid_t innerchild),
+ void *hook_data)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
pid_t child, got;
int status;
pid_t intermediate;
- libxl__spawn_starting *for_spawn = starting->for_spawn;
if (for_spawn) {
for_spawn->what = strdup(what);
@@ -127,7 +127,7 @@ int libxl__spawn_spawn(libxl__gc *gc,
if (!child)
return 0; /* caller runs child code */
- intermediate_hook(starting, child);
+ intermediate_hook(hook_data, child);
if (!for_spawn) _exit(0); /* just detach then */
diff -r cba88f487f7c -r ec008dc43727 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Wed May 04 14:37:20 2011 +0100
+++ b/tools/libxl/libxl_internal.h Wed May 04 14:37:21 2011 +0100
@@ -237,9 +237,9 @@ typedef struct {
} libxl__spawn_starting;
typedef struct {
- libxl__spawn_starting *for_spawn; /* first! */
char *dom_path; /* from libxl_malloc, only for dm_xenstore_record_pid */
int domid;
+ libxl__spawn_starting *for_spawn;
} libxl__device_model_starting;
/* from xl_create */
@@ -277,9 +277,10 @@ _hidden int libxl__wait_for_device_model
void *check_callback_userdata);
_hidden int libxl__spawn_spawn(libxl__gc *gc,
- libxl__device_model_starting *starting,
+ libxl__spawn_starting *starting,
const char *what,
- void (*intermediate_hook)(void *for_spawn, pid_t
innerchild));
+ void (*intermediate_hook)(void *for_spawn, pid_t
innerchild),
+ void *hook_data);
_hidden int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid);
/* Logs errors. A copy of "what" is taken. Return values:
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Campbell
2011-May-04 14:51 UTC
[Xen-devel] [PATCH 4 of 4] libxl: add statup checks to libxl__wait_for_device_model
# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1304516515 -3600
# Node ID 36871b37a9bd286d6ef291b41513c33325db9719
# Parent ec008dc43727191f472cd4bd5e59d9d35d9d36c2
libxl: add statup checks to libxl__wait_for_device_model
When the device model is starting up push checks for spawn failure down into
libxl__wait_for_device_model, allowing us to fail more quickly when the device
model fails to start (e.g. due to a missing library or an early setup error
etc).
In order to allow the select loop in libxl__wait_for_device_model to wake when
the child dies add pipe between the parent and the intermediate process which
the intermediate process can use to signal the parent.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
diff -r ec008dc43727 -r 36871b37a9bd tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Wed May 04 14:37:21 2011 +0100
+++ b/tools/libxl/libxl.c Wed May 04 14:41:55 2011 +0100
@@ -522,7 +522,7 @@ int libxl_domain_unpause(libxl_ctx *ctx,
state = libxl__xs_read(&gc, XBT_NULL, path);
if (state != NULL && !strcmp(state, "paused")) {
libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc,
"/local/domain/0/device-model/%d/command", domid),
"continue");
- libxl__wait_for_device_model(&gc, domid, "running",
NULL, NULL);
+ libxl__wait_for_device_model(&gc, domid, "running",
NULL, NULL, NULL);
}
}
ret = xc_domain_unpause(ctx->xch, domid);
diff -r ec008dc43727 -r 36871b37a9bd tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c Wed May 04 14:37:21 2011 +0100
+++ b/tools/libxl/libxl_device.c Wed May 04 14:41:55 2011 +0100
@@ -410,6 +410,7 @@ out:
int libxl__wait_for_device_model(libxl__gc *gc,
uint32_t domid, char *state,
+ libxl__device_model_starting *starting,
int (*check_callback)(libxl__gc *gc,
uint32_t domid,
const char *state,
@@ -439,7 +440,17 @@ int libxl__wait_for_device_model(libxl__
tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT;
tv.tv_usec = 0;
nfds = xs_fileno(xsh) + 1;
+ if (starting && starting->for_spawn->fd > xs_fileno(xsh))
+ nfds = starting->for_spawn->fd + 1;
+
while (rc > 0 || (!rc && tv.tv_sec > 0)) {
+ if ( starting ) {
+ rc = libxl__spawn_check(gc, starting->for_spawn);
+ if ( rc ) {
+ rc = -1;
+ goto err_died;
+ }
+ }
p = xs_read(xsh, XBT_NULL, path, &len);
if ( NULL == p )
goto again;
@@ -461,15 +472,24 @@ again:
free(p);
FD_ZERO(&rfds);
FD_SET(xs_fileno(xsh), &rfds);
+ if (starting)
+ FD_SET(starting->for_spawn->fd, &rfds);
rc = select(nfds, &rfds, NULL, NULL, &tv);
if (rc > 0) {
- l = xs_read_watch(xsh, &num);
- if (l != NULL)
- free(l);
- else
- goto again;
+ if (FD_ISSET(xs_fileno(xsh), &rfds)) {
+ l = xs_read_watch(xsh, &num);
+ if (l != NULL)
+ free(l);
+ else
+ goto again;
+ }
+ if (starting && FD_ISSET(starting->for_spawn->fd,
&rfds)) {
+ unsigned char dummy;
+ read(starting->for_spawn->fd, &dummy, sizeof(dummy));
+ }
}
}
+err_died:
xs_unwatch(xsh, path, path);
xs_daemon_close(xsh);
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model not ready");
diff -r ec008dc43727 -r 36871b37a9bd tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c Wed May 04 14:37:21 2011 +0100
+++ b/tools/libxl/libxl_dm.c Wed May 04 14:41:55 2011 +0100
@@ -855,14 +855,12 @@ static int detach_device_model(libxl__gc
return rc;
}
-
int libxl__confirm_device_model_startup(libxl__gc *gc,
libxl__device_model_starting *starting)
{
- int problem = libxl__wait_for_device_model(gc, starting->domid,
"running", NULL, NULL);
int detach;
- if ( !problem )
- problem = libxl__spawn_check(gc, starting->for_spawn);
+ int problem = libxl__wait_for_device_model(gc, starting->domid,
"running",
+ starting, NULL, NULL);
detach = detach_device_model(gc, starting);
return problem ? problem : detach;
}
diff -r ec008dc43727 -r 36871b37a9bd tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c Wed May 04 14:37:21 2011 +0100
+++ b/tools/libxl/libxl_dom.c Wed May 04 14:41:55 2011 +0100
@@ -543,7 +543,7 @@ int libxl__domain_save_device_model(libx
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Saving device model state to
%s", filename);
libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc,
"/local/domain/0/device-model/%d/command", domid), "save");
- libxl__wait_for_device_model(gc, domid, "paused", NULL, NULL);
+ libxl__wait_for_device_model(gc, domid, "paused", NULL, NULL,
NULL);
if (stat(filename, &st) < 0)
{
diff -r ec008dc43727 -r 36871b37a9bd tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c Wed May 04 14:37:21 2011 +0100
+++ b/tools/libxl/libxl_exec.c Wed May 04 14:41:55 2011 +0100
@@ -26,6 +26,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h> /* for SIGKILL */
+#include <fcntl.h>
#include "libxl.h"
#include "libxl_internal.h"
@@ -91,6 +92,22 @@ void libxl_report_child_exitstatus(libxl
}
}
+static int libxl__set_fd_flag(libxl__gc *gc, int fd, int flag)
+{
+ int flags;
+
+ flags = fcntl(fd, F_GETFL);
+ if (flags == -1)
+ return ERROR_FAIL;
+
+ flags |= flag;
+
+ if (fcntl(fd, F_SETFL, flags) == -1)
+ return ERROR_FAIL;
+
+ return 0;
+}
+
int libxl__spawn_spawn(libxl__gc *gc,
libxl__spawn_starting *for_spawn,
const char *what,
@@ -100,22 +117,33 @@ int libxl__spawn_spawn(libxl__gc *gc,
{
libxl_ctx *ctx = libxl__gc_owner(gc);
pid_t child, got;
- int status;
+ int status, rc;
pid_t intermediate;
+ int pipes[2];
+ unsigned char dummy = 0;
if (for_spawn) {
for_spawn->what = strdup(what);
if (!for_spawn->what) return ERROR_NOMEM;
+
+ if (libxl_pipe(ctx, pipes) < 0)
+ goto err_parent;
+ if (libxl__set_fd_flag(gc, pipes[0], O_NONBLOCK) < 0 ||
+ libxl__set_fd_flag(gc, pipes[1], O_NONBLOCK) < 0)
+ goto err_parent_pipes;
}
intermediate = libxl_fork(ctx);
- if (intermediate ==-1) {
- if (for_spawn) free(for_spawn->what);
- return ERROR_FAIL;
- }
+ if (intermediate ==-1)
+ goto err_parent_pipes;
+
if (intermediate) {
/* parent */
- if (for_spawn) for_spawn->intermediate = intermediate;
+ if (for_spawn) {
+ for_spawn->intermediate = intermediate;
+ for_spawn->fd = pipes[0];
+ close(pipes[1]);
+ }
return 1;
}
@@ -124,8 +152,10 @@ int libxl__spawn_spawn(libxl__gc *gc,
child = fork();
if (child == -1)
exit(255);
- if (!child)
+ if (!child) {
+ if (for_spawn) close(pipes[1]);
return 0; /* caller runs child code */
+ }
intermediate_hook(hook_data, child);
@@ -134,9 +164,23 @@ int libxl__spawn_spawn(libxl__gc *gc,
got = call_waitpid(ctx->waitpid_instead, child, &status, 0);
assert(got == child);
- _exit(WIFEXITED(status) ? WEXITSTATUS(status) :
+ rc = (WIFEXITED(status) ? WEXITSTATUS(status) :
WIFSIGNALED(status) && WTERMSIG(status) < 127
? WTERMSIG(status)+128 : -1);
+ if (for_spawn)
+ write(pipes[1], &dummy, sizeof(dummy));
+ _exit(rc);
+
+ err_parent_pipes:
+ if (for_spawn) {
+ close(pipes[0]);
+ close(pipes[1]);
+ }
+
+ err_parent:
+ if (for_spawn) free(for_spawn->what);
+
+ return ERROR_FAIL;
}
static void report_spawn_intermediate_status(libxl__gc *gc,
diff -r ec008dc43727 -r 36871b37a9bd tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Wed May 04 14:37:21 2011 +0100
+++ b/tools/libxl/libxl_internal.h Wed May 04 14:41:55 2011 +0100
@@ -233,6 +233,7 @@ typedef struct {
/* put this in your own status structure as returned to application */
/* all fields are private to libxl_spawn_... */
pid_t intermediate;
+ int fd;
char *what; /* malloc''d in spawn_spawn */
} libxl__spawn_starting;
@@ -270,6 +271,7 @@ _hidden int libxl__confirm_device_model_
_hidden int libxl__detach_device_model(libxl__gc *gc,
libxl__device_model_starting *starting);
_hidden int libxl__wait_for_device_model(libxl__gc *gc,
uint32_t domid, char *state,
+ libxl__device_model_starting *starting,
int (*check_callback)(libxl__gc *gc,
uint32_t domid,
const char *state,
diff -r ec008dc43727 -r 36871b37a9bd tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c Wed May 04 14:37:21 2011 +0100
+++ b/tools/libxl/libxl_pci.c Wed May 04 14:41:55 2011 +0100
@@ -612,7 +612,8 @@ static int do_pci_add(libxl__gc *gc, uin
hvm = libxl__domain_is_hvm(gc, domid);
if (hvm) {
- if (libxl__wait_for_device_model(gc, domid, "running", NULL,
NULL) < 0) {
+ if (libxl__wait_for_device_model(gc, domid, "running",
+ NULL, NULL, NULL) < 0) {
return ERROR_FAIL;
}
path = libxl__sprintf(gc,
"/local/domain/0/device-model/%d/state", domid);
@@ -626,7 +627,8 @@ static int do_pci_add(libxl__gc *gc, uin
pcidev->bus, pcidev->dev, pcidev->func);
path = libxl__sprintf(gc,
"/local/domain/0/device-model/%d/command", domid);
xs_write(ctx->xsh, XBT_NULL, path, "pci-ins",
strlen("pci-ins"));
- rc = libxl__wait_for_device_model(gc, domid, NULL, pci_ins_check,
state);
+ rc = libxl__wait_for_device_model(gc, domid, NULL, NULL,
+ pci_ins_check, state);
path = libxl__sprintf(gc,
"/local/domain/0/device-model/%d/parameter", domid);
vdevfn = libxl__xs_read(gc, XBT_NULL, path);
path = libxl__sprintf(gc,
"/local/domain/0/device-model/%d/state", domid);
@@ -843,7 +845,8 @@ static int do_pci_remove(libxl__gc *gc,
hvm = libxl__domain_is_hvm(gc, domid);
if (hvm) {
- if (libxl__wait_for_device_model(gc, domid, "running", NULL,
NULL) < 0) {
+ if (libxl__wait_for_device_model(gc, domid, "running",
+ NULL, NULL, NULL) < 0) {
return ERROR_FAIL;
}
path = libxl__sprintf(gc,
"/local/domain/0/device-model/%d/state", domid);
@@ -857,7 +860,8 @@ static int do_pci_remove(libxl__gc *gc,
* device-model for function 0 */
if ( !force && (pcidev->vdevfn & 0x7) == 0 ) {
xs_write(ctx->xsh, XBT_NULL, path, "pci-rem",
strlen("pci-rem"));
- if (libxl__wait_for_device_model(gc, domid,
"pci-removed", NULL, NULL) < 0) {
+ if (libxl__wait_for_device_model(gc, domid,
"pci-removed",
+ NULL, NULL, NULL) < 0) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model
didn''t respond in time");
/* This depends on guest operating system acknowledging the
* SCI, if it doesn''t respond in time then we may wish
to
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Campbell
2011-May-04 16:23 UTC
Re: [Xen-devel] [PATCH 4 of 4] libxl: add statup checks to libxl__wait_for_device_model
On Wed, 2011-05-04 at 15:51 +0100, Ian Campbell wrote:> # HG changeset patch > # User Ian Campbell <ian.campbell@citrix.com> > # Date 1304516515 -3600 > # Node ID 36871b37a9bd286d6ef291b41513c33325db9719 > # Parent ec008dc43727191f472cd4bd5e59d9d35d9d36c2 > libxl: add statup checks to libxl__wait_for_device_model > > When the device model is starting up push checks for spawn failure down into > libxl__wait_for_device_model, allowing us to fail more quickly when the device > model fails to start (e.g. due to a missing library or an early setup error > etc). > > In order to allow the select loop in libxl__wait_for_device_model to wake when > the child dies add pipe between the parent and the intermediate process which > the intermediate process can use to signal the parent. > > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>I accidentally removed the close of the read side of the pipes from the intermediate process while refactoring. So this incremental fix is needed: --- a/tools/libxl/libxl_exec.c Wed May 04 17:03:14 2011 +0100 +++ b/tools/libxl/libxl_exec.c Wed May 04 17:22:05 2011 +0100 @@ -144,6 +144,7 @@ int libxl__spawn_spawn(libxl__gc *gc, } /* we are now the intermediate process */ + if (for_spawn) close(pipes[0]); child = fork(); if (child == -1) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2011-May-19 16:04 UTC
Re: [Xen-devel] [PATCH 0 of 4] libxl: improve error handling when device model fails to start early on
Ian Campbell writes ("[Xen-devel] [PATCH 0 of 4] libxl: improve error
handling when device model fails to start early
on"):> Currently when the device model fails to start there is a delay until
> we timeout and report error, some users have misinterpretted this
> delay as a hang.
This is disappointing. I fixed exactly this problem about 6 months
ago.
> Secondly we can propagate child failures to the parent much quicker by
> adding a pipe between the intermediate process (which blocks in
> waitpid() on the child until libxl__spawn_detach is called or the
> child exits) to allow failure to be reported immediately and with a
> slightly more specific error message.
And this is what I thought I''d done.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Campbell
2011-May-20 07:08 UTC
Re: [Xen-devel] [PATCH 0 of 4] libxl: improve error handling when device model fails to start early on
On Thu, 2011-05-19 at 17:04 +0100, Ian Jackson wrote:> Ian Campbell writes ("[Xen-devel] [PATCH 0 of 4] libxl: improve error handling when device model fails to start early on"): > > Currently when the device model fails to start there is a delay until > > we timeout and report error, some users have misinterpretted this > > delay as a hang. > > This is disappointing. I fixed exactly this problem about 6 months > ago.Hmm, now you mention it that does sound familiar. And indeed: changeset: 20468:2f7cb671ef38 user: Keir Fraser <keir.fraser@citrix.com> date: Mon Nov 23 07:01:51 2009 +0000 description: libxenlight: check for early failures of qemu-dm This patch makes xl create check whether qemu-dm has started correctly, and causes it to fail immediately with appropriate errors if not. There are other bugfixes too. [...] Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com> So more like 18 months ago? (or I found another different attempt ;-))> > Secondly we can propagate child failures to the parent much quicker by > > adding a pipe between the intermediate process (which blocks in > > waitpid() on the child until libxl__spawn_detach is called or the > > child exits) to allow failure to be reported immediately and with a > > slightly more specific error message. > > And this is what I thought I''d done.Either way, it appears to be broken now. You can confirm by removing one of the libraries that qemu-dm needs, or by chmod -x. Ian. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2011-May-24 14:59 UTC
Re: [Xen-devel] [PATCH 1 of 4] libxl: check that device model binary is executable
Ian Campbell writes ("[Xen-devel] [PATCH 1 of 4] libxl: check that device
model binary is executable"):> libxl: check that device model binary is executable.
Thanks, acked and applied all four.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Jackson
2011-May-24 15:57 UTC
Re: [Xen-devel] [PATCH 4 of 4] libxl: add statup checks to libxl__wait_for_device_model
Ian Campbell writes ("Re: [Xen-devel] [PATCH 4 of 4] libxl: add statup
checks to libxl__wait_for_device_model"):> I accidentally removed the close of the read side of the pipes from the
> intermediate process while refactoring. So this incremental fix is
> needed:
This hunk was in your O_CLOEXEC patch so is now in the tree, although
not part of the changeset for libxl startup checks.
Ian.
> --- a/tools/libxl/libxl_exec.c Wed May 04 17:03:14 2011 +0100
> +++ b/tools/libxl/libxl_exec.c Wed May 04 17:22:05 2011 +0100
> @@ -144,6 +144,7 @@ int libxl__spawn_spawn(libxl__gc *gc,
> }
>
> /* we are now the intermediate process */
> + if (for_spawn) close(pipes[0]);
>
> child = fork();
> if (child == -1)
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Campbell
2011-May-24 16:08 UTC
Re: [Xen-devel] [PATCH 4 of 4] libxl: add statup checks to libxl__wait_for_device_model
On Tue, 2011-05-24 at 16:57 +0100, Ian Jackson wrote:> Ian Campbell writes ("Re: [Xen-devel] [PATCH 4 of 4] libxl: add statup checks to libxl__wait_for_device_model"): > > I accidentally removed the close of the read side of the pipes from the > > intermediate process while refactoring. So this incremental fix is > > needed: > > This hunk was in your O_CLOEXEC patch so is now in the tree, although > not part of the changeset for libxl startup checks.Either way is fine with me. Thanks, Ian.> > Ian. > > > --- a/tools/libxl/libxl_exec.c Wed May 04 17:03:14 2011 +0100 > > +++ b/tools/libxl/libxl_exec.c Wed May 04 17:22:05 2011 +0100 > > @@ -144,6 +144,7 @@ int libxl__spawn_spawn(libxl__gc *gc, > > } > > > > /* we are now the intermediate process */ > > + if (for_spawn) close(pipes[0]); > > > > child = fork(); > > if (child == -1)_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel