From: Kevin Wolf <kwolf@redhat.com>
To: Fiona Ebner <f.ebner@proxmox.com>
Cc: qemu-block@nongnu.org, qemu-devel@nongnu.org, den@virtuozzo.com,
andrey.drobyshev@virtuozzo.com, hreitz@redhat.com,
stefanha@redhat.com, eblake@redhat.com, jsnow@redhat.com,
vsementsov@yandex-team.ru
Subject: Re: [PATCH 02/11] block: move drain outside of read-locked bdrv_reopen_queue_child()
Date: Wed, 14 May 2025 18:36:01 +0200 [thread overview]
Message-ID: <aCTGceRCQ4bywHx5@redhat.com> (raw)
In-Reply-To: <20250508140936.3344485-3-f.ebner@proxmox.com>
Am 08.05.2025 um 16:09 hat Fiona Ebner geschrieben:
> This is in preparation to mark bdrv_drained_begin() as GRAPH_UNLOCKED.
>
> More granular draining is not trivially possible, because
> bdrv_reopen_queue_child() can recursively call itself.
Yeah, we would have to collect the affected nodes first and only then do
whatever the draining is needed for. And consider that draining could
invalidate the list of nodes so that we would have to start over...
Draining only selectively was probably premature optimisation anyway.
> Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
> ---
> block.c | 24 +++++++++++++++---------
> 1 file changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/block.c b/block.c
> index 33f78dbe1c..0085dbfa74 100644
> --- a/block.c
> +++ b/block.c
> @@ -4358,7 +4358,7 @@ bdrv_recurse_has_child(BlockDriverState *bs, BlockDriverState *child)
> * returns a pointer to bs_queue, which is either the newly allocated
> * bs_queue, or the existing bs_queue being used.
> *
> - * bs is drained here and undrained by bdrv_reopen_queue_free().
> + * bs needs to be drained
> */
> static BlockReopenQueue * GRAPH_RDLOCK
> bdrv_reopen_queue_child(BlockReopenQueue *bs_queue, BlockDriverState *bs,
> @@ -4368,6 +4368,7 @@ bdrv_reopen_queue_child(BlockReopenQueue *bs_queue, BlockDriverState *bs,
> bool keep_old_opts)
> {
> assert(bs != NULL);
> + assert(qatomic_read(&bs->quiesce_counter) > 0);
BlockDriverState.quiesce_counter isn't accessed with atomics elsewhere.
Did you confuse it with BlockBackend.quiesce_counter?
>
> BlockReopenQueueEntry *bs_entry;
> BdrvChild *child;
> @@ -4377,13 +4378,6 @@ bdrv_reopen_queue_child(BlockReopenQueue *bs_queue, BlockDriverState *bs,
>
> GLOBAL_STATE_CODE();
>
> - /*
> - * Strictly speaking, draining is illegal under GRAPH_RDLOCK. We know that
> - * we've been called with bdrv_graph_rdlock_main_loop(), though, so it's ok
> - * in practice.
> - */
> - bdrv_drained_begin(bs);
> -
> if (bs_queue == NULL) {
> bs_queue = g_new0(BlockReopenQueue, 1);
> QTAILQ_INIT(bs_queue);
> @@ -4522,6 +4516,14 @@ BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
> QDict *options, bool keep_old_opts)
> {
> GLOBAL_STATE_CODE();
> +
> + if (bs_queue == NULL) {
> + /*
> + * paired with bdrv_drain_all_end() in bdrv_reopen_queue_free().
> + */
> + bdrv_drain_all_begin();
Having this comment is a good idea. It fits on a single line, though.
> + }
> +
> GRAPH_RDLOCK_GUARD_MAINLOOP();
>
> return bdrv_reopen_queue_child(bs_queue, bs, options, NULL, 0, false,
> @@ -4534,12 +4536,16 @@ void bdrv_reopen_queue_free(BlockReopenQueue *bs_queue)
> if (bs_queue) {
> BlockReopenQueueEntry *bs_entry, *next;
> QTAILQ_FOREACH_SAFE(bs_entry, bs_queue, entry, next) {
> - bdrv_drained_end(bs_entry->state.bs);
> qobject_unref(bs_entry->state.explicit_options);
> qobject_unref(bs_entry->state.options);
> g_free(bs_entry);
> }
> g_free(bs_queue);
> +
> + /*
> + * paired with bdrv_drain_all_begin() in bdrv_reopen_queue().
> + */
> + bdrv_drain_all_end();
This could be a single line comment, too.
Kevin
next prev parent reply other threads:[~2025-05-14 16:45 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-08 14:09 [RFC 00/11] do not drain while holding the graph lock Fiona Ebner
2025-05-08 14:09 ` [PATCH 01/11] block: remove outdated comments about AioContext locking Fiona Ebner
2025-05-14 16:22 ` Kevin Wolf
2025-05-08 14:09 ` [PATCH 02/11] block: move drain outside of read-locked bdrv_reopen_queue_child() Fiona Ebner
2025-05-14 16:36 ` Kevin Wolf [this message]
2025-05-15 11:48 ` Fiona Ebner
2025-05-15 12:28 ` Kevin Wolf
2025-05-15 13:41 ` Fiona Ebner
2025-05-08 14:09 ` [PATCH 03/11] block/snapshot: move drain outside of read-locked bdrv_snapshot_delete() Fiona Ebner
2025-05-14 16:52 ` Kevin Wolf
2025-05-15 12:03 ` Fiona Ebner
2025-05-08 14:09 ` [PATCH 04/11] block: drain while unlocked in bdrv_reopen_parse_file_or_backing() Fiona Ebner
2025-05-14 16:59 ` Kevin Wolf
2025-05-08 14:09 ` [PATCH 05/11] block: move drain outside of read-locked bdrv_inactivate_recurse() Fiona Ebner
2025-05-14 17:06 ` Kevin Wolf
2025-05-08 14:09 ` [PATCH 06/11] blockdev: drain while unlocked in internal_snapshot_action() Fiona Ebner
2025-05-14 17:26 ` Kevin Wolf
2025-05-19 12:37 ` Fiona Ebner
2025-05-08 14:09 ` [PATCH 07/11] blockdev: drain while unlocked in external_snapshot_action() Fiona Ebner
2025-05-08 14:09 ` [PATCH 08/11] block: mark bdrv_drained_begin() as GRAPH_UNLOCKED Fiona Ebner
2025-05-14 17:50 ` Kevin Wolf
2025-05-08 14:09 ` [PATCH 09/11] block: move drain out of bdrv_change_aio_context() Fiona Ebner
2025-05-14 19:45 ` Kevin Wolf
2025-05-08 14:09 ` [PATCH 10/11] block/graph-lock: add drain flag to bdrv_graph_wr{, un}lock Fiona Ebner
2025-05-14 19:54 ` [PATCH 10/11] block/graph-lock: add drain flag to bdrv_graph_wr{,un}lock Kevin Wolf
2025-05-19 12:10 ` Fiona Ebner
2025-05-20 6:09 ` Fiona Ebner
2025-05-20 8:42 ` Kevin Wolf
2025-05-08 14:09 ` [PATCH 11/11] iotests/graph-changes-while-io: add test case with removal of lower snapshot Fiona Ebner
2025-05-14 20:14 ` 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=aCTGceRCQ4bywHx5@redhat.com \
--to=kwolf@redhat.com \
--cc=andrey.drobyshev@virtuozzo.com \
--cc=den@virtuozzo.com \
--cc=eblake@redhat.com \
--cc=f.ebner@proxmox.com \
--cc=hreitz@redhat.com \
--cc=jsnow@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.