Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
dma-helpers: don't lock AioContext in dma_blk_cb()
Commit abfcd27 ("dma-helpers: prevent dma_blk_cb() vs
dma_aio_cancel() race") acquired the AioContext lock inside dma_blk_cb()
to avoid a race with scsi_device_purge_requests() running in the main
loop thread.

The SCSI code no longer calls dma_aio_cancel() from the main loop thread
while I/O is running in the IOThread AioContext. Therefore it is no
longer necessary to take this lock to protect DMAAIOCB fields. The
->cb() function also does not require the lock because blk_aio_*() and
friends do not need the AioContext lock.

Both hw/ide/core.c and hw/ide/macio.c also call dma_blk_io() but don't
rely on it taking the AioContext lock, so this change is safe.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-ID: <20231204164259.1515217-5-stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
Stefan Hajnoczi authored and Kevin Wolf committed Dec 21, 2023
1 parent 264553e commit 1de5541
Showing 1 changed file with 2 additions and 5 deletions.
7 changes: 2 additions & 5 deletions system/dma-helpers.c
Expand Up @@ -119,13 +119,12 @@ static void dma_blk_cb(void *opaque, int ret)

trace_dma_blk_cb(dbs, ret);

aio_context_acquire(ctx);
dbs->acb = NULL;
dbs->offset += dbs->iov.size;

if (dbs->sg_cur_index == dbs->sg->nsg || ret < 0) {
dma_complete(dbs, ret);
goto out;
return;
}
dma_blk_unmap(dbs);

Expand Down Expand Up @@ -168,7 +167,7 @@ static void dma_blk_cb(void *opaque, int ret)
trace_dma_map_wait(dbs);
dbs->bh = aio_bh_new(ctx, reschedule_dma, dbs);
cpu_register_map_client(dbs->bh);
goto out;
return;
}

if (!QEMU_IS_ALIGNED(dbs->iov.size, dbs->align)) {
Expand All @@ -179,8 +178,6 @@ static void dma_blk_cb(void *opaque, int ret)
dbs->acb = dbs->io_func(dbs->offset, &dbs->iov,
dma_blk_cb, dbs, dbs->io_func_opaque);
assert(dbs->acb);
out:
aio_context_release(ctx);
}

static void dma_aio_cancel(BlockAIOCB *acb)
Expand Down

0 comments on commit 1de5541

Please sign in to comment.