* [Qemu-devel] [PATCH untested] mirror: start drained section earlier
@ 2015-12-16 18:33 Paolo Bonzini
2015-12-17 2:14 ` Fam Zheng
0 siblings, 1 reply; 3+ messages in thread
From: Paolo Bonzini @ 2015-12-16 18:33 UTC (permalink / raw)
To: qemu-devel; +Cc: famz
Ensure that the guest does not write anything to disk after cnt is
read for the final time.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Untested.
block/mirror.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index 0e8f556..e57c246 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -562,8 +562,18 @@ static void coroutine_fn mirror_run(void *opaque)
* mirror_populate runs.
*/
trace_mirror_before_drain(s, cnt);
- bdrv_drain(bs);
+ bdrv_drained_begin(s->common.bs);
cnt = bdrv_get_dirty_count(s->dirty_bitmap);
+
+ if (cnt == 0) {
+ /* The two disks are in sync. Exit and report successful
+ * completion.
+ */
+ assert(QLIST_EMPTY(&bs->tracked_requests));
+ s->common.cancelled = false;
+ break;
+ }
+ bdrv_drained_end(s->common.bs);
}
ret = 0;
@@ -576,13 +586,6 @@ static void coroutine_fn mirror_run(void *opaque)
} else if (!should_complete) {
delay_ns = (s->in_flight == 0 && cnt == 0 ? SLICE_TIME : 0);
block_job_sleep_ns(&s->common, QEMU_CLOCK_REALTIME, delay_ns);
- } else if (cnt == 0) {
- /* The two disks are in sync. Exit and report successful
- * completion.
- */
- assert(QLIST_EMPTY(&bs->tracked_requests));
- s->common.cancelled = false;
- break;
}
last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
}
@@ -608,9 +611,6 @@ immediate_exit:
data = g_malloc(sizeof(*data));
data->ret = ret;
- /* Before we switch to target in mirror_exit, make sure data doesn't
- * change. */
- bdrv_drained_begin(s->common.bs);
block_job_defer_to_main_loop(&s->common, mirror_exit, data);
}
--
2.5.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [Qemu-devel] [PATCH untested] mirror: start drained section earlier 2015-12-16 18:33 [Qemu-devel] [PATCH untested] mirror: start drained section earlier Paolo Bonzini @ 2015-12-17 2:14 ` Fam Zheng 2015-12-17 9:04 ` Paolo Bonzini 0 siblings, 1 reply; 3+ messages in thread From: Fam Zheng @ 2015-12-17 2:14 UTC (permalink / raw) To: Paolo Bonzini; +Cc: qemu-devel On Wed, 12/16 19:33, Paolo Bonzini wrote: > Ensure that the guest does not write anything to disk after cnt is > read for the final time. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > Untested. > > block/mirror.c | 22 +++++++++++----------- > 1 file changed, 11 insertions(+), 11 deletions(-) > > diff --git a/block/mirror.c b/block/mirror.c > index 0e8f556..e57c246 100644 > --- a/block/mirror.c > +++ b/block/mirror.c > @@ -562,8 +562,18 @@ static void coroutine_fn mirror_run(void *opaque) > * mirror_populate runs. > */ > trace_mirror_before_drain(s, cnt); > - bdrv_drain(bs); > + bdrv_drained_begin(s->common.bs); > cnt = bdrv_get_dirty_count(s->dirty_bitmap); > + > + if (cnt == 0) { > + /* The two disks are in sync. Exit and report successful > + * completion. > + */ > + assert(QLIST_EMPTY(&bs->tracked_requests)); > + s->common.cancelled = false; > + break; > + } > + bdrv_drained_end(s->common.bs); > } > > ret = 0; > @@ -576,13 +586,6 @@ static void coroutine_fn mirror_run(void *opaque) > } else if (!should_complete) { > delay_ns = (s->in_flight == 0 && cnt == 0 ? SLICE_TIME : 0); > block_job_sleep_ns(&s->common, QEMU_CLOCK_REALTIME, delay_ns); > - } else if (cnt == 0) { > - /* The two disks are in sync. Exit and report successful > - * completion. > - */ > - assert(QLIST_EMPTY(&bs->tracked_requests)); > - s->common.cancelled = false; > - break; > } > last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME); > } > @@ -608,9 +611,6 @@ immediate_exit: > > data = g_malloc(sizeof(*data)); > data->ret = ret; > - /* Before we switch to target in mirror_exit, make sure data doesn't > - * change. */ > - bdrv_drained_begin(s->common.bs); > block_job_defer_to_main_loop(&s->common, mirror_exit, data); > } bdrv_drained_begin was unconditional to balance with the one in mirror_exit, but now it is only called if cnt == 0. Squashing this in fixes it: diff --git a/block/mirror.c b/block/mirror.c index e57c246..a814929 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -62,6 +62,7 @@ typedef struct MirrorBlockJob { int ret; bool unmap; bool waiting_for_io; + bool drained_begin; } MirrorBlockJob; typedef struct MirrorOp { @@ -355,6 +356,7 @@ static void mirror_exit(BlockJob *job, void *opaque) MirrorExitData *data = opaque; AioContext *replace_aio_context = NULL; BlockDriverState *src = s->common.bs; + bool drained_begin = s->drained_begin; /* Make sure that the source BDS doesn't go away before we called * block_job_completed(). */ @@ -388,7 +390,9 @@ static void mirror_exit(BlockJob *job, void *opaque) bdrv_unref(s->target); block_job_completed(&s->common, data->ret); g_free(data); - bdrv_drained_end(src); + if (drained_begin) { + bdrv_drained_end(src); + } bdrv_unref(src); } @@ -571,6 +575,7 @@ static void coroutine_fn mirror_run(void *opaque) */ assert(QLIST_EMPTY(&bs->tracked_requests)); s->common.cancelled = false; + s->drained_begin = true; break; } bdrv_drained_end(s->common.bs); ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH untested] mirror: start drained section earlier 2015-12-17 2:14 ` Fam Zheng @ 2015-12-17 9:04 ` Paolo Bonzini 0 siblings, 0 replies; 3+ messages in thread From: Paolo Bonzini @ 2015-12-17 9:04 UTC (permalink / raw) To: Fam Zheng; +Cc: qemu-devel On 17/12/2015 03:14, Fam Zheng wrote: > @@ -388,7 +390,9 @@ static void mirror_exit(BlockJob *job, void *opaque) > bdrv_unref(s->target); > block_job_completed(&s->common, data->ret); > g_free(data); > - bdrv_drained_end(src); > + if (drained_begin) { > + bdrv_drained_end(src); > + } > bdrv_unref(src); > } > > @@ -571,6 +575,7 @@ static void coroutine_fn mirror_run(void *opaque) > */ > assert(QLIST_EMPTY(&bs->tracked_requests)); > s->common.cancelled = false; > + s->drained_begin = true; > break; > } > bdrv_drained_end(s->common.bs); > Good point, thanks! Paolo ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-12-17 9:04 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-12-16 18:33 [Qemu-devel] [PATCH untested] mirror: start drained section earlier Paolo Bonzini 2015-12-17 2:14 ` Fam Zheng 2015-12-17 9:04 ` Paolo Bonzini
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.