* [PULL 0/1] Block patches
@ 2025-10-27 19:05 Stefan Hajnoczi
2025-10-27 19:05 ` [PULL 1/1] hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO Stefan Hajnoczi
2025-10-28 12:11 ` [PULL 0/1] Block patches Richard Henderson
0 siblings, 2 replies; 3+ messages in thread
From: Stefan Hajnoczi @ 2025-10-27 19:05 UTC (permalink / raw)
To: qemu-devel
Cc: Fam Zheng, Michael S. Tsirkin, Richard Henderson, Paolo Bonzini,
qemu-block, Stefan Hajnoczi
The following changes since commit 36076d24f04ea9dc3357c0fbe7bb14917375819c:
Merge tag 'next-pr-pull-request' of https://gitlab.com/berrange/qemu into staging (2025-10-25 10:42:55 +0200)
are available in the Git repository at:
https://gitlab.com/stefanha/qemu.git tags/block-pull-request
for you to fetch changes up to 6910f04aa646f63a0257f77201ad8ea15992b816:
hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO (2025-10-27 15:00:45 -0400)
----------------------------------------------------------------
Pull request
Fiona's virtio-scsi TMF deadlock fix.
Paolo: I merged the scsi fix in my block tree, but realize now that it belongs
to the scsi subsystem. Sorry about that, I'll be more careful next time. Please
reply if you want to handle this patch yourself.
----------------------------------------------------------------
Fiona Ebner (1):
hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO
hw/scsi/virtio-scsi.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
--
2.51.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PULL 1/1] hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO
2025-10-27 19:05 [PULL 0/1] Block patches Stefan Hajnoczi
@ 2025-10-27 19:05 ` Stefan Hajnoczi
2025-10-28 12:11 ` [PULL 0/1] Block patches Richard Henderson
1 sibling, 0 replies; 3+ messages in thread
From: Stefan Hajnoczi @ 2025-10-27 19:05 UTC (permalink / raw)
To: qemu-devel
Cc: Fam Zheng, Michael S. Tsirkin, Richard Henderson, Paolo Bonzini,
qemu-block, Fiona Ebner, Stefan Hajnoczi
From: Fiona Ebner <f.ebner@proxmox.com>
When scsi_req_dequeue() is reached via
scsi_req_cancel_async()
virtio_scsi_tmf_cancel_req()
virtio_scsi_do_tmf_aio_context(),
there is a deadlock when trying to acquire the SCSI device's requests
lock, because it was already acquired in
virtio_scsi_do_tmf_aio_context().
In particular, the issue happens with a FreeBSD guest (13, 14, 15,
maybe more), when it cancels SCSI requests, because of timeout.
This is a regression caused by commit da6eebb33b ("virtio-scsi:
perform TMFs in appropriate AioContexts") and the introduction of the
requests_lock earlier.
To fix the issue, only cancel the requests after releasing the
requests_lock. For this, the SCSI device's requests are iterated while
holding the requests_lock and the requests to be cancelled are
collected in a list. Then, the collected requests are cancelled
one by one while not holding the requests_lock. This is safe, because
only requests from the current AioContext are collected and acted
upon.
Originally reported by Proxmox VE users:
https://bugzilla.proxmox.com/show_bug.cgi?id=6810
https://forum.proxmox.com/threads/173914/
Fixes: da6eebb33b ("virtio-scsi: perform TMFs in appropriate AioContexts")
Suggested-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Message-id: 20251017094518.328905-1-f.ebner@proxmox.com
[Changed g_list_append() to g_list_prepend() to avoid traversing the
list each time.
--Stefan]
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
hw/scsi/virtio-scsi.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index d817fc42b4..93e87c459c 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -339,6 +339,7 @@ static void virtio_scsi_do_tmf_aio_context(void *opaque)
SCSIDevice *d = virtio_scsi_device_get(s, tmf->req.tmf.lun);
SCSIRequest *r;
bool match_tag;
+ g_autoptr(GList) reqs = NULL;
if (!d) {
tmf->resp.tmf.response = VIRTIO_SCSI_S_BAD_TARGET;
@@ -374,10 +375,21 @@ static void virtio_scsi_do_tmf_aio_context(void *opaque)
if (match_tag && cmd_req->req.cmd.tag != tmf->req.tmf.tag) {
continue;
}
- virtio_scsi_tmf_cancel_req(tmf, r);
+ /*
+ * Cannot cancel directly, because scsi_req_dequeue() would deadlock
+ * when attempting to acquire the request_lock a second time. Taking
+ * a reference here is paired with an unref after cancelling below.
+ */
+ scsi_req_ref(r);
+ reqs = g_list_prepend(reqs, r);
}
}
+ for (GList *elem = g_list_first(reqs); elem; elem = g_list_next(elem)) {
+ virtio_scsi_tmf_cancel_req(tmf, elem->data);
+ scsi_req_unref(elem->data);
+ }
+
/* Incremented by virtio_scsi_do_tmf() */
virtio_scsi_tmf_dec_remaining(tmf);
--
2.51.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PULL 0/1] Block patches
2025-10-27 19:05 [PULL 0/1] Block patches Stefan Hajnoczi
2025-10-27 19:05 ` [PULL 1/1] hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO Stefan Hajnoczi
@ 2025-10-28 12:11 ` Richard Henderson
1 sibling, 0 replies; 3+ messages in thread
From: Richard Henderson @ 2025-10-28 12:11 UTC (permalink / raw)
To: Stefan Hajnoczi, qemu-devel
Cc: Fam Zheng, Michael S. Tsirkin, Paolo Bonzini, qemu-block
On 10/27/25 20:05, Stefan Hajnoczi wrote:
> The following changes since commit 36076d24f04ea9dc3357c0fbe7bb14917375819c:
>
> Merge tag 'next-pr-pull-request' ofhttps://gitlab.com/berrange/qemu into staging (2025-10-25 10:42:55 +0200)
>
> are available in the Git repository at:
>
> https://gitlab.com/stefanha/qemu.git tags/block-pull-request
>
> for you to fetch changes up to 6910f04aa646f63a0257f77201ad8ea15992b816:
>
> hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO (2025-10-27 15:00:45 -0400)
>
> ----------------------------------------------------------------
> Pull request
>
> Fiona's virtio-scsi TMF deadlock fix.
>
> Paolo: I merged the scsi fix in my block tree, but realize now that it belongs
> to the scsi subsystem. Sorry about that, I'll be more careful next time. Please
> reply if you want to handle this patch yourself.
Applied, thanks. Please update https://wiki.qemu.org/ChangeLog/10.2 as appropriate.
r~
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-10-28 12:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-27 19:05 [PULL 0/1] Block patches Stefan Hajnoczi
2025-10-27 19:05 ` [PULL 1/1] hw/scsi: avoid deadlock upon TMF request cancelling with VirtIO Stefan Hajnoczi
2025-10-28 12:11 ` [PULL 0/1] Block patches Richard Henderson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).