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