async: optimize aio_bh_poll
Avoid entering the slow path of qemu_lockcnt_dec_and_lock if no bottom half has to be deleted. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Fam Zheng <famz@redhat.com> Message-id: 20170112180800.21085-11-pbonzini@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
7c690fd193
commit
7d506c90af
10
async.c
10
async.c
|
@ -92,6 +92,7 @@ int aio_bh_poll(AioContext *ctx)
|
||||||
{
|
{
|
||||||
QEMUBH *bh, **bhp, *next;
|
QEMUBH *bh, **bhp, *next;
|
||||||
int ret;
|
int ret;
|
||||||
|
bool deleted = false;
|
||||||
|
|
||||||
qemu_lockcnt_inc(&ctx->list_lock);
|
qemu_lockcnt_inc(&ctx->list_lock);
|
||||||
|
|
||||||
|
@ -112,9 +113,17 @@ int aio_bh_poll(AioContext *ctx)
|
||||||
bh->idle = 0;
|
bh->idle = 0;
|
||||||
aio_bh_call(bh);
|
aio_bh_call(bh);
|
||||||
}
|
}
|
||||||
|
if (bh->deleted) {
|
||||||
|
deleted = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remove deleted bhs */
|
/* remove deleted bhs */
|
||||||
|
if (!deleted) {
|
||||||
|
qemu_lockcnt_dec(&ctx->list_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (qemu_lockcnt_dec_and_lock(&ctx->list_lock)) {
|
if (qemu_lockcnt_dec_and_lock(&ctx->list_lock)) {
|
||||||
bhp = &ctx->first_bh;
|
bhp = &ctx->first_bh;
|
||||||
while (*bhp) {
|
while (*bhp) {
|
||||||
|
@ -128,7 +137,6 @@ int aio_bh_poll(AioContext *ctx)
|
||||||
}
|
}
|
||||||
qemu_lockcnt_unlock(&ctx->list_lock);
|
qemu_lockcnt_unlock(&ctx->list_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue