All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org
Subject: [Qemu-devel] [PATCH 07/17] throttle-groups: do not use qemu_co_enter_next
Date: Thu, 20 Apr 2017 14:00:48 +0200	[thread overview]
Message-ID: <20170420120058.28404-8-pbonzini@redhat.com> (raw)
In-Reply-To: <20170420120058.28404-1-pbonzini@redhat.com>

Prepare for removing this function; always restart throttled requests
from coroutine context.  This will matter when restarting throttled
requests will have to acquire a CoMutex.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 block/throttle-groups.c | 65 +++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 58 insertions(+), 7 deletions(-)

diff --git a/block/throttle-groups.c b/block/throttle-groups.c
index 69bfbd4..d66bf62 100644
--- a/block/throttle-groups.c
+++ b/block/throttle-groups.c
@@ -260,6 +260,18 @@ static bool throttle_group_schedule_timer(BlockBackend *blk, bool is_write)
     return must_wait;
 }
 
+/* Start the next pending I/O request for a BlockBackend.
+ *
+ * @blk:       the current BlockBackend
+ * @is_write:  the type of operation (read/write)
+ */
+static bool throttle_group_co_restart_queue(BlockBackend *blk, bool is_write)
+{
+    BlockBackendPublic *blkp = blk_get_public(blk);
+
+    return qemu_co_queue_next(&blkp->throttled_reqs[is_write]);
+}
+
 /* Look for the next pending I/O request and schedule it.
  *
  * This assumes that tg->lock is held.
@@ -287,7 +299,7 @@ static void schedule_next_request(BlockBackend *blk, bool is_write)
     if (!must_wait) {
         /* Give preference to requests from the current blk */
         if (qemu_in_coroutine() &&
-            qemu_co_queue_next(&blkp->throttled_reqs[is_write])) {
+            throttle_group_co_restart_queue(blk, is_write)) {
             token = blk;
         } else {
             ThrottleTimers *tt = &blk_get_public(token)->throttle_timers;
@@ -340,18 +352,57 @@ void coroutine_fn throttle_group_co_io_limits_intercept(BlockBackend *blk,
     qemu_mutex_unlock(&tg->lock);
 }
 
-void throttle_group_restart_blk(BlockBackend *blk)
+typedef struct {
+    BlockBackend *blk;
+    bool is_write;
+    int ret;
+} RestartData;
+
+static void throttle_group_restart_queue_entry(void *opaque)
 {
-    BlockBackendPublic *blkp = blk_get_public(blk);
+    RestartData *data = opaque;
+
+    data->ret = throttle_group_co_restart_queue(data->blk, data->is_write);
+}
+
+static int throttle_group_restart_queue(BlockBackend *blk, bool is_write)
+{
+    Coroutine *co;
+    RestartData rd = {
+        .blk = blk,
+        .is_write = is_write
+    };
+
+    aio_context_acquire(blk_get_aio_context(blk));
+    co = qemu_coroutine_create(throttle_group_restart_queue_entry, &rd);
+    /* The request doesn't start until after throttle_group_restart_queue_entry
+     * returns, so the coroutine cannot yield.
+     */
+    qemu_coroutine_enter(co);
+    aio_context_release(blk_get_aio_context(blk));
+    return rd.ret;
+}
+
+static void throttle_group_restart_blk_entry(void *opaque)
+{
+    BlockBackend *blk = opaque;
     int i;
 
     for (i = 0; i < 2; i++) {
-        while (qemu_co_enter_next(&blkp->throttled_reqs[i])) {
+        while (throttle_group_co_restart_queue(blk, i)) {
             ;
         }
     }
 }
 
+void throttle_group_restart_blk(BlockBackend *blk)
+{
+    Coroutine *co;
+
+    co = qemu_coroutine_create(throttle_group_restart_blk_entry, blk);
+    qemu_coroutine_enter(co);
+}
+
 /* Update the throttle configuration for a particular group. Similar
  * to throttle_config(), but guarantees atomicity within the
  * throttling group.
@@ -376,8 +427,8 @@ void throttle_group_config(BlockBackend *blk, ThrottleConfig *cfg)
     throttle_config(ts, tt, cfg);
     qemu_mutex_unlock(&tg->lock);
 
-    qemu_co_enter_next(&blkp->throttled_reqs[0]);
-    qemu_co_enter_next(&blkp->throttled_reqs[1]);
+    throttle_group_restart_queue(blk, 0);
+    throttle_group_restart_queue(blk, 1);
 }
 
 /* Get the throttle configuration from a particular group. Similar to
@@ -417,7 +468,7 @@ static void timer_cb(BlockBackend *blk, bool is_write)
 
     /* Run the request that was waiting for this timer */
     aio_context_acquire(blk_get_aio_context(blk));
-    empty_queue = !qemu_co_enter_next(&blkp->throttled_reqs[is_write]);
+    empty_queue = !throttle_group_restart_queue(blk, is_write);
     aio_context_release(blk_get_aio_context(blk));
 
     /* If the request queue was empty then we have to take care of
-- 
2.9.3

  parent reply	other threads:[~2017-04-20 12:02 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-20 12:00 [Qemu-devel] [PATCH for 2.10 00/17] Block layer thread safety, part 1 Paolo Bonzini
2017-04-20 12:00 ` [Qemu-devel] [PATCH 01/17] block: access copy_on_read with atomic ops Paolo Bonzini
2017-05-04 11:15   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-05-04 11:51     ` Paolo Bonzini
2017-04-20 12:00 ` [Qemu-devel] [PATCH 02/17] block: access quiesce_counter " Paolo Bonzini
2017-05-04 12:33   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 03/17] block: access io_limits_disabled " Paolo Bonzini
2017-05-04 12:38   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 04/17] block: access serialising_in_flight " Paolo Bonzini
2017-05-04 12:39   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 05/17] block: access wakeup " Paolo Bonzini
2017-05-04  6:39   ` Fam Zheng
2017-05-04  7:12     ` Paolo Bonzini
2017-05-04 12:47   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 06/17] block: access io_plugged " Paolo Bonzini
2017-05-04 12:48   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` Paolo Bonzini [this message]
2017-05-04 13:27   ` [Qemu-devel] [Qemu-block] [PATCH 07/17] throttle-groups: do not use qemu_co_enter_next Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 08/17] throttle-groups: protect throttled requests with a CoMutex Paolo Bonzini
2017-05-04  6:57   ` Fam Zheng
2017-05-04 13:56     ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 09/17] util: add stats64 module Paolo Bonzini
2017-05-04  7:19   ` Fam Zheng
2017-05-04  7:24     ` Paolo Bonzini
2017-05-04  7:36   ` Fam Zheng
2017-05-04  7:38     ` Paolo Bonzini
2017-05-04  8:55   ` [Qemu-devel] [Qemu-block] " Roman Kagan
2017-05-04  9:46     ` Paolo Bonzini
2017-04-20 12:00 ` [Qemu-devel] [PATCH 10/17] block: use Stat64 for wr_highest_offset Paolo Bonzini
2017-05-04 14:02   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 11/17] block: access write_gen with atomics Paolo Bonzini
2017-05-04 14:04   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 12/17] block: protect tracked_requests and flush_queue with reqs_lock Paolo Bonzini
2017-05-04  7:30   ` Fam Zheng
2017-05-04  8:35     ` Paolo Bonzini
2017-04-20 12:00 ` [Qemu-devel] [PATCH 13/17] coroutine-lock: introduce qemu_co_mutex_lock_unlock Paolo Bonzini
2017-05-04  7:39   ` Fam Zheng
2017-05-04  9:47     ` Paolo Bonzini
2017-05-04  9:52       ` Paolo Bonzini
2017-05-04 14:12   ` Stefan Hajnoczi
2017-05-04 16:17     ` Paolo Bonzini
2017-04-20 12:00 ` [Qemu-devel] [PATCH 14/17] block: optimize access to reqs_lock Paolo Bonzini
2017-05-04 14:59   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-05-04 16:06     ` Paolo Bonzini
2017-05-05 10:25       ` Stefan Hajnoczi
2017-05-05 10:45         ` Paolo Bonzini
2017-05-08 16:21           ` Stefan Hajnoczi
2017-05-08 16:30             ` Paolo Bonzini
2017-04-20 12:00 ` [Qemu-devel] [PATCH 15/17] block: introduce dirty_bitmap_mutex Paolo Bonzini
2017-05-04  7:55   ` Fam Zheng
2017-05-04  9:57     ` Paolo Bonzini
2017-04-20 12:00 ` [Qemu-devel] [PATCH 16/17] block: protect modification of dirty bitmaps with a mutex Paolo Bonzini
2017-04-20 14:42   ` Eric Blake
2017-05-04  8:05   ` Fam Zheng
2017-05-04 10:05     ` Paolo Bonzini
2017-05-05 10:36   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-05-05 10:47     ` Paolo Bonzini
2017-05-08 16:17       ` Stefan Hajnoczi
2017-04-20 12:00 ` [Qemu-devel] [PATCH 17/17] block: make accounting thread-safe Paolo Bonzini
2017-05-05 12:56   ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi
2017-04-20 12:40 ` [Qemu-devel] [PATCH for 2.10 00/17] Block layer thread safety, part 1 no-reply
2017-04-20 12:42 ` no-reply
2017-05-02 15:42 ` Paolo Bonzini
2017-05-04  8:09 ` Fam Zheng
2017-05-05 13:01 ` [Qemu-devel] [Qemu-block] " Stefan Hajnoczi

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=20170420120058.28404-8-pbonzini@redhat.com \
    --to=pbonzini@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.