On Mon, Apr 19, 2021 at 10:55:35AM +0200, Emanuele Giuseppe Esposito wrote: > For simplicity, use bdrv_drained_begin/end to avoid concurrent > writes to the write threshold, or reading it while it is being set. > qmp_block_set_write_threshold is protected by the BQL. > > Reviewed-by: Stefan Hajnoczi > Co-developed-by: Paolo Bonzini > Signed-off-by: Emanuele Giuseppe Esposito > --- > block/write-threshold.c | 9 +++------ > 1 file changed, 3 insertions(+), 6 deletions(-) > > diff --git a/block/write-threshold.c b/block/write-threshold.c > index 63040fa4f2..77c74bdaa7 100644 > --- a/block/write-threshold.c > +++ b/block/write-threshold.c > @@ -111,7 +111,6 @@ void qmp_block_set_write_threshold(const char *node_name, > Error **errp) > { > BlockDriverState *bs; > - AioContext *aio_context; > > bs = bdrv_find_node(node_name); > if (!bs) { > @@ -119,10 +118,8 @@ void qmp_block_set_write_threshold(const char *node_name, > return; > } > > - aio_context = bdrv_get_aio_context(bs); > - aio_context_acquire(aio_context); > - > + /* Avoid a concurrent write_threshold_disable. */ > + bdrv_drained_begin(bs); Is there documentation that says it's safe to call bdrv_drained_begin(bs) without the AioContext acquired? AIO_WAIT_WHILE() contradicts this: The caller's thread must be the IOThread that owns @ctx or the main loop thread (with @ctx acquired exactly once). ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^