* [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).