mirror of https://github.com/proxmox/mirror_qemu
block: make BlockBackend->disable_request_queuing atomic
This field is accessed by multiple threads without a lock. Use explicit qatomic_read()/qatomic_set() calls. There is no need for acquire/release because blk_set_disable_request_queuing() doesn't provide any guarantees (it helps that it's used at BlockBackend creation time and not when there is I/O in flight). Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Hanna Czenczek <hreitz@redhat.com> Message-Id: <20230307210427.269214-3-stefanha@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>master
parent
c4d5bf99b7
commit
ef80ec5067
|
@ -82,7 +82,7 @@ struct BlockBackend {
|
|||
|
||||
int quiesce_counter; /* atomic: written under BQL, read by other threads */
|
||||
CoQueue queued_requests;
|
||||
bool disable_request_queuing;
|
||||
bool disable_request_queuing; /* atomic */
|
||||
|
||||
VMChangeStateEntry *vmsh;
|
||||
bool force_allow_inactivate;
|
||||
|
@ -1232,7 +1232,7 @@ void blk_set_allow_aio_context_change(BlockBackend *blk, bool allow)
|
|||
void blk_set_disable_request_queuing(BlockBackend *blk, bool disable)
|
||||
{
|
||||
IO_CODE();
|
||||
blk->disable_request_queuing = disable;
|
||||
qatomic_set(&blk->disable_request_queuing, disable);
|
||||
}
|
||||
|
||||
static int coroutine_fn GRAPH_RDLOCK
|
||||
|
@ -1271,7 +1271,8 @@ static void coroutine_fn blk_wait_while_drained(BlockBackend *blk)
|
|||
{
|
||||
assert(blk->in_flight > 0);
|
||||
|
||||
if (qatomic_read(&blk->quiesce_counter) && !blk->disable_request_queuing) {
|
||||
if (qatomic_read(&blk->quiesce_counter) &&
|
||||
!qatomic_read(&blk->disable_request_queuing)) {
|
||||
blk_dec_in_flight(blk);
|
||||
qemu_co_queue_wait(&blk->queued_requests, NULL);
|
||||
blk_inc_in_flight(blk);
|
||||
|
|
Loading…
Reference in New Issue