qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>
Subject: [Qemu-devel] [PULL 16/19] linux-aio: track whether the queue is blocked
Date: Fri, 12 Dec 2014 17:10:02 +0000	[thread overview]
Message-ID: <1418404205-6213-17-git-send-email-stefanha@redhat.com> (raw)
In-Reply-To: <1418404205-6213-1-git-send-email-stefanha@redhat.com>

From: Paolo Bonzini <pbonzini@redhat.com>

Avoid that unplug submits requests when io_submit reported that it
couldn't accept more; at the same time, try more io_submit calls if it
could handle the whole set of requests that were passed, so that the
"blocked" flag is reset as soon as possible.

After the previous patch, laio_submit already tried to avoid submitting
requests to a blocked queue, by comparing s->io_q.idx with "==" instead
of the more natural ">=".  Switch to the simpler expression now that we
have the "blocked" flag.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-id: 1418305950-30924-3-git-send-email-pbonzini@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 block/linux-aio.c | 47 +++++++++++++++++++++++++++--------------------
 1 file changed, 27 insertions(+), 20 deletions(-)

diff --git a/block/linux-aio.c b/block/linux-aio.c
index b6fbfd8..b870942 100644
--- a/block/linux-aio.c
+++ b/block/linux-aio.c
@@ -41,6 +41,7 @@ struct qemu_laiocb {
 typedef struct {
     int plugged;
     unsigned int idx;
+    bool blocked;
     QSIMPLEQ_HEAD(, qemu_laiocb) pending;
 } LaioQueue;
 
@@ -180,34 +181,39 @@ static void ioq_init(LaioQueue *io_q)
     QSIMPLEQ_INIT(&io_q->pending);
     io_q->plugged = 0;
     io_q->idx = 0;
+    io_q->blocked = false;
 }
 
 static int ioq_submit(struct qemu_laio_state *s)
 {
-    int ret, i;
-    int len = 0;
+    int ret, i, len;
     struct qemu_laiocb *aiocb;
     struct iocb *iocbs[MAX_QUEUED_IO];
 
-    QSIMPLEQ_FOREACH(aiocb, &s->io_q.pending, next) {
-        iocbs[len++] = &aiocb->iocb;
-        if (len == MAX_QUEUED_IO) {
-            break;
+    do {
+        len = 0;
+        QSIMPLEQ_FOREACH(aiocb, &s->io_q.pending, next) {
+            iocbs[len++] = &aiocb->iocb;
+            if (len == MAX_QUEUED_IO) {
+                break;
+            }
         }
-    }
 
-    ret = io_submit(s->ctx, len, iocbs);
-    if (ret == -EAGAIN) {
-        ret = 0;
-    }
-    if (ret < 0) {
-        abort();
-    }
+        ret = io_submit(s->ctx, len, iocbs);
+        if (ret == -EAGAIN) {
+            ret = 0;
+        }
+        if (ret < 0) {
+            abort();
+        }
+
+        for (i = 0; i < ret; i++) {
+            s->io_q.idx--;
+            QSIMPLEQ_REMOVE_HEAD(&s->io_q.pending, next);
+        }
+    } while (ret == len && !QSIMPLEQ_EMPTY(&s->io_q.pending));
+    s->io_q.blocked = (s->io_q.idx > 0);
 
-    for (i = 0; i < ret; i++) {
-        s->io_q.idx--;
-        QSIMPLEQ_REMOVE_HEAD(&s->io_q.pending, next);
-    }
     return ret;
 }
 
@@ -229,7 +235,7 @@ int laio_io_unplug(BlockDriverState *bs, void *aio_ctx, bool unplug)
         return 0;
     }
 
-    if (!QSIMPLEQ_EMPTY(&s->io_q.pending)) {
+    if (!s->io_q.blocked && !QSIMPLEQ_EMPTY(&s->io_q.pending)) {
         ret = ioq_submit(s);
     }
 
@@ -271,7 +277,8 @@ BlockAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
 
     QSIMPLEQ_INSERT_TAIL(&s->io_q.pending, laiocb, next);
     s->io_q.idx++;
-    if (s->io_q.idx == (s->io_q.plugged ? MAX_QUEUED_IO : 1)) {
+    if (!s->io_q.blocked &&
+        (!s->io_q.plugged || s->io_q.idx >= MAX_QUEUED_IO)) {
         ioq_submit(s);
     }
     return &laiocb->common;
-- 
2.1.0

  parent reply	other threads:[~2014-12-12 17:11 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-12 17:09 [Qemu-devel] [PULL 00/19] Block patches Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 01/19] block migration: fix return value Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 02/19] vmdk: Fix error for JSON descriptor file names Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 03/19] iotests: Add test for vmdk JSON " Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 04/19] block/rbd: fix memory leak Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 05/19] block: vhdx - remove redundant comments Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 06/19] block: vhdx - update PAYLOAD_BLOCK_UNMAPPED value to match 1.00 spec Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 07/19] block: vhdx - change .vhdx_create default block state to ZERO Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 08/19] qemu-io: Add sigraise command Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 09/19] iotests: Filter for "Killed" in qemu-io output Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 10/19] iotests: Fix test 039 Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 11/19] block: vhdx - set .bdrv_has_zero_init to bdrv_has_zero_init_1 Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 12/19] qemu-iotests: Remove traling whitespaces in *.out Stefan Hajnoczi
2014-12-12 17:09 ` [Qemu-devel] [PULL 13/19] block: Don't add trailing space in "Formating..." message Stefan Hajnoczi
2014-12-12 17:10 ` [Qemu-devel] [PULL 14/19] block: drop unused bdrv_clear_incoming_migration_all() prototype Stefan Hajnoczi
2014-12-12 17:10 ` [Qemu-devel] [PULL 15/19] linux-aio: queue requests that cannot be submitted Stefan Hajnoczi
2014-12-12 17:10 ` Stefan Hajnoczi [this message]
2014-12-12 17:10 ` [Qemu-devel] [PULL 17/19] linux-aio: rename LaioQueue idx field to "n" Stefan Hajnoczi
2014-12-12 17:10 ` [Qemu-devel] [PULL 18/19] linux-aio: drop return code from laio_io_unplug and ioq_submit Stefan Hajnoczi
2014-12-12 17:10 ` [Qemu-devel] [PULL 19/19] linux-aio: simplify removal of completed iocbs from the list Stefan Hajnoczi
2014-12-15 11:11 ` [Qemu-devel] [PULL 00/19] Block patches Peter Maydell

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=1418404205-6213-17-git-send-email-stefanha@redhat.com \
    --to=stefanha@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.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).