mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
libxl: Make libxl_domain_unpause async
libxl_domain_unpause needs to make QMP calls, which are asynchronous, change the API to reflect that. Do the same with libxl_domain_pause async, even if it will keep completing synchronously. Also fix some coding style issue in those functions. Signed-off-by: Anthony PERARD <anthony.perard@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
d6c7cd918a
commit
edaa631ddc
9 files changed
+76
-28
No files matched your search
+34
-3
@@ -638,7 +638,8 @@ typedef struct libxl__ctx libxl_ctx;
|
||||
/* API compatibility. */
|
||||
#ifdef LIBXL_API_VERSION
|
||||
#if LIBXL_API_VERSION != 0x040200 && LIBXL_API_VERSION != 0x040300 && \
|
||||
LIBXL_API_VERSION != 0x040400 && LIBXL_API_VERSION != 0x040500
|
||||
LIBXL_API_VERSION != 0x040400 && LIBXL_API_VERSION != 0x040500 && \
|
||||
LIBXL_API_VERSION != 0x041300
|
||||
#error Unknown LIBXL_API_VERSION
|
||||
#endif
|
||||
#endif
|
||||
@@ -1210,6 +1211,17 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, const libxl_mac *src);
|
||||
*/
|
||||
#define LIBXL_HAVE_PVCALLS 1
|
||||
|
||||
/*
|
||||
* LIBXL_HAVE_FN_USING_QMP_ASYNC
|
||||
*
|
||||
* This define indicates that some function's API has changed and have an
|
||||
* extra parameter "ao_how" which means that the function can be executed
|
||||
* asynchronously. Those functions are:
|
||||
* libxl_domain_pause()
|
||||
* libxl_domain_unpause()
|
||||
*/
|
||||
#define LIBXL_HAVE_FN_USING_QMP_ASYNC 1
|
||||
|
||||
typedef char **libxl_string_list;
|
||||
void libxl_string_list_dispose(libxl_string_list *sl);
|
||||
int libxl_string_list_length(const libxl_string_list *sl);
|
||||
@@ -1614,8 +1626,27 @@ int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
|
||||
* transactionally that the domain has the old old name; if
|
||||
* trans is not 0 we use caller's transaction and caller must do retries */
|
||||
|
||||
int libxl_domain_pause(libxl_ctx *ctx, uint32_t domid);
|
||||
int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid);
|
||||
int libxl_domain_pause(libxl_ctx *ctx, uint32_t domid,
|
||||
const libxl_asyncop_how *ao_how)
|
||||
LIBXL_EXTERNAL_CALLERS_ONLY;
|
||||
int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid,
|
||||
const libxl_asyncop_how *ao_how)
|
||||
LIBXL_EXTERNAL_CALLERS_ONLY;
|
||||
#if defined(LIBXL_API_VERSION) && LIBXL_API_VERSION < 0x041300
|
||||
static inline int libxl_domain_pause_0x041200(
|
||||
libxl_ctx *ctx, uint32_t domid)
|
||||
{
|
||||
return libxl_domain_pause(ctx, domid, NULL);
|
||||
}
|
||||
static inline int libxl_domain_unpause_0x041200(
|
||||
libxl_ctx *ctx, uint32_t domid)
|
||||
{
|
||||
return libxl_domain_unpause(ctx, domid, NULL);
|
||||
}
|
||||
#define libxl_domain_pause libxl_domain_pause_0x041200
|
||||
#define libxl_domain_unpause libxl_domain_unpause_0x041200
|
||||
#endif
|
||||
|
||||
|
||||
int libxl_domain_core_dump(libxl_ctx *ctx, uint32_t domid,
|
||||
const char *filename,
|
||||
|
||||
@@ -853,7 +853,7 @@ static void colo_unpause_svm(libxl__egc *egc,
|
||||
EGC_GC;
|
||||
|
||||
/* We have enabled secondary vm's logdirty, so we can unpause it now */
|
||||
rc = libxl_domain_unpause(CTX, domid);
|
||||
rc = libxl__domain_unpause(gc, domid);
|
||||
if (rc) {
|
||||
LOGD(ERROR, domid, "cannot unpause secondary vm");
|
||||
goto out;
|
||||
|
||||
@@ -480,7 +480,7 @@ static void colo_preresume_cb(libxl__egc *egc,
|
||||
* no disk migration.
|
||||
*/
|
||||
if (css->paused) {
|
||||
rc = libxl_domain_unpause(CTX, dss->domid);
|
||||
rc = libxl__domain_unpause(gc, dss->domid);
|
||||
if (rc) {
|
||||
LOGD(ERROR, dss->domid, "cannot unpause primary vm");
|
||||
goto out;
|
||||
|
||||
@@ -2402,7 +2402,7 @@ static void stubdom_pvqemu_cb(libxl__egc *egc,
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = libxl_domain_unpause(CTX, dm_domid);
|
||||
rc = libxl__domain_unpause(gc, dm_domid);
|
||||
if (rc) goto out;
|
||||
|
||||
sdss->xswait.ao = ao;
|
||||
|
||||
+32
-16
@@ -557,18 +557,18 @@ int libxl_domain_suspend_only(libxl_ctx *ctx, uint32_t domid,
|
||||
return AO_CREATE_FAIL(rc);
|
||||
}
|
||||
|
||||
int libxl_domain_pause(libxl_ctx *ctx, uint32_t domid)
|
||||
int libxl_domain_pause(libxl_ctx *ctx, uint32_t domid,
|
||||
const libxl_asyncop_how *ao_how)
|
||||
{
|
||||
int ret;
|
||||
GC_INIT(ctx);
|
||||
ret = xc_domain_pause(ctx->xch, domid);
|
||||
if (ret<0) {
|
||||
AO_CREATE(ctx, domid, ao_how);
|
||||
int r;
|
||||
r = xc_domain_pause(ctx->xch, domid);
|
||||
if (r < 0) {
|
||||
LOGED(ERROR, domid, "Pausing domain");
|
||||
GC_FREE;
|
||||
return ERROR_FAIL;
|
||||
return AO_CREATE_FAIL(ERROR_FAIL);
|
||||
}
|
||||
GC_FREE;
|
||||
return 0;
|
||||
libxl__ao_complete(egc, ao, 0);
|
||||
return AO_INPROGRESS;
|
||||
}
|
||||
|
||||
int libxl_domain_core_dump(libxl_ctx *ctx, uint32_t domid,
|
||||
@@ -593,10 +593,9 @@ out:
|
||||
return AO_INPROGRESS;
|
||||
}
|
||||
|
||||
int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
|
||||
int libxl__domain_unpause(libxl__gc *gc, libxl_domid domid)
|
||||
{
|
||||
GC_INIT(ctx);
|
||||
int ret, rc = 0;
|
||||
int r, rc;
|
||||
|
||||
libxl_domain_type type = libxl__domain_type(gc, domid);
|
||||
if (type == LIBXL_DOMAIN_TYPE_INVALID) {
|
||||
@@ -612,16 +611,33 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
ret = xc_domain_unpause(ctx->xch, domid);
|
||||
if (ret<0) {
|
||||
r = xc_domain_unpause(CTX->xch, domid);
|
||||
if (r < 0) {
|
||||
LOGED(ERROR, domid, "Unpausing domain");
|
||||
rc = ERROR_FAIL;
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
GC_FREE;
|
||||
rc = 0;
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid,
|
||||
const libxl_asyncop_how *ao_how)
|
||||
{
|
||||
AO_CREATE(ctx, domid, ao_how);
|
||||
int rc = 0;
|
||||
|
||||
rc = libxl__domain_unpause(gc, domid);
|
||||
if (rc) goto out;
|
||||
|
||||
libxl__ao_complete(egc, ao, rc);
|
||||
return AO_INPROGRESS;
|
||||
|
||||
out:
|
||||
return AO_CREATE_FAIL(rc);
|
||||
}
|
||||
|
||||
int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid)
|
||||
{
|
||||
libxl_ctx *ctx = libxl__gc_owner(gc);
|
||||
|
||||
@@ -4109,6 +4109,7 @@ _hidden void libxl__remus_teardown(libxl__egc *egc,
|
||||
int rc);
|
||||
_hidden void libxl__remus_restore_setup(libxl__egc *egc,
|
||||
libxl__domain_create_state *dcs);
|
||||
_hidden int libxl__domain_unpause(libxl__gc *, libxl_domid domid);
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -394,7 +394,7 @@ static void migrate_receive(int debug, int daemonize, int monitor,
|
||||
/* The guest is running after failover in COLO mode */
|
||||
exit(rc ? -ERROR_FAIL: 0);
|
||||
|
||||
rc = libxl_domain_unpause(ctx, domid);
|
||||
rc = libxl_domain_unpause(ctx, domid, NULL);
|
||||
if (rc)
|
||||
fprintf(stderr, "migration target (%s): "
|
||||
"Failed to unpause domain %s (id: %u):%d\n",
|
||||
@@ -429,7 +429,7 @@ static void migrate_receive(int debug, int daemonize, int monitor,
|
||||
}
|
||||
|
||||
if (!pause_after_migration) {
|
||||
rc = libxl_domain_unpause(ctx, domid);
|
||||
rc = libxl_domain_unpause(ctx, domid, NULL);
|
||||
if (rc) goto perhaps_destroy_notify_rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -150,7 +150,7 @@ static int save_domain(uint32_t domid, const char *filename, int checkpoint,
|
||||
}
|
||||
else if (leavepaused || checkpoint) {
|
||||
if (leavepaused)
|
||||
libxl_domain_pause(ctx, domid);
|
||||
libxl_domain_pause(ctx, domid, NULL);
|
||||
libxl_domain_resume(ctx, domid, 1, 0);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -34,12 +34,12 @@ static int fd_lock = -1;
|
||||
|
||||
static void pause_domain(uint32_t domid)
|
||||
{
|
||||
libxl_domain_pause(ctx, domid);
|
||||
libxl_domain_pause(ctx, domid, NULL);
|
||||
}
|
||||
|
||||
static void unpause_domain(uint32_t domid)
|
||||
{
|
||||
libxl_domain_unpause(ctx, domid);
|
||||
libxl_domain_unpause(ctx, domid, NULL);
|
||||
}
|
||||
|
||||
static void destroy_domain(uint32_t domid, int force)
|
||||
@@ -972,7 +972,7 @@ start:
|
||||
}
|
||||
|
||||
if (!paused)
|
||||
libxl_domain_unpause(ctx, domid);
|
||||
libxl_domain_unpause(ctx, domid, NULL);
|
||||
|
||||
ret = domid; /* caller gets success in parent */
|
||||
if (!daemonize && !monitor)
|
||||
|
||||