[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 4/8] replay: save/load initial state
From: |
Pavel Dovgalyuk |
Subject: |
[Qemu-devel] [PATCH v3 4/8] replay: save/load initial state |
Date: |
Tue, 20 Sep 2016 15:31:49 +0300 |
User-agent: |
StGit/0.16 |
This patch implements initial vmstate creation or loading at the start
of record/replay. It is needed for rewinding the execution in the replay mode.
v3 changes:
- added rrsnapshot option
Signed-off-by: Pavel Dovgalyuk <address@hidden>
---
docs/replay.txt | 12 ++++++++++++
include/sysemu/replay.h | 6 ++++++
qemu-options.hx | 8 +++++---
replay/Makefile.objs | 1 +
replay/replay-internal.h | 3 +++
replay/replay-snapshot.c | 31 +++++++++++++++++++++++++++++++
replay/replay.c | 7 +++++++
vl.c | 8 +++++++-
8 files changed, 72 insertions(+), 4 deletions(-)
create mode 100644 replay/replay-snapshot.c
diff --git a/docs/replay.txt b/docs/replay.txt
index 5be8f25..ce3c6b8 100644
--- a/docs/replay.txt
+++ b/docs/replay.txt
@@ -204,6 +204,18 @@ Overlay file may be specified as follows:
-drive driver=blkreplay,if=none,image=img-direct,
overlay=overlay.qcow2,id=img-blkreplay
+Snapshotting
+------------
+
+New VM snapshots may be created in replay mode. They can be used later
+to recover the desired VM state. All VM states created in replay mode
+are associated with the moment of time in the replay scenario.
+After recovering the VM state replay will start from that position.
+
+Default starting snapshot name may be overridden with icount field
+rrsnapshot as follows:
+ -icount shift=7,rr=record,rrfile=replay.bin,rrsnapshot=non_default_snapshot
+
Network devices
---------------
diff --git a/include/sysemu/replay.h b/include/sysemu/replay.h
index a408633..aa378ce 100644
--- a/include/sysemu/replay.h
+++ b/include/sysemu/replay.h
@@ -145,4 +145,10 @@ void replay_unregister_net(ReplayNetState *rns);
void replay_net_packet_event(ReplayNetState *rns, unsigned flags,
const struct iovec *iov, int iovcnt);
+/* VM state operations */
+
+/*! Called at the start of execution.
+ Loads or saves initial vmstate depending on execution mode. */
+void replay_vmstate_init(void);
+
#endif
diff --git a/qemu-options.hx b/qemu-options.hx
index 0b621bb..1483ad8 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -3367,12 +3367,12 @@ re-inject them.
ETEXI
DEF("icount", HAS_ARG, QEMU_OPTION_icount, \
- "-icount
[shift=N|auto][,align=on|off][,sleep=on|off,rr=record|replay,rrfile=<filename>]\n"
\
+ "-icount
[shift=N|auto][,align=on|off][,sleep=on|off,rr=record|replay,rrfile=<filename>,rrsnapshot=<snapshot>]\n"
\
" enable virtual instruction counter with 2^N clock ticks
per\n" \
" instruction, enable aligning the host and virtual
clocks\n" \
" or disable real time cpu sleeping\n", QEMU_ARCH_ALL)
STEXI
address@hidden -icount address@hidden|auto][,rr=record|replay,address@hidden
address@hidden -icount
address@hidden|auto][,rr=record|replay,address@hidden,address@hidden
@findex -icount
Enable virtual instruction counter. The virtual cpu will execute one
instruction every address@hidden ns of virtual time. If @code{auto} is
specified
@@ -3404,7 +3404,9 @@ when the shift value is high (how high depends on the
host machine).
When @option{rr} option is specified deterministic record/replay is enabled.
Replay log is written into @var{filename} file in record mode and
-read from this file in replay mode.
+read from this file in replay mode. At the start of record new snapshot
+is created. It get 'replay_init' name or the one specified with @{snapshot}
+option. In replay mode this option is used to load the initial VM state.
ETEXI
DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \
diff --git a/replay/Makefile.objs b/replay/Makefile.objs
index f55a6b5..4600d74 100644
--- a/replay/Makefile.objs
+++ b/replay/Makefile.objs
@@ -5,3 +5,4 @@ common-obj-y += replay-time.o
common-obj-y += replay-input.o
common-obj-y += replay-char.o
common-obj-y += replay-net.o
+common-obj-y += replay-snapshot.o
diff --git a/replay/replay-internal.h b/replay/replay-internal.h
index d28cfb7..6f2f6e2 100644
--- a/replay/replay-internal.h
+++ b/replay/replay-internal.h
@@ -71,6 +71,9 @@ extern unsigned int replay_data_kind;
/* File for replay writing */
extern FILE *replay_file;
+/* Default name of the initial VM snapshot */
+extern char *replay_snapshot;
+
void replay_put_byte(uint8_t byte);
void replay_put_event(uint8_t event);
void replay_put_word(uint16_t word);
diff --git a/replay/replay-snapshot.c b/replay/replay-snapshot.c
new file mode 100644
index 0000000..6079b29
--- /dev/null
+++ b/replay/replay-snapshot.c
@@ -0,0 +1,31 @@
+/*
+ * replay-snapshot.c
+ *
+ * Copyright (c) 2010-2016 Institute for System Programming
+ * of the Russian Academy of Sciences.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "qapi/error.h"
+#include "qemu-common.h"
+#include "sysemu/replay.h"
+#include "replay-internal.h"
+#include "sysemu/sysemu.h"
+#include "monitor/monitor.h"
+#include "qapi/qmp/qstring.h"
+
+void replay_vmstate_init(void)
+{
+ if (replay_mode == REPLAY_MODE_RECORD) {
+ QDict *opts = qdict_new();
+ qdict_put(opts, "name", qstring_from_str(replay_snapshot));
+ hmp_savevm(cur_mon, opts);
+ QDECREF(opts);
+ } else if (replay_mode == REPLAY_MODE_PLAY) {
+ load_vmstate(replay_snapshot);
+ }
+}
diff --git a/replay/replay.c b/replay/replay.c
index e040f6f..ef1e5e9 100644
--- a/replay/replay.c
+++ b/replay/replay.c
@@ -26,6 +26,7 @@
#define HEADER_SIZE (sizeof(uint32_t) + sizeof(uint64_t))
ReplayMode replay_mode = REPLAY_MODE_NONE;
+char *replay_snapshot;
/* Name of replay file */
static char *replay_filename;
@@ -291,6 +292,8 @@ void replay_configure(QemuOpts *opts)
exit(1);
}
+ replay_snapshot = g_strdup(qemu_opt_get(opts, "rrsnapshot"));
+
replay_enable(fname, mode);
out:
@@ -343,6 +346,10 @@ void replay_finish(void)
g_free(replay_filename);
replay_filename = NULL;
}
+ if (replay_snapshot) {
+ g_free(replay_snapshot);
+ replay_snapshot = NULL;
+ }
replay_finish_events();
replay_mutex_destroy();
diff --git a/vl.c b/vl.c
index 9adca19..c0d43f0 100644
--- a/vl.c
+++ b/vl.c
@@ -460,6 +460,10 @@ static QemuOptsList qemu_icount_opts = {
}, {
.name = "rrfile",
.type = QEMU_OPT_STRING,
+ }, {
+ .name = "rrsnapshot",
+ .type = QEMU_OPT_STRING,
+ .def_value_str = "replay_init"
},
{ /* end of list */ }
},
@@ -4590,7 +4594,9 @@ int main(int argc, char **argv, char **envp)
replay_checkpoint(CHECKPOINT_RESET);
qemu_system_reset(VMRESET_SILENT);
register_global_state();
- if (loadvm) {
+ if (replay_mode != REPLAY_MODE_NONE) {
+ replay_vmstate_init();
+ } else if (loadvm) {
if (load_vmstate(loadvm) < 0) {
autostart = 0;
}
- [Qemu-devel] [PATCH v3 0/8] replay additions, Pavel Dovgalyuk, 2016/09/20
- [Qemu-devel] [PATCH v3 3/8] block: don't make snapshots for filters, Pavel Dovgalyuk, 2016/09/20
- [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state,
Pavel Dovgalyuk <=
- Re: [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state, Paolo Bonzini, 2016/09/20
- Re: [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state, Pavel Dovgalyuk, 2016/09/20
- Re: [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state, Paolo Bonzini, 2016/09/20
- Re: [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state, Pavel Dovgalyuk, 2016/09/20
- Re: [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state, Paolo Bonzini, 2016/09/20
- Re: [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state, Pavel Dovgalyuk, 2016/09/20
- Re: [Qemu-devel] [PATCH v3 4/8] replay: save/load initial state, Paolo Bonzini, 2016/09/20
[Qemu-devel] [PATCH v3 5/8] replay: move internal data to the structure, Pavel Dovgalyuk, 2016/09/20
[Qemu-devel] [PATCH v3 6/8] replay: vmstate for replay module, Pavel Dovgalyuk, 2016/09/20
[Qemu-devel] [PATCH v3 7/8] replay: allow replay stopping and restarting, Pavel Dovgalyuk, 2016/09/20