Files
xen/tools/libs/light/libxl_colo.h
T
Juergen Gross 41aea82de2 tools/libxl: move libxenlight to tools/libs/light
Carve out all libxenlight related sources and move them to
tools/libs/light in order to use the generic library build environment.

The closely related sources for libxl-save-helper and the libxl test
environment are being moved, too.

Signed-off-by: Juergen Gross <jgross@suse.com>
Acked-by: Wei Liu <wl@xen.org>
2020-10-01 13:26:09 +02:00

149 lines
5.2 KiB
C

/*
* Copyright (C) 2016 FUJITSU LIMITED
* Author: Wen Congyang <wency@cn.fujitsu.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; version 2.1 only. with the special
* exception on linking described in file LICENSE.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*/
#ifndef LIBXL_COLO_H
#define LIBXL_COLO_H
#include "libxl_internal.h"
/* Maximum time(5s) to wait for colo proxy checkpoit */
#define COLO_PROXY_CHECKPOINT_TIMEOUT 5000000
#define ASYNC_CALL(egc, ao, child, param, func, callback) do { \
int pid = -1; \
STATE_AO_GC(ao); \
\
pid = libxl__ev_child_fork(gc, child, callback); \
if (pid == -1) { \
LOGD(ERROR, ao->domid, "unable to fork"); \
goto out; \
} \
\
if (!pid) { \
/* child */ \
func(param); \
/* notreached */ \
abort(); \
} \
\
return; \
out: \
callback(egc, child, -1, 1); \
} while (0)
enum {
LIBXL_COLO_SETUPED,
LIBXL_COLO_SUSPENDED,
LIBXL_COLO_RESUMED,
};
struct libxl__colo_device_nic {
int devid;
const char *vif;
};
struct libxl__colo_qdisk {
bool setuped;
};
struct libxl__colo_proxy_state {
/* set by caller of colo_proxy_setup */
struct libxl__ao *ao;
int sock_fd;
int index;
/*
* Private, True means use userspace colo proxy
* False means use kernel colo proxy.
*/
bool is_userspace_proxy;
const char *checkpoint_host;
const char *checkpoint_port;
};
struct libxl__colo_save_state {
int send_fd;
int recv_fd;
char *colo_proxy_script;
/* private */
libxl__stream_read_state srs;
void (*callback)(libxl__egc *, libxl__colo_save_state *, int);
bool svm_running;
bool paused;
/* private, used by qdisk block replication */
bool qdisk_used;
bool qdisk_setuped;
/* private, used by colo-proxy */
libxl__colo_proxy_state cps;
libxl__ev_child child;
};
typedef void libxl__colo_callback(struct libxl__egc *egc,
libxl__colo_restore_state *crs, int rc);
struct libxl__colo_restore_state {
/* must set by caller of libxl__colo_(setup|teardown) */
struct libxl__ao *ao;
uint32_t domid;
int send_back_fd;
int recv_fd;
int hvm;
libxl__colo_callback *callback;
char *colo_proxy_script;
/* private, colo restore checkpoint state */
libxl__domain_create_cb *saved_cb;
void *crcs;
/* private, used by qdisk block replication */
bool qdisk_used;
bool qdisk_setuped;
const char *host;
const char *port;
/* private, used by colo-proxy */
libxl__colo_proxy_state cps;
};
int init_subkind_qdisk(struct libxl__checkpoint_devices_state *cds);
void cleanup_subkind_qdisk(struct libxl__checkpoint_devices_state *cds);
int init_subkind_colo_nic(struct libxl__checkpoint_devices_state *cds);
void cleanup_subkind_colo_nic(struct libxl__checkpoint_devices_state *cds);
extern void libxl__colo_restore_setup(struct libxl__egc *egc,
libxl__colo_restore_state *crs);
extern void libxl__colo_restore_teardown(struct libxl__egc *egc, void *dcs_void,
int ret, int retval, int errnoval);
extern void libxl__colo_save_setup(struct libxl__egc *egc,
struct libxl__colo_save_state *css);
extern void libxl__colo_save_teardown(struct libxl__egc *egc,
struct libxl__colo_save_state *css,
int rc);
extern int colo_proxy_setup(libxl__colo_proxy_state *cps);
extern void colo_proxy_teardown(libxl__colo_proxy_state *cps);
extern void colo_proxy_preresume(libxl__colo_proxy_state *cps);
extern void colo_proxy_postresume(libxl__colo_proxy_state *cps);
extern int colo_proxy_checkpoint(libxl__colo_proxy_state *cps,
unsigned int timeout_us);
#endif