diff options
| author | Stefan Hajnoczi <stefanha@redhat.com> | 2023-05-16 15:02:19 -0400 |
|---|---|---|
| committer | Kevin Wolf <kwolf@redhat.com> | 2023-05-30 17:32:02 +0200 |
| commit | 2d1962958177cb80a491e4767c41bf6d82dbbc83 (patch) | |
| tree | e3990acd174db2ffa246a9ad751307fb05677e44 /include/hw/qdev-core.h | |
| parent | 80e7faaac6f363c9902fbab3f5cc463e4e3d933f (diff) | |
| download | focaccia-qemu-2d1962958177cb80a491e4767c41bf6d82dbbc83.tar.gz focaccia-qemu-2d1962958177cb80a491e4767c41bf6d82dbbc83.zip | |
block-backend: split blk_do_set_aio_context()
blk_set_aio_context() is not fully transactional because blk_do_set_aio_context() updates blk->ctx outside the transaction. Most of the time this goes unnoticed but a BlockDevOps.drained_end() callback that invokes blk_get_aio_context() fails assert(ctx == blk->ctx). This happens because blk->ctx is only assigned after BlockDevOps.drained_end() is called and we're in an intermediate state where BlockDrvierState nodes already have the new context and the BlockBackend still has the old context. Making blk_set_aio_context() fully transactional solves this assertion failure because the BlockBackend's context is updated as part of the transaction (before BlockDevOps.drained_end() is called). Split blk_do_set_aio_context() in order to solve this assertion failure. This helper function actually serves two different purposes: 1. It drives blk_set_aio_context(). 2. It responds to BdrvChildClass->change_aio_ctx(). Get rid of the helper function. Do #1 inside blk_set_aio_context() and do #2 inside blk_root_set_aio_ctx_commit(). This simplifies the code. The only drawback of the fully transactional approach is that blk_set_aio_context() must contend with blk_root_set_aio_ctx_commit() being invoked as part of the AioContext change propagation. This can be solved by temporarily setting blk->allow_aio_context_change to true. Future patches call blk_get_aio_context() from BlockDevOps->drained_end(), so this patch will become necessary. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20230516190238.8401-2-stefanha@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'include/hw/qdev-core.h')
0 files changed, 0 insertions, 0 deletions