From: Paolo Bonzini <pbonzini@redhat.com>
To: Liu Ping Fan <qemulist@gmail.com>
Cc: qemu-devel@nongnu.org, Anthony Liguori <anthony@codemonkey.ws>
Subject: Re: [Qemu-devel] [PATCH] QEMUBH: make AioContext's bh re-entrant
Date: Sat, 15 Jun 2013 01:35:19 -0400 [thread overview]
Message-ID: <51BBFD17.4020002@redhat.com> (raw)
In-Reply-To: <1371178554-14432-1-git-send-email-pingfanl@linux.vnet.ibm.com>
Il 13/06/2013 22:55, Liu Ping Fan ha scritto:
> BH will be used outside big lock, so introduce lock to protect it.
> Note that the lock only affects the writer and bh's callback does
> not take this extra lock.
>
> Signed-off-by: Liu Ping Fan <pingfanl@linux.vnet.ibm.com>
> ---
> async.c | 10 +++++++++-
> include/block/aio.h | 2 ++
> 2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/async.c b/async.c
> index 90fe906..b1dcead 100644
> --- a/async.c
> +++ b/async.c
> @@ -47,8 +47,11 @@ QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque)
> bh->ctx = ctx;
> bh->cb = cb;
> bh->opaque = opaque;
> + qemu_mutex_lock(&ctx->bh_lock);
> bh->next = ctx->first_bh;
> + smp_wmb();
> ctx->first_bh = bh;
> + qemu_mutex_unlock(&ctx->bh_lock);
> return bh;
> }
>
> @@ -60,7 +63,9 @@ int aio_bh_poll(AioContext *ctx)
> ctx->walking_bh++;
>
> ret = 0;
> - for (bh = ctx->first_bh; bh; bh = next) {
> + bh = ctx->first_bh;
> + smp_rmb();
> + for (; bh; bh = next) {
> next = bh->next;
The read barrier in theory should go inside the loop. On the other
hand, it only needs to be a smp_read_barrier_depends().
Paolo
> if (!bh->deleted && bh->scheduled) {
> bh->scheduled = 0;
> @@ -75,6 +80,7 @@ int aio_bh_poll(AioContext *ctx)
>
> /* remove deleted bhs */
> if (!ctx->walking_bh) {
> + qemu_mutex_lock(&ctx->bh_lock);
> bhp = &ctx->first_bh;
> while (*bhp) {
> bh = *bhp;
> @@ -85,6 +91,7 @@ int aio_bh_poll(AioContext *ctx)
> bhp = &bh->next;
> }
> }
> + qemu_mutex_unlock(&ctx->bh_lock);
> }
>
> return ret;
> @@ -211,6 +218,7 @@ AioContext *aio_context_new(void)
> ctx = (AioContext *) g_source_new(&aio_source_funcs, sizeof(AioContext));
> ctx->pollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD));
> ctx->thread_pool = NULL;
> + qemu_mutex_init(&ctx->bh_lock);
> event_notifier_init(&ctx->notifier, false);
> aio_set_event_notifier(ctx, &ctx->notifier,
> (EventNotifierHandler *)
> diff --git a/include/block/aio.h b/include/block/aio.h
> index 1836793..a65d16f 100644
> --- a/include/block/aio.h
> +++ b/include/block/aio.h
> @@ -17,6 +17,7 @@
> #include "qemu-common.h"
> #include "qemu/queue.h"
> #include "qemu/event_notifier.h"
> +#include "qemu/thread.h"
>
> typedef struct BlockDriverAIOCB BlockDriverAIOCB;
> typedef void BlockDriverCompletionFunc(void *opaque, int ret);
> @@ -53,6 +54,7 @@ typedef struct AioContext {
> */
> int walking_handlers;
>
> + QemuMutex bh_lock;
> /* Anchor of the list of Bottom Halves belonging to the context */
> struct QEMUBH *first_bh;
>
>
next prev parent reply other threads:[~2013-06-15 5:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-14 2:55 [Qemu-devel] [PATCH] QEMUBH: make AioContext's bh re-entrant Liu Ping Fan
2013-06-15 5:35 ` Paolo Bonzini [this message]
2013-06-15 8:43 ` liu ping fan
2013-06-15 11:16 ` Paolo Bonzini
2013-06-15 15:44 ` Paolo Bonzini
2013-06-16 10:00 ` liu ping fan
2013-06-16 10:03 ` liu ping fan
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=51BBFD17.4020002@redhat.com \
--to=pbonzini@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=qemu-devel@nongnu.org \
--cc=qemulist@gmail.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 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.