diff mbox

[28/29] qed: Use a coroutine for need_check_timer

Message ID 1495830130-30611-29-git-send-email-kwolf@redhat.com
State New
Headers show

Commit Message

Kevin Wolf May 26, 2017, 8:22 p.m. UTC
This fixes the last place where we degraded from AIO to actual blocking
synchronous I/O requests. Putting it into a coroutine means that instead
of blocking, the coroutine simply yields while doing I/O.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/qed.c | 33 +++++++++++++++++----------------
 1 file changed, 17 insertions(+), 16 deletions(-)

Comments

Stefan Hajnoczi May 31, 2017, 12:56 p.m. UTC | #1
On Fri, May 26, 2017 at 10:22:09PM +0200, Kevin Wolf wrote:
> This fixes the last place where we degraded from AIO to actual blocking
> synchronous I/O requests. Putting it into a coroutine means that instead
> of blocking, the coroutine simply yields while doing I/O.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  block/qed.c | 33 +++++++++++++++++----------------
>  1 file changed, 17 insertions(+), 16 deletions(-)
> 
> diff --git a/block/qed.c b/block/qed.c
> index d3f7d0c..20e81a0 100644
> --- a/block/qed.c
> +++ b/block/qed.c
> @@ -264,11 +264,23 @@ static void qed_unplug_allocating_write_reqs(BDRVQEDState *s)
>      qemu_co_enter_next(&s->allocating_write_reqs);
>  }
>  
> -static void qed_clear_need_check(void *opaque, int ret)
> +static void qed_need_check_timer_entry(void *opaque)

Missing coroutine_fn.
diff mbox

Patch

diff --git a/block/qed.c b/block/qed.c
index d3f7d0c..20e81a0 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -264,11 +264,23 @@  static void qed_unplug_allocating_write_reqs(BDRVQEDState *s)
     qemu_co_enter_next(&s->allocating_write_reqs);
 }
 
-static void qed_clear_need_check(void *opaque, int ret)
+static void qed_need_check_timer_entry(void *opaque)
 {
     BDRVQEDState *s = opaque;
+    int ret;
 
-    if (ret) {
+    /* The timer should only fire when allocating writes have drained */
+    assert(!s->allocating_acb);
+
+    trace_qed_need_check_timer_cb(s);
+
+    qed_acquire(s);
+    qed_plug_allocating_write_reqs(s);
+
+    /* Ensure writes are on disk before clearing flag */
+    ret = bdrv_co_flush(s->bs->file->bs);
+    qed_release(s);
+    if (ret < 0) {
         goto out;
     }
 
@@ -276,7 +288,7 @@  static void qed_clear_need_check(void *opaque, int ret)
     ret = qed_write_header(s);
     (void) ret;
 
-    ret = bdrv_flush(s->bs);
+    ret = bdrv_co_flush(s->bs);
     (void) ret;
 
 out:
@@ -285,19 +297,8 @@  out:
 
 static void qed_need_check_timer_cb(void *opaque)
 {
-    BDRVQEDState *s = opaque;
-
-    /* The timer should only fire when allocating writes have drained */
-    assert(!s->allocating_acb);
-
-    trace_qed_need_check_timer_cb(s);
-
-    qed_acquire(s);
-    qed_plug_allocating_write_reqs(s);
-
-    /* Ensure writes are on disk before clearing flag */
-    bdrv_aio_flush(s->bs->file->bs, qed_clear_need_check, s);
-    qed_release(s);
+    Coroutine *co = qemu_coroutine_create(qed_need_check_timer_entry, opaque);
+    qemu_coroutine_enter(co);
 }
 
 void qed_acquire(BDRVQEDState *s)