Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-reques…
Browse files Browse the repository at this point in the history
…t' into staging

Pull request

These fixes make dataplane work again after the notify_me optimization was
added.  They also solve QEMUBH memory leaks and fix a bug in dataplane's
cleanup code.

# gpg: Signature made Wed Jul 29 14:50:26 2015 BST using RSA key ID 81AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg:                 aka "Stefan Hajnoczi <stefanha@gmail.com>"

* remotes/stefanha/tags/block-pull-request:
  AioContext: force event loop iteration using BH
  AioContext: avoid leaking BHs on cleanup
  virtio-blk-dataplane: delete bottom half before the AioContext is freed

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Jul 29, 2015
2 parents b83d017 + ca96ac4 commit 46739a2
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 3 deletions.
29 changes: 27 additions & 2 deletions async.c
Expand Up @@ -79,8 +79,10 @@ int aio_bh_poll(AioContext *ctx)
* aio_notify again if necessary.
*/
if (!bh->deleted && atomic_xchg(&bh->scheduled, 0)) {
if (!bh->idle)
/* Idle BHs and the notify BH don't count as progress */
if (!bh->idle && bh != ctx->notify_dummy_bh) {
ret = 1;
}
bh->idle = 0;
bh->cb(bh->opaque);
}
Expand Down Expand Up @@ -230,7 +232,21 @@ aio_ctx_finalize(GSource *source)
{
AioContext *ctx = (AioContext *) source;

qemu_bh_delete(ctx->notify_dummy_bh);
thread_pool_free(ctx->thread_pool);

qemu_mutex_lock(&ctx->bh_lock);
while (ctx->first_bh) {
QEMUBH *next = ctx->first_bh->next;

/* qemu_bh_delete() must have been called on BHs in this AioContext */
assert(ctx->first_bh->deleted);

g_free(ctx->first_bh);
ctx->first_bh = next;
}
qemu_mutex_unlock(&ctx->bh_lock);

aio_set_event_notifier(ctx, &ctx->notifier, NULL);
event_notifier_cleanup(&ctx->notifier);
rfifolock_destroy(&ctx->lock);
Expand Down Expand Up @@ -285,8 +301,15 @@ static void aio_timerlist_notify(void *opaque)

static void aio_rfifolock_cb(void *opaque)
{
AioContext *ctx = opaque;

/* Kick owner thread in case they are blocked in aio_poll() */
aio_notify(opaque);
qemu_bh_schedule(ctx->notify_dummy_bh);
}

static void notify_dummy_bh(void *opaque)
{
/* Do nothing, we were invoked just to force the event loop to iterate */
}

static void event_notifier_dummy_cb(EventNotifier *e)
Expand All @@ -313,6 +336,8 @@ AioContext *aio_context_new(Error **errp)
rfifolock_init(&ctx->lock, aio_rfifolock_cb, ctx);
timerlistgroup_init(&ctx->tlg, aio_timerlist_notify, ctx);

ctx->notify_dummy_bh = aio_bh_new(ctx, notify_dummy_bh, NULL);

return ctx;
}

Expand Down
2 changes: 1 addition & 1 deletion hw/block/dataplane/virtio-blk.c
Expand Up @@ -223,8 +223,8 @@ void virtio_blk_data_plane_destroy(VirtIOBlockDataPlane *s)
virtio_blk_data_plane_stop(s);
blk_op_unblock_all(s->conf->conf.blk, s->blocker);
error_free(s->blocker);
object_unref(OBJECT(s->iothread));
qemu_bh_delete(s->bh);
object_unref(OBJECT(s->iothread));
g_free(s);
}

Expand Down
3 changes: 3 additions & 0 deletions include/block/aio.h
Expand Up @@ -114,6 +114,9 @@ struct AioContext {
bool notified;
EventNotifier notifier;

/* Scheduling this BH forces the event loop it iterate */
QEMUBH *notify_dummy_bh;

/* Thread pool for performing work and receiving completion callbacks */
struct ThreadPool *thread_pool;

Expand Down

0 comments on commit 46739a2

Please sign in to comment.