From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
To: Hanna Reitz <hreitz@redhat.com>, qemu-block@nongnu.org
Cc: "Kevin Wolf" <kwolf@redhat.com>, "Fam Zheng" <fam@euphon.net>,
"Vladimir Sementsov-Ogievskiy" <vsementsov@virtuozzo.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Eduardo Habkost" <ehabkost@redhat.com>,
"Juan Quintela" <quintela@redhat.com>,
qemu-devel@nongnu.org, "John Snow" <jsnow@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Markus Armbruster" <armbru@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
"Stefan Hajnoczi" <stefanha@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Eric Blake" <eblake@redhat.com>
Subject: Re: [PATCH v4 20/25] block_int-common.h: assertion in the callers of BlockDriver function pointers
Date: Wed, 17 Nov 2021 14:09:51 +0100 [thread overview]
Message-ID: <e3788cbf-0fb2-c47c-6da5-bc7830f26e03@redhat.com> (raw)
In-Reply-To: <01dabd9f-9443-2482-431d-51055f99885d@redhat.com>
On 17/11/2021 13:51, Hanna Reitz wrote:
> On 17.11.21 12:33, Emanuele Giuseppe Esposito wrote:
>>
>>
>> On 15/11/2021 13:48, Hanna Reitz wrote:
>>> On 25.10.21 12:17, Emanuele Giuseppe Esposito wrote:
>>>> Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
>>>> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
>>>> ---
>>>> block.c | 17 +++++++++++++++++
>>>> 1 file changed, 17 insertions(+)
>>>>
>>>> diff --git a/block.c b/block.c
>>>> index 94bff5c757..40c4729b8d 100644
>>>> --- a/block.c
>>>> +++ b/block.c
>>>
>>> [...]
>>>
>>>> @@ -2148,6 +2152,7 @@ static void bdrv_child_perm(BlockDriverState
>>>> *bs, BlockDriverState *child_bs,
>>>> uint64_t *nperm, uint64_t *nshared)
>>>> {
>>>> assert(bs->drv && bs->drv->bdrv_child_perm);
>>>> + assert(qemu_in_main_thread());
>>>> bs->drv->bdrv_child_perm(bs, c, role, reopen_queue,
>>>> parent_perm, parent_shared,
>>>> nperm, nshared);
>>>
>>> (Should’ve noticed earlier, but only did now...)
>>>
>>> First, this function is indirectly called by bdrv_refresh_perms(). I
>>> understand that all perm-related functions are classified as GS.
>>>
>>> However, bdrv_co_invalidate_cache() invokes bdrv_refresh_perms. Being
>>> declared in block/coroutine.h, it’s an I/O function, so it mustn’t
>>> call such a GS function. BlockDriver.bdrv_co_invalidate_cache(),
>>> bdrv_invalidate_cache(), and blk_invalidate_cache() are also
>>> classified as I/O functions. Perhaps all of these functions should be
>>> classified as GS functions? I believe their callers and their
>>> purpose would allow for this.
>>
>> I think that the *_invalidate_cache functions are I/O.
>> First of all, test-block-iothread.c calls bdrv_invalidate_cache in
>> test_sync_op_invalidate_cache, which is purposefully called in an
>> iothread. So that hints that we want it as I/O.
>
> Hm, OK, but bdrv_co_invalidate_cache() calls bdrv_refresh_perms(), which
> is a GS function, so that shouldn’t work, right?
Ok let's take a step back for one moment: can you tell me why the perm
functions should be GS?
On one side I see they are also used by I/O, as we can see above. On the
other side, I kinda see that permission should only be modified under
BQL. But I don't have any valid point to sustain that.
So I wonder if you have any specific and more valid reason to put them
as GS.
Maybe clarifying this will help finding a clean solution to this problem.
>
>> (Small mistake I just noticed: blk_invalidate_cache has the BQL
>> assertion even though it is rightly put in block-backend-io.h
>>
>>>
>>> Second, it’s called by bdrv_child_refresh_perms(), which is called by
>>> block_crypto_amend_options_generic_luks(). This function is called
>>> by block_crypto_co_amend_luks(), which is a BlockDriver.bdrv_co_amend
>>> implementation, which is classified as an I/O function.
>>>
>>> Honestly, I don’t know how to fix that mess. The best would be if we
>>> could make the perm functions thread-safe and classify them as I/O,
>>> but it seems to me like that’s impossible (I sure hope I’m wrong). On
>>> the other hand, .bdrv_co_amend very much strikes me like a GS
>>> function, but it isn’t. I’m afraid it must work on nodes that are
>>> not in the main context, and it launches a job, so AFAIU we
>>> absolutely cannot run it under the BQL.
>>>
>>> It almost seems to me like we’d need a thread-safe variant of the
>>> perm functions that’s allowed to fail when it cannot guarantee thread
>>> safety or something. Or perhaps I’m wrong and the perm functions can
>>> actually be classified as thread-safe and I/O, that’d be great…
>>
>> I think that since we are currently only splitting and not taking care
>> of the actual I/O thread safety, we can move the _perm functions in
>> I/O, and add a nice TODO to double check their thread safety.
>
> :/
>
> I would really, really like to avoid that unless it’s clear that we can
> make them thread-safe, or that there’s a way to take the BQL in I/O
> functions to call GS functions. But the latter still wouldn’t make the
> perm functions I/O functions. At most, I’d sort them under common
> functions.
>
>> I mean, if they are not thread-safe after the split it means they are
>> not thread safe also right now.
>
> Yes, sorry I wasn’t clear, I think there’s a pre-existing problem that
> your series only unveils. I don’t know whether it has implications in
> practice yet.
>
> Hanna
>
next prev parent reply other threads:[~2021-11-17 13:22 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-25 10:17 [PATCH v4 00/25] block layer: split block APIs in global state and I/O Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 01/25] main-loop.h: introduce qemu_in_main_thread() Emanuele Giuseppe Esposito
2021-10-25 11:33 ` Philippe Mathieu-Daudé
2021-10-25 10:17 ` [PATCH v4 02/25] include/block/block: split header into I/O and global state API Emanuele Giuseppe Esposito
2021-10-25 11:37 ` Philippe Mathieu-Daudé
2021-10-25 12:22 ` Emanuele Giuseppe Esposito
2021-11-11 15:00 ` Hanna Reitz
2021-11-15 12:08 ` Emanuele Giuseppe Esposito
2021-11-12 12:25 ` Hanna Reitz
2021-11-16 14:00 ` Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 03/25] assertions for block " Emanuele Giuseppe Esposito
2021-11-11 16:32 ` Hanna Reitz
2021-11-15 12:27 ` Emanuele Giuseppe Esposito
2021-11-15 15:27 ` Hanna Reitz
2021-11-12 11:31 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 04/25] include/sysemu/block-backend: split header into I/O and global state (GS) API Emanuele Giuseppe Esposito
2021-11-12 10:23 ` Hanna Reitz
2021-11-16 10:16 ` Emanuele Giuseppe Esposito
2021-11-12 12:30 ` Hanna Reitz
2021-11-16 14:24 ` Emanuele Giuseppe Esposito
2021-11-16 15:07 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 05/25] block/block-backend.c: assertions for block-backend Emanuele Giuseppe Esposito
2021-11-12 11:01 ` Hanna Reitz
2021-11-16 10:15 ` Emanuele Giuseppe Esposito
2021-11-16 12:29 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 06/25] include/block/block_int: split header into I/O and global state API Emanuele Giuseppe Esposito
2021-11-12 12:17 ` Hanna Reitz
2021-11-16 10:24 ` Emanuele Giuseppe Esposito
2021-11-16 12:30 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 07/25] assertions for block_int " Emanuele Giuseppe Esposito
2021-11-12 13:51 ` Hanna Reitz
2021-11-16 15:43 ` Emanuele Giuseppe Esposito
2021-11-16 16:46 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 08/25] block: introduce assert_bdrv_graph_writable Emanuele Giuseppe Esposito
2021-11-12 14:40 ` Hanna Reitz
2021-11-18 9:55 ` Emanuele Giuseppe Esposito
2021-11-18 10:24 ` Emanuele Giuseppe Esposito
2021-11-18 15:17 ` Hanna Reitz
2021-11-19 8:55 ` Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 09/25] include/block/blockjob_int.h: split header into I/O and GS API Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 10/25] assertions for blockjob_int.h Emanuele Giuseppe Esposito
2021-11-12 15:17 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 11/25] include/block/blockjob.h: global state API Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 12/25] assertions for blockob.h " Emanuele Giuseppe Esposito
2021-11-12 15:26 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 13/25] include/sysemu/blockdev.h: move drive_add and inline drive_def Emanuele Giuseppe Esposito
2021-11-12 15:41 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 14/25] include/systemu/blockdev.h: global state API Emanuele Giuseppe Esposito
2021-10-28 15:48 ` Stefan Hajnoczi
2021-11-12 15:46 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 15/25] assertions for blockdev.h " Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 16/25] include/block/snapshot: global state API + assertions Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 17/25] block/copy-before-write.h: " Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 18/25] block/coroutines: I/O API Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 19/25] block_int-common.h: split function pointers in BlockDriver Emanuele Giuseppe Esposito
2021-11-15 12:00 ` Hanna Reitz
2021-11-18 12:42 ` Emanuele Giuseppe Esposito
2021-10-25 10:17 ` [PATCH v4 20/25] block_int-common.h: assertion in the callers of BlockDriver function pointers Emanuele Giuseppe Esposito
2021-11-15 12:48 ` Hanna Reitz
2021-11-15 14:15 ` Hanna Reitz
2021-11-17 11:33 ` Emanuele Giuseppe Esposito
2021-11-17 12:51 ` Hanna Reitz
2021-11-17 13:09 ` Emanuele Giuseppe Esposito [this message]
2021-11-17 13:34 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 21/25] block_int-common.h: split function pointers in BdrvChildClass Emanuele Giuseppe Esposito
2021-11-15 14:36 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 22/25] block_int-common.h: assertions in the callers of BdrvChildClass function pointers Emanuele Giuseppe Esposito
2021-11-15 14:48 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 23/25] block-backend-common.h: split function pointers in BlockDevOps Emanuele Giuseppe Esposito
2021-10-25 14:10 ` Philippe Mathieu-Daudé
2021-10-25 10:17 ` [PATCH v4 24/25] job.h: split function pointers in JobDriver Emanuele Giuseppe Esposito
2021-11-15 15:11 ` Hanna Reitz
2021-11-17 13:43 ` Emanuele Giuseppe Esposito
2021-11-17 13:44 ` Hanna Reitz
2021-10-25 10:17 ` [PATCH v4 25/25] job.h: assertions in the callers of JobDriver funcion pointers Emanuele Giuseppe Esposito
2021-10-25 14:09 ` [PATCH v4 00/25] block layer: split block APIs in global state and I/O Philippe Mathieu-Daudé
2021-10-28 15:45 ` Stefan Hajnoczi
2021-10-28 15:49 ` Stefan Hajnoczi
2021-11-15 16:03 ` Hanna Reitz
2021-11-15 16:11 ` Daniel P. Berrangé
2021-11-18 13:50 ` Paolo Bonzini
2021-11-18 15:31 ` Hanna Reitz
2021-11-19 3:13 ` Paolo Bonzini
2021-11-19 10:42 ` Emanuele Giuseppe Esposito
2021-11-18 14:04 ` Paolo Bonzini
2021-11-18 15:22 ` Hanna Reitz
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=e3788cbf-0fb2-c47c-6da5-bc7830f26e03@redhat.com \
--to=eesposit@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=fam@euphon.net \
--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=quintela@redhat.com \
--cc=richard.henderson@linaro.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@virtuozzo.com \
/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).