qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Fam Zheng <famz@redhat.com>, qemu-devel@nongnu.org
Cc: Stefan Hajnoczi <stefanha@redhat.com>, qemu-block@nongnu.org
Subject: Re: [Qemu-devel] [RFC PATCH] async: Fix aio_notify_accept
Date: Fri, 3 Aug 2018 19:08:26 +0200	[thread overview]
Message-ID: <48beaf6f-55a0-7ae4-d020-a0a6072181a4@redhat.com> (raw)
In-Reply-To: <20180803154955.25251-1-famz@redhat.com>

On 03/08/2018 17:49, Fam Zheng wrote:
>  void aio_notify_accept(AioContext *ctx)
>  {
> -    if (atomic_xchg(&ctx->notified, false)) {
> +    /* If ctx->notify_me >= 2, another aio_poll() is waiting which may need the
> +     * ctx->notifier event to wake up, so don't already clear it just because "we" are
> +     * done iterating. */
> +    if (atomic_read(&ctx->notify_me) < 2
> +        && atomic_xchg(&ctx->notified, false)) {
>          event_notifier_test_and_clear(&ctx->notifier);
>      }
>  }

Ok, it's somewhat reassuring to see from the BZ that the aio_poll in the
main thread (in bdrv_set_aio_context) is non-blocking, and that it isn't
about nested aio_poll.

Then it's not possible to have a busy wait there, because sooner or
later the bottom halves will be exhausted and aio_wait will return false
(no progress).

I'm convinced that the idea in your patch---skipping
aio_notify_accept---is correct, it's the ctx->notify_me test that I
cannot understand.  I'm not saying it's wrong, but it's tricky.  So we
need to improve the comments, the commit message, the way we achieve the
fix, or all three.

As to the comments and commit message: the BZ is a very good source of
information.  The comment on the main thread stealing the aio_notify was
very clear.

As to how to fix it, first of all, we should be clear on the invariants.
 It would be nice to assert that, if not
in_aio_context_home_thread(ctx), blocking must be false.  Two concurrent
blocking aio_polls will steal aio_notify from one another, so
intuitively that assertion should be true, and using AIO_WAIT_WHILE
takes care of it.

Second, if blocking is false, do we need to call aio_notify_accept at
all?  If not, and if we combine this with the assertion above, only the
I/O thread will call aio_notify_accept, and the main loop will never
steal the notification.  So that should fix the bug.

Thanks,

Paolo

  parent reply	other threads:[~2018-08-03 17:08 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-03 15:49 [Qemu-devel] [RFC PATCH] async: Fix aio_notify_accept Fam Zheng
2018-08-03 16:51 ` Paolo Bonzini
2018-08-03 17:08 ` Paolo Bonzini [this message]
2018-08-07  1:01   ` Fam Zheng

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=48beaf6f-55a0-7ae4-d020-a0a6072181a4@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=famz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --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).