[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH V8 10/39] cpr: cpr-enable option
From: |
Steve Sistare |
Subject: |
[PATCH V8 10/39] cpr: cpr-enable option |
Date: |
Wed, 15 Jun 2022 07:51:57 -0700 |
Add the '-cpr-enable <mode>' command-line option as a pre-requisite for
using cpr-save and cpr-load for the mode. Multiple -cpr-enable options
may be specified, one per mode.
Requiring -cpr-enable allows qemu to initialize objects differently, if
necessary, so that cpr-save is not blocked.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
hmp-commands.hx | 4 ++++
include/migration/cpr.h | 2 ++
migration/cpr.c | 22 ++++++++++++++++++++++
qapi/cpr.json | 4 ++++
qemu-options.hx | 10 ++++++++++
softmmu/vl.c | 8 ++++++++
6 files changed, 50 insertions(+)
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 9d9f984..d621968 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -370,6 +370,8 @@ SRST
and does not require that guest RAM be saved in the file. The caller must
not modify guest block devices between cpr-save and cpr-load.
+ cpr-save requires that qemu was started with -cpr-enable for *mode*.
+
If *mode* is 'reboot', the checkpoint remains valid after a host reboot.
The guest RAM memory-backend should be shared and non-volatile across
reboot, else it will be saved to the file. To resume from the checkpoint,
@@ -391,6 +393,8 @@ SRST
Load a virtual machine from the checkpoint file *filename* that was created
earlier by the cpr-save command, and continue the VCPUs. *mode* must match
the mode specified for cpr-save.
+
+ cpr-load requires that qemu was started with -cpr-enable for *mode*.
ERST
{
diff --git a/include/migration/cpr.h b/include/migration/cpr.h
index dfe5a1d..f236cbf 100644
--- a/include/migration/cpr.h
+++ b/include/migration/cpr.h
@@ -10,8 +10,10 @@
#include "qapi/qapi-types-cpr.h"
+void cpr_init(int modes);
void cpr_set_mode(CprMode mode);
CprMode cpr_get_mode(void);
+bool cpr_enabled(CprMode mode);
#define CPR_MODE_ALL CPR_MODE__MAX
diff --git a/migration/cpr.c b/migration/cpr.c
index c1da784..76b9225 100644
--- a/migration/cpr.c
+++ b/migration/cpr.c
@@ -29,6 +29,18 @@ void cpr_set_mode(CprMode mode)
cpr_mode = mode;
}
+static int cpr_enabled_modes;
+
+void cpr_init(int modes)
+{
+ cpr_enabled_modes = modes;
+}
+
+bool cpr_enabled(CprMode mode)
+{
+ return !!(cpr_enabled_modes & BIT(mode));
+}
+
static GSList *cpr_blockers[CPR_MODE__MAX];
/*
@@ -110,6 +122,11 @@ void qmp_cpr_save(const char *filename, CprMode mode,
Error **errp)
QEMUFile *f;
int saved_vm_running = runstate_is_running();
+ if (!(cpr_enabled_modes & BIT(mode))) {
+ error_setg(errp, "cpr mode is not enabled. Use -cpr-enable.");
+ return;
+ }
+
if (cpr_is_blocked(errp, mode)) {
return;
}
@@ -154,6 +171,11 @@ void qmp_cpr_load(const char *filename, CprMode mode,
Error **errp)
int ret;
RunState state;
+ if (!(cpr_enabled_modes & BIT(mode))) {
+ error_setg(errp, "cpr mode is not enabled. Use -cpr-enable.");
+ return;
+ }
+
if (runstate_is_running()) {
error_setg(errp, "cpr-load called for a running VM");
return;
diff --git a/qapi/cpr.json b/qapi/cpr.json
index bdaabcb..11c6f88 100644
--- a/qapi/cpr.json
+++ b/qapi/cpr.json
@@ -30,6 +30,8 @@
# and does not require that guest RAM be saved in the file. The caller must
# not modify guest block devices between cpr-save and cpr-load.
#
+# cpr-save requires that qemu was started with -cpr-enable for @mode.
+#
# If @mode is 'reboot', the checkpoint remains valid after a host reboot.
# The guest RAM memory-backend should be shared and non-volatile across
# reboot, else it will be saved to the file. To resume from the checkpoint,
@@ -52,6 +54,8 @@
# earlier by the cpr-save command, and continue the VCPUs. @mode must match
# the mode specified for cpr-save.
#
+# cpr-load requires that qemu was started with -cpr-enable for @mode.
+#
# @filename: name of checkpoint file
# @mode: @CprMode mode
#
diff --git a/qemu-options.hx b/qemu-options.hx
index 377d22f..6e51c33 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -4483,6 +4483,16 @@ SRST
an unmigratable state.
ERST
+DEF("cpr-enable", HAS_ARG, QEMU_OPTION_cpr_enable, \
+ "-cpr-enable reboot enable the cpr mode\n",
+ QEMU_ARCH_ALL)
+SRST
+``-cpr-enable reboot``
+ Enable the specified cpr mode. May be supplied multiple times, once
+ per mode. This is a pre-requisite for calling the cpr-save and cpr-load
+ commands.
+ERST
+
DEF("nodefaults", 0, QEMU_OPTION_nodefaults, \
"-nodefaults don't create default devices\n", QEMU_ARCH_ALL)
SRST
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 54e920a..ce779cf 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -78,6 +78,7 @@
#include "hw/i386/pc.h"
#include "migration/misc.h"
#include "migration/snapshot.h"
+#include "migration/cpr.h"
#include "sysemu/tpm.h"
#include "sysemu/dma.h"
#include "hw/audio/soundhw.h"
@@ -2600,6 +2601,7 @@ void qemu_init(int argc, char **argv, char **envp)
MachineClass *machine_class;
bool userconfig = true;
FILE *vmstate_dump_file = NULL;
+ int cpr_modes = 0;
qemu_add_opts(&qemu_drive_opts);
qemu_add_drive_opts(&qemu_legacy_drive_opts);
@@ -3313,6 +3315,10 @@ void qemu_init(int argc, char **argv, char **envp)
case QEMU_OPTION_only_migratable:
only_migratable = 1;
break;
+ case QEMU_OPTION_cpr_enable:
+ cpr_modes |= BIT(qapi_enum_parse(&CprMode_lookup, optarg, -1,
+ &error_fatal));
+ break;
case QEMU_OPTION_nodefaults:
has_defaults = 0;
break;
@@ -3464,6 +3470,8 @@ void qemu_init(int argc, char **argv, char **envp)
qemu_validate_options(machine_opts_dict);
qemu_process_sugar_options();
+ cpr_init(cpr_modes);
+
/*
* These options affect everything else and should be processed
* before daemonizing.
--
1.8.3.1
- [PATCH V8 00/39] Live Update, Steve Sistare, 2022/06/15
- [PATCH V8 03/39] migration: simplify savevm, Steve Sistare, 2022/06/15
- [PATCH V8 06/39] cpr: reboot mode, Steve Sistare, 2022/06/15
- [PATCH V8 02/39] migration: qemu file wrappers, Steve Sistare, 2022/06/15
- [PATCH V8 08/39] cpr: blockers, Steve Sistare, 2022/06/15
- [PATCH V8 10/39] cpr: cpr-enable option,
Steve Sistare <=
- [PATCH V8 12/39] memory: flat section iterator, Steve Sistare, 2022/06/15
- [PATCH V8 09/39] cpr: register blockers, Steve Sistare, 2022/06/15
- [PATCH V8 11/39] cpr: save ram blocks, Steve Sistare, 2022/06/15
- [PATCH V8 13/39] oslib: qemu_clear_cloexec, Steve Sistare, 2022/06/15
- [PATCH V8 25/39] cpr: notifiers, Steve Sistare, 2022/06/15
- [PATCH V8 20/39] cpr: restart mode, Steve Sistare, 2022/06/15
- [PATCH V8 29/39] vfio-pci: cpr part 3 (intx), Steve Sistare, 2022/06/15