a3fa63d2ce
CVE-2015-6815: net: e1000: infinite loop issue (bz #1260225) CVE-2015-6855: ide: divide by zero issue (bz #1261793) CVE-2015-5278: Infinite loop in ne2000_receive() (bz #1263284) CVE-2015-5279: Heap overflow vulnerability in ne2000_receive() (bz #1263287) Make block copy more stable (bz #1264416) Fix hang at start of live merge for large images (bz #1262901)
58 lines
2.1 KiB
Diff
58 lines
2.1 KiB
Diff
From: Fam Zheng <famz@redhat.com>
|
|
Date: Wed, 13 May 2015 11:11:13 +0800
|
|
Subject: [PATCH] block/mirror: Sleep periodically during bitmap scanning
|
|
|
|
Before, we only yield after initializing dirty bitmap, where the QMP
|
|
command would return. That may take very long, and guest IO will be
|
|
blocked.
|
|
|
|
Add sleep points like the later mirror iterations.
|
|
|
|
Signed-off-by: Fam Zheng <famz@redhat.com>
|
|
Reviewed-by: Wen Congyang <wency@cn.fujitsu.com>
|
|
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Message-id: 1431486673-19280-1-git-send-email-famz@redhat.com
|
|
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
|
(cherry picked from commit 4c0cbd6fec7db182a6deb52d5a8a8e7b0c5cbe64)
|
|
---
|
|
block/mirror.c | 13 ++++++++++++-
|
|
1 file changed, 12 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/block/mirror.c b/block/mirror.c
|
|
index 9407287..6f1bc3c 100644
|
|
--- a/block/mirror.c
|
|
+++ b/block/mirror.c
|
|
@@ -453,11 +453,23 @@ static void coroutine_fn mirror_run(void *opaque)
|
|
sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
|
|
mirror_free_init(s);
|
|
|
|
+ last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
|
if (!s->is_none_mode) {
|
|
/* First part, loop on the sectors and initialize the dirty bitmap. */
|
|
BlockDriverState *base = s->base;
|
|
for (sector_num = 0; sector_num < end; ) {
|
|
int64_t next = (sector_num | (sectors_per_chunk - 1)) + 1;
|
|
+ int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
|
+
|
|
+ if (now - last_pause_ns > SLICE_TIME) {
|
|
+ last_pause_ns = now;
|
|
+ block_job_sleep_ns(&s->common, QEMU_CLOCK_REALTIME, 0);
|
|
+ }
|
|
+
|
|
+ if (block_job_is_cancelled(&s->common)) {
|
|
+ goto immediate_exit;
|
|
+ }
|
|
+
|
|
ret = bdrv_is_allocated_above(bs, base,
|
|
sector_num, next - sector_num, &n);
|
|
|
|
@@ -476,7 +488,6 @@ static void coroutine_fn mirror_run(void *opaque)
|
|
}
|
|
|
|
bdrv_dirty_iter_init(bs, s->dirty_bitmap, &s->hbi);
|
|
- last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
|
for (;;) {
|
|
uint64_t delay_ns = 0;
|
|
int64_t cnt;
|