qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Murilo Opsfelder Araujo <muriloo@linux.ibm.com>
To: Max Reitz <mreitz@redhat.com>
Cc: qemu-block@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
	Jeff Cody <jcody@redhat.com>, Fam Zheng <famz@redhat.com>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 02/17] mirror: Make wait_for_any_operation() coroutine_fn
Date: Mon, 13 Aug 2018 09:54:57 -0300	[thread overview]
Message-ID: <20180813125457.GA11625@kermit-br-ibm-com> (raw)
In-Reply-To: <20180813022006.7216-3-mreitz@redhat.com>

Hi, Max.

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.
>
> Signed-off-by: Max Reitz <mreitz@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)

Other functions in this patch were renamed to mirror_co_*.  I'm not sure if
mirror_pause() should follow that, i.e. be renamed to mirror_co_pause().

>  {
>      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
>
>

--
Murilo

  reply	other threads:[~2018-08-13 12:55 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 [this message]
2018-08-13 15:20     ` Max Reitz
2018-08-14  3:36   ` Jeff Cody
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=20180813125457.GA11625@kermit-br-ibm-com \
    --to=muriloo@linux.ibm.com \
    --cc=famz@redhat.com \
    --cc=jcody@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).