From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, ming.lei@canonical.com, pl@kamp.de,
stefanha@redhat.com
Subject: [Qemu-devel] [PATCH v2 2/5] linux-aio: track whether the queue is blocked
Date: Thu, 11 Dec 2014 14:52:27 +0100 [thread overview]
Message-ID: <1418305950-30924-3-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1418305950-30924-1-git-send-email-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>
---
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
next prev parent reply other threads:[~2014-12-11 13:53 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-11 13:52 [Qemu-devel] [PATCH v2 0/5] linux-aio: rewrite and simplify queuing code Paolo Bonzini
2014-12-11 13:52 ` [Qemu-devel] [PATCH v2 1/5] linux-aio: queue requests that cannot be submitted Paolo Bonzini
2014-12-16 11:07 ` Kevin Wolf
2014-12-16 11:28 ` Paolo Bonzini
2014-12-16 13:10 ` Kevin Wolf
2014-12-16 18:28 ` Paolo Bonzini
2014-12-16 20:26 ` Paolo Bonzini
2014-12-17 12:34 ` Paolo Bonzini
2014-12-17 15:03 ` Paolo Bonzini
2014-12-11 13:52 ` Paolo Bonzini [this message]
2014-12-11 13:52 ` [Qemu-devel] [PATCH v2 3/5] linux-aio: rename LaioQueue idx field to "n" Paolo Bonzini
2014-12-11 13:52 ` [Qemu-devel] [PATCH v2 4/5] linux-aio: drop return code from laio_io_unplug and ioq_submit Paolo Bonzini
2014-12-11 13:52 ` [Qemu-devel] [PATCH v2 5/5] linux-aio: simplify removal of completed iocbs from the list Paolo Bonzini
2014-12-11 14:49 ` [Qemu-devel] [PATCH v2 0/5] linux-aio: rewrite and simplify queuing code Kevin Wolf
2014-12-12 17:07 ` 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=1418305950-30924-3-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=kwolf@redhat.com \
--cc=ming.lei@canonical.com \
--cc=pl@kamp.de \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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).