forked from rpms/qemu-kvm
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.6 KiB
76 lines
2.6 KiB
From ac9dc8ea241ef6d3a0447d696620d4d4053b71bf Mon Sep 17 00:00:00 2001
|
|
From: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Date: Mon, 4 Dec 2023 11:42:59 -0500
|
|
Subject: [PATCH 080/101] dma-helpers: don't lock AioContext in dma_blk_cb()
|
|
|
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
RH-MergeRequest: 214: Remove AioContext lock
|
|
RH-Jira: RHEL-15965
|
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
RH-Commit: [11/26] a8580463ba6aee4ca248c0b947b9e72bd9e87aab (kmwolf/centos-qemu-kvm)
|
|
|
|
Commit abfcd2760b3e ("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>
|
|
---
|
|
system/dma-helpers.c | 7 ++-----
|
|
1 file changed, 2 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/system/dma-helpers.c b/system/dma-helpers.c
|
|
index 36211acc7e..528117f256 100644
|
|
--- a/system/dma-helpers.c
|
|
+++ b/system/dma-helpers.c
|
|
@@ -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);
|
|
|
|
@@ -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)) {
|
|
@@ -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)
|
|
--
|
|
2.39.3
|
|
|