Message ID | 20230425173158.574203-16-kwolf@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Graph locking, part 3 (more block drivers) | expand |
On Tue, Apr 25, 2023 at 07:31:53PM +0200, Kevin Wolf wrote: > From: Emanuele Giuseppe Esposito <eesposit@redhat.com> > > This adds GRAPH_RDLOCK annotations to declare that callers of > bdrv_co_debug_event() need to hold a reader lock for the graph. > > Unfortunately we cannot use a co_wrapper_bdrv_rdlock, because the > function is called by mixed functions that run both in coroutine and > non-coroutine context (for example blkdebug_open). Is this statement still true after 8/20? > > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> > Signed-off-by: Kevin Wolf <kwolf@redhat.com> > --- > include/block/block-io.h | 9 +++++---- > include/block/block_int-common.h | 4 ++-- > block.c | 2 ++ > 3 files changed, 9 insertions(+), 6 deletions(-) Reviewed-by: Eric Blake <eblake@redhat.com>
On Tue, Apr 25, 2023 at 07:31:53PM +0200, Kevin Wolf wrote: > From: Emanuele Giuseppe Esposito <eesposit@redhat.com> > > This adds GRAPH_RDLOCK annotations to declare that callers of > bdrv_co_debug_event() need to hold a reader lock for the graph. > > Unfortunately we cannot use a co_wrapper_bdrv_rdlock, because the > function is called by mixed functions that run both in coroutine and > non-coroutine context (for example blkdebug_open). > > Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com> > Signed-off-by: Kevin Wolf <kwolf@redhat.com> > --- > include/block/block-io.h | 9 +++++---- > include/block/block_int-common.h | 4 ++-- > block.c | 2 ++ > 3 files changed, 9 insertions(+), 6 deletions(-) Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Am 25.04.2023 um 23:14 hat Eric Blake geschrieben: > On Tue, Apr 25, 2023 at 07:31:53PM +0200, Kevin Wolf wrote: > > From: Emanuele Giuseppe Esposito <eesposit@redhat.com> > > > > This adds GRAPH_RDLOCK annotations to declare that callers of > > bdrv_co_debug_event() need to hold a reader lock for the graph. > > > > Unfortunately we cannot use a co_wrapper_bdrv_rdlock, because the > > function is called by mixed functions that run both in coroutine and > > non-coroutine context (for example blkdebug_open). > > Is this statement still true after 8/20? You're right, 8/20 is newer than this commit message and actually made the example wrong. The problem still exists, though. I'll point to the qcow2 cluster/refcount functions instead, which are still mixed. Kevin
diff --git a/include/block/block-io.h b/include/block/block-io.h index bba7f957e1..1f612ec5bd 100644 --- a/include/block/block-io.h +++ b/include/block/block-io.h @@ -205,10 +205,11 @@ void *qemu_try_blockalign0(BlockDriverState *bs, size_t size); void bdrv_enable_copy_on_read(BlockDriverState *bs); void bdrv_disable_copy_on_read(BlockDriverState *bs); -void coroutine_fn bdrv_co_debug_event(BlockDriverState *bs, - BlkdebugEvent event); -void co_wrapper_mixed bdrv_debug_event(BlockDriverState *bs, - BlkdebugEvent event); +void coroutine_fn GRAPH_RDLOCK +bdrv_co_debug_event(BlockDriverState *bs, BlkdebugEvent event); + +void co_wrapper_mixed_bdrv_rdlock +bdrv_debug_event(BlockDriverState *bs, BlkdebugEvent event); #define BLKDBG_EVENT(child, evt) \ do { \ diff --git a/include/block/block_int-common.h b/include/block/block_int-common.h index ee77903f72..88ce7f9d9e 100644 --- a/include/block/block_int-common.h +++ b/include/block/block_int-common.h @@ -735,8 +735,8 @@ struct BlockDriver { int coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_check)( BlockDriverState *bs, BdrvCheckResult *result, BdrvCheckMode fix); - void coroutine_fn (*bdrv_co_debug_event)(BlockDriverState *bs, - BlkdebugEvent event); + void coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_debug_event)( + BlockDriverState *bs, BlkdebugEvent event); /* io queue for linux-aio */ void coroutine_fn GRAPH_RDLOCK_PTR (*bdrv_co_io_plug)(BlockDriverState *bs); diff --git a/block.c b/block.c index a6deaf8ad1..1bc766c778 100644 --- a/block.c +++ b/block.c @@ -6399,6 +6399,8 @@ BlockStatsSpecific *bdrv_get_specific_stats(BlockDriverState *bs) void coroutine_fn bdrv_co_debug_event(BlockDriverState *bs, BlkdebugEvent event) { IO_CODE(); + assert_bdrv_graph_readable(); + if (!bs || !bs->drv || !bs->drv->bdrv_co_debug_event) { return; }