qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2] qemu-img: fix in-flight count for qemu-img bench
@ 2016-12-07 15:08 Paolo Bonzini
  2016-12-21 21:18 ` [Qemu-devel] [Qemu-block] " John Snow
  0 siblings, 1 reply; 2+ messages in thread
From: Paolo Bonzini @ 2016-12-07 15:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, qemu-block

With aio=native (qemu-img bench -n) one or more requests can be completed
when a new request is submitted.  This in turn can cause bench_cb to
recurse before b->in_flight is updated.  This causes multiple I/Os
to be submitted with the same offset and, furthermore, the blk_aio_*
coroutines are never freed and qemu-img aborts.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 qemu-img.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/qemu-img.c b/qemu-img.c
index 6949b73..5df66fe 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3559,20 +3559,23 @@ static void bench_cb(void *opaque, int ret)
     }
 
     while (b->n > b->in_flight && b->in_flight < b->nrreq) {
+        int64_t offset = b->offset;
+        /* blk_aio_* might look for completed I/Os and kick bench_cb
+         * again, so make sure this operation is counted by in_flight
+         * and b->offset is ready for the next submission.
+         */
+        b->in_flight++;
+        b->offset += b->step;
+        b->offset %= b->image_size;
         if (b->write) {
-            acb = blk_aio_pwritev(b->blk, b->offset, b->qiov, 0,
-                                  bench_cb, b);
+            acb = blk_aio_pwritev(b->blk, offset, b->qiov, 0, bench_cb, b);
         } else {
-            acb = blk_aio_preadv(b->blk, b->offset, b->qiov, 0,
-                                 bench_cb, b);
+            acb = blk_aio_preadv(b->blk, offset, b->qiov, 0, bench_cb, b);
         }
         if (!acb) {
             error_report("Failed to issue request");
             exit(EXIT_FAILURE);
         }
-        b->in_flight++;
-        b->offset += b->step;
-        b->offset %= b->image_size;
     }
 }
 
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [Qemu-block] [PATCH v2] qemu-img: fix in-flight count for qemu-img bench
  2016-12-07 15:08 [Qemu-devel] [PATCH v2] qemu-img: fix in-flight count for qemu-img bench Paolo Bonzini
@ 2016-12-21 21:18 ` John Snow
  0 siblings, 0 replies; 2+ messages in thread
From: John Snow @ 2016-12-21 21:18 UTC (permalink / raw)
  To: Paolo Bonzini, qemu-devel; +Cc: kwolf, qemu-block



On 12/07/2016 10:08 AM, Paolo Bonzini wrote:
> With aio=native (qemu-img bench -n) one or more requests can be completed
> when a new request is submitted.  This in turn can cause bench_cb to
> recurse before b->in_flight is updated.  This causes multiple I/Os
> to be submitted with the same offset and, furthermore, the blk_aio_*
> coroutines are never freed and qemu-img aborts.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  qemu-img.c | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/qemu-img.c b/qemu-img.c
> index 6949b73..5df66fe 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -3559,20 +3559,23 @@ static void bench_cb(void *opaque, int ret)
>      }
>  
>      while (b->n > b->in_flight && b->in_flight < b->nrreq) {
> +        int64_t offset = b->offset;
> +        /* blk_aio_* might look for completed I/Os and kick bench_cb
> +         * again, so make sure this operation is counted by in_flight
> +         * and b->offset is ready for the next submission.
> +         */
> +        b->in_flight++;
> +        b->offset += b->step;
> +        b->offset %= b->image_size;
>          if (b->write) {
> -            acb = blk_aio_pwritev(b->blk, b->offset, b->qiov, 0,
> -                                  bench_cb, b);
> +            acb = blk_aio_pwritev(b->blk, offset, b->qiov, 0, bench_cb, b);
>          } else {
> -            acb = blk_aio_preadv(b->blk, b->offset, b->qiov, 0,
> -                                 bench_cb, b);
> +            acb = blk_aio_preadv(b->blk, offset, b->qiov, 0, bench_cb, b);
>          }
>          if (!acb) {
>              error_report("Failed to issue request");
>              exit(EXIT_FAILURE);
>          }
> -        b->in_flight++;
> -        b->offset += b->step;
> -        b->offset %= b->image_size;
>      }
>  }
>  
> 

Reviewed-by: John Snow <jsnow@redhat.com>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-12-21 21:18 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-12-07 15:08 [Qemu-devel] [PATCH v2] qemu-img: fix in-flight count for qemu-img bench Paolo Bonzini
2016-12-21 21:18 ` [Qemu-devel] [Qemu-block] " John Snow

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).