Re: [Qemu-block] [PATCH] block/mirror: Sleep periodically during bitmap scanning
On Wed, May 13, 2015 at 11:11:13AM +0800, Fam Zheng wrote: 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 f...@redhat.com --- block/mirror.c | 13 - 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/block/mirror.c b/block/mirror.c index 1a1d997..baed225 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -467,11 +467,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); @@ -490,7 +502,6 @@ static void coroutine_fn mirror_run(void *opaque) } bdrv_dirty_iter_init(s-dirty_bitmap, s-hbi); -last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); for (;;) { uint64_t delay_ns = 0; int64_t cnt; -- 2.4.0 Thanks, applied to my block tree: https://github.com/codyprime/qemu-kvm-jtc/commits/block Jeff
Re: [Qemu-block] [PATCH] block/mirror: Sleep periodically during bitmap scanning
On Wed, May 13, 2015 at 11:11:13AM +0800, Fam Zheng wrote: 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 f...@redhat.com --- block/mirror.c | 13 - 1 file changed, 12 insertions(+), 1 deletion(-) Ping for Jeff Reviewed-by: Stefan Hajnoczi stefa...@redhat.com pgpI7OXqtql8c.pgp Description: PGP signature
Re: [Qemu-block] [PATCH] block/mirror: Sleep periodically during bitmap scanning
On Wed, May 13, 2015 at 11:11:13AM +0800, Fam Zheng wrote: 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 f...@redhat.com --- block/mirror.c | 13 - 1 file changed, 12 insertions(+), 1 deletion(-) CCing Jeff Cody for block jobs. diff --git a/block/mirror.c b/block/mirror.c index 1a1d997..baed225 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -467,11 +467,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); @@ -490,7 +502,6 @@ static void coroutine_fn mirror_run(void *opaque) } bdrv_dirty_iter_init(s-dirty_bitmap, s-hbi); -last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); for (;;) { uint64_t delay_ns = 0; int64_t cnt; -- 2.4.0 pgpwtIfNjHubL.pgp Description: PGP signature
Re: [Qemu-block] [PATCH] block/mirror: Sleep periodically during bitmap scanning
On 13/05/2015 05:11, Fam Zheng wrote: 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. You were also planning to let bdrv_co_is_allocated/get_block_status return a larger p_num than nb_sectors---which maybe could make nb_sectors obsolete completely, I don't know. But this is already an improvement. Reviewed-by: Paolo Bonzini pbonz...@redhat.com Thanks, Paolo Signed-off-by: Fam Zheng f...@redhat.com --- block/mirror.c | 13 - 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/block/mirror.c b/block/mirror.c index 1a1d997..baed225 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -467,11 +467,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); @@ -490,7 +502,6 @@ static void coroutine_fn mirror_run(void *opaque) } bdrv_dirty_iter_init(s-dirty_bitmap, s-hbi); -last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); for (;;) { uint64_t delay_ns = 0; int64_t cnt;