From: Jeff Cody <jcody@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: qemu-block@nongnu.org, qemu-devel@nongnu.org,
Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 02/17] mirror: Make wait_for_any_operation() coroutine_fn
Date: Mon, 13 Aug 2018 23:36:58 -0400 [thread overview]
Message-ID: <20180814033658.GA3254@localhost.localdomain> (raw)
In-Reply-To: <20180813022006.7216-3-mreitz@redhat.com>
On Mon, Aug 13, 2018 at 04:19:51AM +0200, Max Reitz wrote:
> mirror_wait_for_any_operation() calls qemu_co_queue_wait(), which is a
> coroutine_fn (technically it is a macro which resolves to a
> coroutine_fn). Therefore, this function needs to be a coroutine_fn as
> well.
>
> This patch makes it and all of its callers coroutine_fns.
>
It'd be nice if someday coroutine_fn was actually functional during
compile. We can dream :)
> Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Jeff Cody <jcody@redhat.com>
> ---
> block/mirror.c | 30 ++++++++++++++++--------------
> 1 file changed, 16 insertions(+), 14 deletions(-)
>
> diff --git a/block/mirror.c b/block/mirror.c
> index 85f5742eae..c28b6159d5 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -279,7 +279,8 @@ static int mirror_cow_align(MirrorBlockJob *s, int64_t *offset,
> return ret;
> }
>
> -static inline void mirror_wait_for_any_operation(MirrorBlockJob *s, bool active)
> +static inline void coroutine_fn
> + mirror_co_wait_for_any_operation(MirrorBlockJob *s, bool active)
> {
> MirrorOp *op;
>
> @@ -297,10 +298,11 @@ static inline void mirror_wait_for_any_operation(MirrorBlockJob *s, bool active)
> abort();
> }
>
> -static inline void mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s)
> +static inline void coroutine_fn
> + mirror_co_wait_for_free_in_flight_slot(MirrorBlockJob *s)
> {
> /* Only non-active operations use up in-flight slots */
> - mirror_wait_for_any_operation(s, false);
> + mirror_co_wait_for_any_operation(s, false);
> }
>
> /* Perform a mirror copy operation.
> @@ -343,7 +345,7 @@ static void coroutine_fn mirror_co_read(void *opaque)
>
> while (s->buf_free_count < nb_chunks) {
> trace_mirror_yield_in_flight(s, op->offset, s->in_flight);
> - mirror_wait_for_free_in_flight_slot(s);
> + mirror_co_wait_for_free_in_flight_slot(s);
> }
>
> /* Now make a QEMUIOVector taking enough granularity-sized chunks
> @@ -549,7 +551,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
>
> while (s->in_flight >= MAX_IN_FLIGHT) {
> trace_mirror_yield_in_flight(s, offset, s->in_flight);
> - mirror_wait_for_free_in_flight_slot(s);
> + mirror_co_wait_for_free_in_flight_slot(s);
> }
>
> if (s->ret < 0) {
> @@ -600,10 +602,10 @@ static void mirror_free_init(MirrorBlockJob *s)
> * mirror_resume() because mirror_run() will begin iterating again
> * when the job is resumed.
> */
> -static void mirror_wait_for_all_io(MirrorBlockJob *s)
> +static void coroutine_fn mirror_co_wait_for_all_io(MirrorBlockJob *s)
> {
> while (s->in_flight > 0) {
> - mirror_wait_for_free_in_flight_slot(s);
> + mirror_co_wait_for_free_in_flight_slot(s);
> }
> }
>
> @@ -762,7 +764,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s)
> if (s->in_flight >= MAX_IN_FLIGHT) {
> trace_mirror_yield(s, UINT64_MAX, s->buf_free_count,
> s->in_flight);
> - mirror_wait_for_free_in_flight_slot(s);
> + mirror_co_wait_for_free_in_flight_slot(s);
> continue;
> }
>
> @@ -770,7 +772,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s)
> offset += bytes;
> }
>
> - mirror_wait_for_all_io(s);
> + mirror_co_wait_for_all_io(s);
> s->initial_zeroing_ongoing = false;
> }
>
> @@ -916,7 +918,7 @@ static void coroutine_fn mirror_run(void *opaque)
> /* Do not start passive operations while there are active
> * writes in progress */
> while (s->in_active_write_counter) {
> - mirror_wait_for_any_operation(s, true);
> + mirror_co_wait_for_any_operation(s, true);
> }
>
> if (s->ret < 0) {
> @@ -942,7 +944,7 @@ static void coroutine_fn mirror_run(void *opaque)
> if (s->in_flight >= MAX_IN_FLIGHT || s->buf_free_count == 0 ||
> (cnt == 0 && s->in_flight > 0)) {
> trace_mirror_yield(s, cnt, s->buf_free_count, s->in_flight);
> - mirror_wait_for_free_in_flight_slot(s);
> + mirror_co_wait_for_free_in_flight_slot(s);
> continue;
> } else if (cnt != 0) {
> delay_ns = mirror_iteration(s);
> @@ -1028,7 +1030,7 @@ immediate_exit:
> assert(ret < 0 || ((s->common.job.force_cancel || !s->synced) &&
> job_is_cancelled(&s->common.job)));
> assert(need_drain);
> - mirror_wait_for_all_io(s);
> + mirror_co_wait_for_all_io(s);
> }
>
> assert(s->in_flight == 0);
> @@ -1098,11 +1100,11 @@ static void mirror_complete(Job *job, Error **errp)
> job_enter(job);
> }
>
> -static void mirror_pause(Job *job)
> +static void coroutine_fn mirror_pause(Job *job)
> {
> MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
>
> - mirror_wait_for_all_io(s);
> + mirror_co_wait_for_all_io(s);
> }
>
> static bool mirror_drained_poll(BlockJob *job)
> --
> 2.17.1
>
next prev parent reply other threads:[~2018-08-14 3:37 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-13 2:19 [Qemu-devel] [PATCH 00/17] mirror: Mainly coroutine refinements Max Reitz
2018-08-13 2:19 ` [Qemu-devel] [PATCH 01/17] iotests: Try reading while mirroring in 156 Max Reitz
2018-08-14 3:39 ` Jeff Cody
2018-08-13 2:19 ` [Qemu-devel] [PATCH 02/17] mirror: Make wait_for_any_operation() coroutine_fn Max Reitz
2018-08-13 12:54 ` Murilo Opsfelder Araujo
2018-08-13 15:20 ` Max Reitz
2018-08-14 3:36 ` Jeff Cody [this message]
2018-08-13 2:19 ` [Qemu-devel] [PATCH 03/17] mirror: Pull *_align_for_copy() from *_co_read() Max Reitz
2018-08-14 3:39 ` Jeff Cody
2018-08-13 2:19 ` [Qemu-devel] [PATCH 04/17] mirror: Remove bytes_handled, part 1 Max Reitz
2018-08-13 2:19 ` [Qemu-devel] [PATCH 05/17] mirror: Remove bytes_handled, part 2 Max Reitz
2018-08-13 2:19 ` [Qemu-devel] [PATCH 06/17] mirror: Create mirror_co_perform() Max Reitz
2018-08-13 2:19 ` [Qemu-devel] [PATCH 07/17] mirror: Make mirror_co_zero() nicer Max Reitz
2018-08-13 2:19 ` [Qemu-devel] [PATCH 08/17] mirror: Make mirror_co_discard() nicer Max Reitz
2018-08-13 2:19 ` [Qemu-devel] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform() Max Reitz
2018-08-13 14:43 ` [Qemu-devel] [Qemu-block] " Paolo Bonzini
2018-08-13 15:21 ` Max Reitz
2018-08-13 2:19 ` [Qemu-devel] [PATCH 10/17] mirror: Create mirror_co_alloc_qiov() Max Reitz
2018-08-13 2:20 ` [Qemu-devel] [PATCH 11/17] mirror: Inline mirror_write_complete(), part 1 Max Reitz
2018-08-13 2:20 ` [Qemu-devel] [PATCH 12/17] mirror: Put QIOV locally into mirror_co_read Max Reitz
2018-08-13 2:20 ` [Qemu-devel] [PATCH 13/17] mirror: Linearize mirror_co_read() Max Reitz
2018-08-13 2:20 ` [Qemu-devel] [PATCH 14/17] mirror: Inline mirror_iteration_done() Max Reitz
2018-08-13 2:20 ` [Qemu-devel] [PATCH 15/17] mirror: Release AioCtx before queue_restart_all() Max Reitz
2018-08-13 2:20 ` [Qemu-devel] [PATCH 16/17] mirror: Support COR with write-blocking Max Reitz
2018-08-13 2:20 ` [Qemu-devel] [PATCH 17/17] iotests: Add test for active mirror with COR Max Reitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180814033658.GA3254@localhost.localdomain \
--to=jcody@redhat.com \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.