mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
libxl: ao abort: Abort libxc save/restore
Register the the save/restore helper interface with the abort machinery. When we are informed that save/restore should be aborted, we make a note of the that in our rc variable, and send the helper a SIGTERM. It will die in due course. Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com> --- v2: New in this version of the series.
This commit is contained in:
1 parent
b6ac9b7fc6
commit
e12dade76a
2 files changed
+25
No files matched your search
@@ -2702,6 +2702,7 @@ typedef struct libxl__save_helper_state {
|
||||
int rc;
|
||||
int completed; /* retval/errnoval valid iff completed */
|
||||
int retval, errnoval; /* from xc_domain_save / xc_domain_restore */
|
||||
libxl__ao_abortable abrt;
|
||||
libxl__carefd *pipes[2]; /* 0 = helper's stdin, 1 = helper's stdout */
|
||||
libxl__ev_fd readable;
|
||||
libxl__ev_child child;
|
||||
|
||||
@@ -32,6 +32,7 @@ static void run_helper(libxl__egc *egc, libxl__save_helper_state *shs,
|
||||
const unsigned long *argnums, int num_argnums);
|
||||
|
||||
static void helper_failed(libxl__egc*, libxl__save_helper_state *shs, int rc);
|
||||
static void helper_stop(libxl__egc *egc, libxl__ao_abortable*, int rc);
|
||||
static void helper_stdout_readable(libxl__egc *egc, libxl__ev_fd *ev,
|
||||
int fd, short events, short revents);
|
||||
static void helper_exited(libxl__egc *egc, libxl__ev_child *ch,
|
||||
@@ -166,9 +167,15 @@ static void run_helper(libxl__egc *egc, libxl__save_helper_state *shs,
|
||||
shs->rc = 0;
|
||||
shs->completed = 0;
|
||||
shs->pipes[0] = shs->pipes[1] = 0;
|
||||
libxl__ao_abortable_init(&shs->abrt);
|
||||
libxl__ev_fd_init(&shs->readable);
|
||||
libxl__ev_child_init(&shs->child);
|
||||
|
||||
shs->abrt.ao = shs->ao;
|
||||
shs->abrt.callback = helper_stop;
|
||||
rc = libxl__ao_abortable_register(&shs->abrt);
|
||||
if (rc) goto out;
|
||||
|
||||
shs->stdin_what = GCSPRINTF("domain %"PRIu32" save/restore helper"
|
||||
" stdin pipe", domid);
|
||||
shs->stdout_what = GCSPRINTF("domain %"PRIu32" save/restore helper"
|
||||
@@ -262,6 +269,22 @@ static void helper_failed(libxl__egc *egc, libxl__save_helper_state *shs,
|
||||
sendsig(gc, shs, SIGKILL);
|
||||
}
|
||||
|
||||
static void helper_stop(libxl__egc *egc, libxl__ao_abortable *abrt, int rc)
|
||||
{
|
||||
libxl__save_helper_state *shs = CONTAINER_OF(abrt, *shs, abrt);
|
||||
STATE_AO_GC(shs->ao);
|
||||
|
||||
if (!libxl__ev_child_inuse(&shs->child)) {
|
||||
helper_failed(egc, shs, rc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!shs->rc)
|
||||
shs->rc = rc;
|
||||
|
||||
sendsig(gc, shs, SIGTERM);
|
||||
}
|
||||
|
||||
static void helper_stdout_readable(libxl__egc *egc, libxl__ev_fd *ev,
|
||||
int fd, short events, short revents)
|
||||
{
|
||||
@@ -332,6 +355,7 @@ static void helper_done(libxl__egc *egc, libxl__save_helper_state *shs)
|
||||
{
|
||||
STATE_AO_GC(shs->ao);
|
||||
|
||||
libxl__ao_abortable_deregister(&shs->abrt);
|
||||
libxl__ev_fd_deregister(gc, &shs->readable);
|
||||
libxl__carefd_close(shs->pipes[0]); shs->pipes[0] = 0;
|
||||
libxl__carefd_close(shs->pipes[1]); shs->pipes[1] = 0;
|
||||
|
||||