From: Fiona Ebner <f.ebner@proxmox.com>
To: qemu-devel@nongnu.org
Cc: qemu-block@nongnu.org, vsementsov@yandex-team.ru,
jsnow@redhat.com, hreitz@redhat.com, kwolf@redhat.com,
pbonzini@redhat.com, t.lamprecht@proxmox.com
Subject: [PATCH 1/3] blockjob: drop AioContext lock before calling bdrv_graph_wrlock()
Date: Thu, 19 Oct 2023 15:19:34 +0200 [thread overview]
Message-ID: <20231019131936.414246-2-f.ebner@proxmox.com> (raw)
In-Reply-To: <20231019131936.414246-1-f.ebner@proxmox.com>
Same rationale as in 31b2ddfea3 ("graph-lock: Unlock the AioContext
while polling"). Otherwise, a deadlock can happen.
The alternative would be to pass a BlockDriverState along to
bdrv_graph_wrlock(), but there is no BlockDriverState readily
available and it's also better conceptually, because the lock is held
for the job.
The function is always called with the job's AioContext lock held, via
one of the .abort, .clean, .free or .prepare job driver functions.
Thus, it's safe to drop it.
While mirror_exit_common() does hold a second AioContext lock while
calling block_job_remove_all_bdrv(), that is for the main thread's
AioContext and does not need to be dropped (bdrv_graph_wrlock(bs) also
skips dropping the lock if bdrv_get_aio_context(bs) ==
qemu_get_aio_context()).
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
blockjob.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/blockjob.c b/blockjob.c
index 807f992b59..953dc1b6dc 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -198,7 +198,9 @@ void block_job_remove_all_bdrv(BlockJob *job)
* one to make sure that such a concurrent access does not attempt
* to process an already freed BdrvChild.
*/
+ aio_context_release(job->job.aio_context);
bdrv_graph_wrlock(NULL);
+ aio_context_acquire(job->job.aio_context);
while (job->nodes) {
GSList *l = job->nodes;
BdrvChild *c = l->data;
--
2.39.2
next prev parent reply other threads:[~2023-10-19 13:22 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-19 13:19 [PATCH 0/3] fix a few blockjob-related deadlocks when using iothread Fiona Ebner
2023-10-19 13:19 ` Fiona Ebner [this message]
2023-10-19 13:19 ` [PATCH 2/3] block: avoid potential deadlock during bdrv_graph_wrlock() in bdrv_close() Fiona Ebner
2023-10-19 13:19 ` [PATCH 3/3] blockdev: mirror: avoid potential deadlock when using iothread Fiona Ebner
2023-10-20 8:46 ` Fiona Ebner
2023-10-25 12:01 ` [PATCH 0/3] fix a few blockjob-related deadlocks " Kevin Wolf
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=20231019131936.414246-2-f.ebner@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=hreitz@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=t.lamprecht@proxmox.com \
--cc=vsementsov@yandex-team.ru \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).