Re: [Qemu-block] [PATCH] block/mirror: Sleep periodically during bitmap scanning

2015-06-15 Thread Jeff Cody
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

2015-06-15 Thread Stefan Hajnoczi
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

2015-05-19 Thread Stefan Hajnoczi
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

2015-05-13 Thread Paolo Bonzini


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;