diff options
Diffstat (limited to 'block/graph-lock.c')
| -rw-r--r-- | block/graph-lock.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/block/graph-lock.c b/block/graph-lock.c index e5525ee2db..079e878d9b 100644 --- a/block/graph-lock.c +++ b/block/graph-lock.c @@ -161,11 +161,21 @@ void no_coroutine_fn bdrv_graph_wrlock(BlockDriverState *bs) } } -void bdrv_graph_wrunlock(void) +void no_coroutine_fn bdrv_graph_wrunlock_ctx(AioContext *ctx) { GLOBAL_STATE_CODE(); assert(qatomic_read(&has_writer)); + /* + * Release only non-mainloop AioContext. The mainloop often relies on the + * BQL and doesn't lock the main AioContext before doing things. + */ + if (ctx && ctx != qemu_get_aio_context()) { + aio_context_release(ctx); + } else { + ctx = NULL; + } + WITH_QEMU_LOCK_GUARD(&aio_context_list_lock) { /* * No need for memory barriers, this works in pair with @@ -187,6 +197,17 @@ void bdrv_graph_wrunlock(void) * progress. */ aio_bh_poll(qemu_get_aio_context()); + + if (ctx) { + aio_context_acquire(ctx); + } +} + +void no_coroutine_fn bdrv_graph_wrunlock(BlockDriverState *bs) +{ + AioContext *ctx = bs ? bdrv_get_aio_context(bs) : NULL; + + bdrv_graph_wrunlock_ctx(ctx); } void coroutine_fn bdrv_graph_co_rdlock(void) |