[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 06/17] migration: introduce icount field for sna
From: |
Pavel Dovgalyuk |
Subject: |
[Qemu-devel] [RFC PATCH 06/17] migration: introduce icount field for snapshots |
Date: |
Wed, 25 Apr 2018 15:46:08 +0300 |
User-agent: |
StGit/0.17.1-dirty |
Saving icount as a parameters of the snapshot allows navigation between
them in the execution replay scenario.
This information can be used for finding a specific snapshot for rewinding
the recorded execution to the specific moment of the time.
E.g., 'reverse step' action needs to load the nearest snapshot which is
prior to the current moment of time .
Signed-off-by: Pavel Dovgalyuk <address@hidden>
---
block/qapi.c | 11 +++++++----
blockdev.c | 3 +++
include/block/snapshot.h | 1 +
migration/savevm.c | 1 +
qapi/block-core.json | 5 ++++-
qapi/block.json | 3 ++-
6 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/block/qapi.c b/block/qapi.c
index 04c6fc6..b51a23a 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -210,6 +210,7 @@ int bdrv_query_snapshot_info_list(BlockDriverState *bs,
info->date_nsec = sn_tab[i].date_nsec;
info->vm_clock_sec = sn_tab[i].vm_clock_nsec / 1000000000;
info->vm_clock_nsec = sn_tab[i].vm_clock_nsec % 1000000000;
+ info->icount = sn_tab[i].icount;
info_list = g_new0(SnapshotInfoList, 1);
info_list->value = info;
@@ -654,8 +655,8 @@ void bdrv_snapshot_dump(fprintf_function func_fprintf, void
*f,
if (!sn) {
func_fprintf(f,
- "%-10s%-20s%7s%20s%15s",
- "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
+ "%-10s%-18s%7s%20s%13s%11s",
+ "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK", "ICOUNT");
} else {
ti = sn->date_sec;
localtime_r(&ti, &tm);
@@ -669,12 +670,13 @@ void bdrv_snapshot_dump(fprintf_function func_fprintf,
void *f,
(int)(secs % 60),
(int)((sn->vm_clock_nsec / 1000000) % 1000));
func_fprintf(f,
- "%-10s%-20s%7s%20s%15s",
+ "%-10s%-18s%7s%20s%13s%11"PRId64,
sn->id_str, sn->name,
get_human_readable_size(buf1, sizeof(buf1),
sn->vm_state_size),
date_buf,
- clock_buf);
+ clock_buf,
+ sn->icount);
}
}
@@ -842,6 +844,7 @@ void bdrv_image_info_dump(fprintf_function func_fprintf,
void *f,
.date_nsec = elem->value->date_nsec,
.vm_clock_nsec = elem->value->vm_clock_sec * 1000000000ULL +
elem->value->vm_clock_nsec,
+ .icount = elem->value->icount,
};
pstrcpy(sn.id_str, sizeof(sn.id_str), elem->value->id);
diff --git a/blockdev.c b/blockdev.c
index c31bf3d..6771b79 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -56,6 +56,7 @@
#include "block/trace.h"
#include "sysemu/arch_init.h"
#include "sysemu/qtest.h"
+#include "sysemu/replay.h"
#include "qemu/cutils.h"
#include "qemu/help_option.h"
#include "qemu/throttle-options.h"
@@ -1348,6 +1349,7 @@ SnapshotInfo
*qmp_blockdev_snapshot_delete_internal_sync(const char *device,
info->vm_state_size = sn.vm_state_size;
info->vm_clock_nsec = sn.vm_clock_nsec % 1000000000;
info->vm_clock_sec = sn.vm_clock_nsec / 1000000000;
+ info->icount = sn.icount;
return info;
@@ -1556,6 +1558,7 @@ static void internal_snapshot_prepare(BlkActionState
*common,
sn->date_sec = tv.tv_sec;
sn->date_nsec = tv.tv_usec * 1000;
sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+ sn->icount = replay_get_current_step();
ret1 = bdrv_snapshot_create(bs, sn);
if (ret1 < 0) {
diff --git a/include/block/snapshot.h b/include/block/snapshot.h
index f73d109..c9c8975 100644
--- a/include/block/snapshot.h
+++ b/include/block/snapshot.h
@@ -42,6 +42,7 @@ typedef struct QEMUSnapshotInfo {
uint32_t date_sec; /* UTC date of the snapshot */
uint32_t date_nsec;
uint64_t vm_clock_nsec; /* VM clock relative to boot */
+ uint64_t icount; /* record/replay step */
} QEMUSnapshotInfo;
int bdrv_snapshot_find(BlockDriverState *bs, QEMUSnapshotInfo *sn_info,
diff --git a/migration/savevm.c b/migration/savevm.c
index e2be02a..6ca67fb 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2270,6 +2270,7 @@ int save_snapshot(const char *name, Error **errp)
sn->date_sec = tv.tv_sec;
sn->date_nsec = tv.tv_usec * 1000;
sn->vm_clock_nsec = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+ sn->icount = replay_get_current_step();
if (name) {
ret = bdrv_snapshot_find(bs, old_sn, name);
diff --git a/qapi/block-core.json b/qapi/block-core.json
index c50517b..675b24e 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -25,13 +25,16 @@
#
# @vm-clock-nsec: fractional part in nano seconds to be used with vm-clock-sec
#
+# @icount: current instruction count for execution record/replay
+#
# Since: 1.3
#
##
{ 'struct': 'SnapshotInfo',
'data': { 'id': 'str', 'name': 'str', 'vm-state-size': 'int',
'date-sec': 'int', 'date-nsec': 'int',
- 'vm-clock-sec': 'int', 'vm-clock-nsec': 'int' } }
+ 'vm-clock-sec': 'int', 'vm-clock-nsec': 'int',
+ 'icount': 'int' } }
##
# @ImageInfoSpecificQCow2EncryptionBase:
diff --git a/qapi/block.json b/qapi/block.json
index c694524..2f364f7 100644
--- a/qapi/block.json
+++ b/qapi/block.json
@@ -148,7 +148,8 @@
# "date-sec": 1000012,
# "date-nsec": 10,
# "vm-clock-sec": 100,
-# "vm-clock-nsec": 20
+# "vm-clock-nsec": 20,
+# "icount": 220414
# }
# }
#
- [Qemu-devel] [RFC PATCH 00/17] reverse debugging, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 01/17] block: implement bdrv_snapshot_goto for blkreplay, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 02/17] replay: disable default snapshot for record/replay, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 03/17] replay: update docs for record/replay with block devices, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 04/17] replay: don't drain/flush bdrv queue while RR is working, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 06/17] migration: introduce icount field for snapshots,
Pavel Dovgalyuk <=
- [Qemu-devel] [RFC PATCH 05/17] replay: finish record/replay before closing the disks, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 07/17] qcow2: introduce icount field for snapshots, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 08/17] replay: introduce info hmp/qmp command, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 09/17] replay: introduce breakpoint at the specified step, Pavel Dovgalyuk, 2018/04/25
- [Qemu-devel] [RFC PATCH 10/17] replay: implement replay_seek command to proceed to the desired step, Pavel Dovgalyuk, 2018/04/25