mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-17 10:38:52 +00:00
Introduce "xen-load-devices-state"
Introduce a "xen-load-devices-state" QAPI command that can be used to load the state of all devices, but not the RAM or the block devices of the VM. We only have hmp commands savevm/loadvm, and qmp commands xen-save-devices-state. We use this new command for COLO: 1. suspend both primary vm and secondary vm 2. sync the state 3. resume both primary vm and secondary vm In such case, we need to update all devices' state in any time. Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> Reviewed-by: Anthony PERARD <anthony.perard@citrix.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
This commit is contained in:
parent
d6b6aec409
commit
88c16567d2
@ -31,6 +31,7 @@
|
||||
#include "hw/boards.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/qdev.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "net/net.h"
|
||||
#include "monitor/monitor.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
@ -1754,6 +1755,12 @@ qemu_loadvm_section_start_full(QEMUFile *f, MigrationIncomingState *mis)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Validate if it is a device's state */
|
||||
if (xen_enabled() && se->is_ram) {
|
||||
error_report("loadvm: %s RAM loading not allowed on Xen", idstr);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Add entry */
|
||||
le = g_malloc0(sizeof(*le));
|
||||
|
||||
@ -2064,6 +2071,36 @@ void qmp_xen_save_devices_state(const char *filename, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
void qmp_xen_load_devices_state(const char *filename, Error **errp)
|
||||
{
|
||||
QEMUFile *f;
|
||||
QIOChannelFile *ioc;
|
||||
int ret;
|
||||
|
||||
/* Guest must be paused before loading the device state; the RAM state
|
||||
* will already have been loaded by xc
|
||||
*/
|
||||
if (runstate_is_running()) {
|
||||
error_setg(errp, "Cannot update device state while vm is running");
|
||||
return;
|
||||
}
|
||||
vm_stop(RUN_STATE_RESTORE_VM);
|
||||
|
||||
ioc = qio_channel_file_new_path(filename, O_RDONLY | O_BINARY, 0, errp);
|
||||
if (!ioc) {
|
||||
return;
|
||||
}
|
||||
f = qemu_fopen_channel_input(QIO_CHANNEL(ioc));
|
||||
|
||||
migration_incoming_state_new(f);
|
||||
ret = qemu_loadvm_state(f);
|
||||
qemu_fclose(f);
|
||||
if (ret < 0) {
|
||||
error_setg(errp, QERR_IO_ERROR);
|
||||
}
|
||||
migration_incoming_state_destroy();
|
||||
}
|
||||
|
||||
int load_vmstate(const char *name)
|
||||
{
|
||||
BlockDriverState *bs, *bs_vm_state;
|
||||
|
@ -4200,6 +4200,20 @@
|
||||
{ 'enum': 'ReplayMode',
|
||||
'data': [ 'none', 'record', 'play' ] }
|
||||
|
||||
##
|
||||
# @xen-load-devices-state:
|
||||
#
|
||||
# Load the state of all devices from file. The RAM and the block devices
|
||||
# of the VM are not loaded by this command.
|
||||
#
|
||||
# @filename: the file to load the state of the devices from as binary
|
||||
# data. See xen-save-devices-state.txt for a description of the binary
|
||||
# format.
|
||||
#
|
||||
# Since: 2.7
|
||||
##
|
||||
{ 'command': 'xen-load-devices-state', 'data': {'filename': 'str'} }
|
||||
|
||||
##
|
||||
# @GICCapability:
|
||||
#
|
||||
|
@ -584,6 +584,33 @@ Example:
|
||||
"arguments": { "filename": "/tmp/save" } }
|
||||
<- { "return": {} }
|
||||
|
||||
EQMP
|
||||
|
||||
{
|
||||
.name = "xen-load-devices-state",
|
||||
.args_type = "filename:F",
|
||||
.mhandler.cmd_new = qmp_marshal_xen_load_devices_state,
|
||||
},
|
||||
|
||||
SQMP
|
||||
xen-load-devices-state
|
||||
----------------------
|
||||
|
||||
Load the state of all devices from file. The RAM and the block devices
|
||||
of the VM are not loaded by this command.
|
||||
|
||||
Arguments:
|
||||
|
||||
- "filename": the file to load the state of the devices from as binary
|
||||
data. See xen-save-devices-state.txt for a description of the binary
|
||||
format.
|
||||
|
||||
Example:
|
||||
|
||||
-> { "execute": "xen-load-devices-state",
|
||||
"arguments": { "filename": "/tmp/resume" } }
|
||||
<- { "return": {} }
|
||||
|
||||
EQMP
|
||||
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user