mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
remus: command line switch to enable/disable checkpoint compression
Add a command line switch to remus script that allows the user to enable or disable checkpoint compression in the libxc code. Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca> Acked-by: Brendan Cully <brendan@cs.ubc.ca> Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
f6b3d39f5d
commit
d18429eabf
5 files changed
+25
-8
No files matched your search
@@ -104,13 +104,14 @@ static PyObject* pycheckpoint_start(PyObject* obj, PyObject* args) {
|
||||
PyObject* postcopy_cb = NULL;
|
||||
PyObject* checkpoint_cb = NULL;
|
||||
unsigned int interval = 0;
|
||||
unsigned int flags = 0;
|
||||
|
||||
int fd;
|
||||
struct save_callbacks callbacks;
|
||||
int rc;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O|OOOI", &iofile, &suspend_cb, &postcopy_cb,
|
||||
&checkpoint_cb, &interval))
|
||||
if (!PyArg_ParseTuple(args, "O|OOOII", &iofile, &suspend_cb, &postcopy_cb,
|
||||
&checkpoint_cb, &interval, &flags))
|
||||
return NULL;
|
||||
|
||||
self->interval = interval;
|
||||
@@ -160,7 +161,7 @@ static PyObject* pycheckpoint_start(PyObject* obj, PyObject* args) {
|
||||
callbacks.data = self;
|
||||
|
||||
self->threadstate = PyEval_SaveThread();
|
||||
rc = checkpoint_start(&self->cps, fd, &callbacks);
|
||||
rc = checkpoint_start(&self->cps, fd, &callbacks, flags);
|
||||
PyEval_RestoreThread(self->threadstate);
|
||||
|
||||
if (rc < 0) {
|
||||
|
||||
@@ -40,13 +40,15 @@ typedef struct {
|
||||
timer_t timer;
|
||||
} checkpoint_state;
|
||||
|
||||
#define CHECKPOINT_FLAGS_COMPRESSION 1
|
||||
char* checkpoint_error(checkpoint_state* s);
|
||||
|
||||
void checkpoint_init(checkpoint_state* s);
|
||||
int checkpoint_open(checkpoint_state* s, unsigned int domid);
|
||||
void checkpoint_close(checkpoint_state* s);
|
||||
int checkpoint_start(checkpoint_state* s, int fd,
|
||||
struct save_callbacks* callbacks);
|
||||
struct save_callbacks* callbacks,
|
||||
unsigned int remus_flags);
|
||||
int checkpoint_suspend(checkpoint_state* s);
|
||||
int checkpoint_resume(checkpoint_state* s);
|
||||
int checkpoint_postflush(checkpoint_state* s);
|
||||
|
||||
@@ -170,7 +170,8 @@ static int noop_switch_logdirty(int domid, unsigned enable, void *data)
|
||||
}
|
||||
|
||||
int checkpoint_start(checkpoint_state* s, int fd,
|
||||
struct save_callbacks* callbacks)
|
||||
struct save_callbacks* callbacks,
|
||||
unsigned int remus_flags)
|
||||
{
|
||||
int hvm, rc;
|
||||
int flags = XCFLAGS_LIVE;
|
||||
@@ -188,6 +189,8 @@ int checkpoint_start(checkpoint_state* s, int fd,
|
||||
if (switch_qemu_logdirty(s, 1))
|
||||
return -1;
|
||||
}
|
||||
if (remus_flags & CHECKPOINT_FLAGS_COMPRESSION)
|
||||
flags |= XCFLAGS_CHECKPOINT_COMPRESS;
|
||||
|
||||
callbacks->switch_qemu_logdirty = noop_switch_logdirty;
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ class Keepalive(object):
|
||||
|
||||
class Saver(object):
|
||||
def __init__(self, domid, fd, suspendcb=None, resumecb=None,
|
||||
checkpointcb=None, interval=0):
|
||||
checkpointcb=None, interval=0, flags=0):
|
||||
"""Create a Saver object for taking guest checkpoints.
|
||||
domid: name, number or UUID of a running domain
|
||||
fd: a stream to which checkpoint data will be written.
|
||||
@@ -141,12 +141,14 @@ class Saver(object):
|
||||
resumecb: callback invoked before guest resumes
|
||||
checkpointcb: callback invoked when a checkpoint is complete. Return
|
||||
True to take another checkpoint, or False to stop.
|
||||
flags: Remus flags to be passed to xc_domain_save
|
||||
"""
|
||||
self.fd = fd
|
||||
self.suspendcb = suspendcb
|
||||
self.resumecb = resumecb
|
||||
self.checkpointcb = checkpointcb
|
||||
self.interval = interval
|
||||
self.flags = flags
|
||||
|
||||
self.vm = vm.VM(domid)
|
||||
|
||||
@@ -164,7 +166,8 @@ class Saver(object):
|
||||
try:
|
||||
self.checkpointer.open(self.vm.domid)
|
||||
self.checkpointer.start(self.fd, self.suspendcb, self.resumecb,
|
||||
self.checkpointcb, self.interval)
|
||||
self.checkpointcb, self.interval,
|
||||
self.flags)
|
||||
except xen.lowlevel.checkpoint.error, e:
|
||||
raise CheckpointError(e)
|
||||
finally:
|
||||
|
||||