From: Hanna Reitz <hreitz@redhat.com>
To: Emanuele Giuseppe Esposito <eesposit@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 05/25] block/block-backend.c: assertions for block-backend
Date: Tue, 16 Nov 2021 13:29:21 +0100 [thread overview]
Message-ID: <4ecab0f2-b486-3b0a-65e6-2576e9254150@redhat.com> (raw)
In-Reply-To: <2b1cef04-8ef8-dce2-f873-c4586046d1d7@redhat.com>
On 16.11.21 11:15, Emanuele Giuseppe Esposito wrote:
>
>
> On 12/11/2021 12:01, Hanna Reitz wrote:
>> On 25.10.21 12:17, Emanuele Giuseppe Esposito wrote:
>>> All the global state (GS) API functions will check that
>>> qemu_in_main_thread() returns true. If not, it means
>>> that the safety of BQL cannot be guaranteed, and
>>> they need to be moved to I/O.
>>>
>>> Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
>>> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
>>> ---
>>> block/block-backend.c | 90
>>> +++++++++++++++++++++++++++++++++++++++++-
>>> softmmu/qdev-monitor.c | 2 +
>>> 2 files changed, 91 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/block/block-backend.c b/block/block-backend.c
>>> index 0afc03fd66..ed45576007 100644
>>> --- a/block/block-backend.c
>>> +++ b/block/block-backend.c
>>
>> [...]
>>
>>> @@ -1550,6 +1596,7 @@ BlockAIOCB *blk_aio_pwritev(BlockBackend *blk,
>>> int64_t offset,
>>> void blk_aio_cancel(BlockAIOCB *acb)
>>> {
>>> + assert(qemu_in_main_thread());
>>> bdrv_aio_cancel(acb);
>>> }
>>
>> This function is in block-backend-io.h, though.
>
> I am confused a little on the {blk/bdrv}_aio functions, namely
> blk_aio_cancel
> bdrv_aio_cancel
> blk_aio_cancel_async
> bdrv_aio_cancel_async
>
> Do you think they should be I/O? The assertion seems to hold though.
Hm, semantically I would have classified them as I/O because they don’t
modify state. I don’t have a strong opinion, though, because they don’t
actually do I/O. They just cancel other I/O requests.
Most importantly though now I see there’s a comment in bdrv_aio_cancel()
that states that “thread-safe code should use bdrv_aio_cancel_async
exclusively”, which to me implies that bdrv_aio_cancel() (and
blk_aio_cancel()) must be classified as GS, and it sounds like
bdrv_aio_cancel_async() (and blk_aio_cancel_async()) should be
classified as I/O. Looking at the AIOCBInfo.cancel_async
implementations (called by bdrv_aio_cancel_async()) I’m not sure they’re
all really thread-safe, though...? But at least bdrv_aio_cancel()
claims they should be, so...
It seems to me like the intended separation is that bdrv_aio_cancel()
should be GS and bdrv_aio_cancel_async() should be I/O. I can’t verify
that the .cancel_async implementations are really thread-safe, but
neither can I verify that blk_aio_cancel_async() is only called by BQL
callers. That the assertions hold during testing isn’t too convincing
for me, because we never wrote tests specifically to exercise these paths.
Hanna
next prev parent reply other threads:[~2021-11-16 12:30 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 [this message]
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
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=4ecab0f2-b486-3b0a-65e6-2576e9254150@redhat.com \
--to=hreitz@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=eesposit@redhat.com \
--cc=ehabkost@redhat.com \
--cc=fam@euphon.net \
--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).