|
|
05bba0 |
From 1ebfe2d9807a9ba4bfbec3104c6c8df50c89414d Mon Sep 17 00:00:00 2001
|
|
|
05bba0 |
From: Kevin Wolf <kwolf@redhat.com>
|
|
|
05bba0 |
Date: Fri, 29 May 2015 17:05:12 +0200
|
|
|
05bba0 |
Subject: [PATCH 2/8] qcow2: Discard VM state in active L1 after creating
|
|
|
05bba0 |
snapshot
|
|
|
05bba0 |
|
|
|
05bba0 |
Message-id: <1432919112-18076-3-git-send-email-kwolf@redhat.com>
|
|
|
05bba0 |
Patchwork-id: 65149
|
|
|
05bba0 |
O-Subject: [RHEL-7.2 qemu-kvm PATCH 2/2] qcow2: Discard VM state in active L1 after creating snapshot
|
|
|
05bba0 |
Bugzilla: 1208808
|
|
|
05bba0 |
RH-Acked-by: Fam Zheng <famz@redhat.com>
|
|
|
05bba0 |
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
05bba0 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
05bba0 |
|
|
|
05bba0 |
During savevm, the VM state is written to the active L1 of the image and
|
|
|
05bba0 |
then a snapshot is taken. After that, the VM state isn't needed any more
|
|
|
05bba0 |
in the active L1 and should be discarded. This is implemented by this
|
|
|
05bba0 |
patch.
|
|
|
05bba0 |
|
|
|
05bba0 |
The impact of not discarding the VM state is that a snapshot can never
|
|
|
05bba0 |
become smaller than any previous snapshot (because it would be padded
|
|
|
05bba0 |
with old VM state), and more importantly that future savevm operations
|
|
|
05bba0 |
cause unnecessary COWs (with associated flushes), which makes subsequent
|
|
|
05bba0 |
snapshots much slower.
|
|
|
05bba0 |
|
|
|
05bba0 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
05bba0 |
Reviewed-by: Max Reitz <mreitz@redhat.com>
|
|
|
05bba0 |
(cherry picked from commit 1ebf561c11302f4fbe4afdd82758fe053cf1d5fc)
|
|
|
05bba0 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
05bba0 |
|
|
|
05bba0 |
Conflicts:
|
|
|
05bba0 |
block/qcow2.h
|
|
|
05bba0 |
|
|
|
05bba0 |
Context-only conflict in qcow2.h.
|
|
|
05bba0 |
|
|
|
05bba0 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
05bba0 |
---
|
|
|
05bba0 |
block/qcow2-snapshot.c | 7 +++++++
|
|
|
05bba0 |
block/qcow2.c | 5 -----
|
|
|
05bba0 |
block/qcow2.h | 5 +++++
|
|
|
05bba0 |
3 files changed, 12 insertions(+), 5 deletions(-)
|
|
|
05bba0 |
|
|
|
05bba0 |
diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
|
|
|
05bba0 |
index 84481be..6081482 100644
|
|
|
05bba0 |
--- a/block/qcow2-snapshot.c
|
|
|
05bba0 |
+++ b/block/qcow2-snapshot.c
|
|
|
05bba0 |
@@ -407,6 +407,13 @@ int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
|
|
|
05bba0 |
|
|
|
05bba0 |
g_free(old_snapshot_list);
|
|
|
05bba0 |
|
|
|
05bba0 |
+ /* The VM state isn't needed any more in the active L1 table; in fact, it
|
|
|
05bba0 |
+ * hurts by causing expensive COW for the next snapshot. */
|
|
|
05bba0 |
+ qcow2_discard_clusters(bs, qcow2_vm_state_offset(s),
|
|
|
05bba0 |
+ align_offset(sn->vm_state_size, s->cluster_size)
|
|
|
05bba0 |
+ >> BDRV_SECTOR_BITS,
|
|
|
05bba0 |
+ QCOW2_DISCARD_NEVER);
|
|
|
05bba0 |
+
|
|
|
05bba0 |
#ifdef DEBUG_ALLOC
|
|
|
05bba0 |
{
|
|
|
05bba0 |
BdrvCheckResult result = {0};
|
|
|
05bba0 |
diff --git a/block/qcow2.c b/block/qcow2.c
|
|
|
05bba0 |
index babcb4b..6026f8a 100644
|
|
|
05bba0 |
--- a/block/qcow2.c
|
|
|
05bba0 |
+++ b/block/qcow2.c
|
|
|
05bba0 |
@@ -2036,11 +2036,6 @@ static coroutine_fn int qcow2_co_flush_to_os(BlockDriverState *bs)
|
|
|
05bba0 |
return 0;
|
|
|
05bba0 |
}
|
|
|
05bba0 |
|
|
|
05bba0 |
-static int64_t qcow2_vm_state_offset(BDRVQcowState *s)
|
|
|
05bba0 |
-{
|
|
|
05bba0 |
- return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits);
|
|
|
05bba0 |
-}
|
|
|
05bba0 |
-
|
|
|
05bba0 |
static int qcow2_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
|
|
|
05bba0 |
{
|
|
|
05bba0 |
BDRVQcowState *s = bs->opaque;
|
|
|
05bba0 |
diff --git a/block/qcow2.h b/block/qcow2.h
|
|
|
05bba0 |
index 9ad8aad..e958ab4 100644
|
|
|
05bba0 |
--- a/block/qcow2.h
|
|
|
05bba0 |
+++ b/block/qcow2.h
|
|
|
05bba0 |
@@ -417,6 +417,11 @@ static inline int64_t align_offset(int64_t offset, int n)
|
|
|
05bba0 |
return offset;
|
|
|
05bba0 |
}
|
|
|
05bba0 |
|
|
|
05bba0 |
+static inline int64_t qcow2_vm_state_offset(BDRVQcowState *s)
|
|
|
05bba0 |
+{
|
|
|
05bba0 |
+ return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits);
|
|
|
05bba0 |
+}
|
|
|
05bba0 |
+
|
|
|
05bba0 |
static inline uint64_t qcow2_max_refcount_clusters(BDRVQcowState *s)
|
|
|
05bba0 |
{
|
|
|
05bba0 |
return QCOW_MAX_REFTABLE_SIZE >> s->cluster_bits;
|
|
|
05bba0 |
--
|
|
|
05bba0 |
1.8.3.1
|
|
|
05bba0 |
|