qemu-cr16/hw/virtio
German Maglione 1ba9a52203 vhost-user: make vhost_set_vring_file() synchronous
QEMU sends all of VHOST_USER_SET_VRING_KICK, _CALL, and _ERR without
setting the NEED_REPLY flag, i.e. by the time the respective
vhost_user_set_vring_*() function returns, it is completely up to chance
whether the back-end has already processed the request and switched over
to the new FD for interrupts.

At least for vhost_user_set_vring_call(), that is a problem: It is
called through vhost_virtqueue_mask(), which is generally used in the
VirtioDeviceClass.guest_notifier_mask() implementation, which is in turn
called by virtio_pci_one_vector_unmask().  The fact that we do not wait
for the back-end to install the FD leads to a race there:

Masking interrupts is implemented by redirecting interrupts to an
internal event FD that is not connected to the guest.  Unmasking then
re-installs the guest-connected IRQ FD, then checks if there are pending
interrupts left on the masked event FD, and if so, issues an interrupt
to the guest.

Because guest_notifier_mask() (through vhost_user_set_vring_call())
doesn't wait for the back-end to switch over to the actual IRQ FD, it's
possible we check for pending interrupts while the back-end is still
using the masked event FD, and then we will lose interrupts that occur
before the back-end finally does switch over.

Fix this by setting NEED_REPLY on those VHOST_USER_SET_VRING_* messages,
so when we get that reply, we know that the back-end is now using the
new FD.

We have a few reports of a virtiofs mount hanging:
- https://gitlab.com/virtio-fs/virtiofsd/-/issues/101
- https://gitlab.com/virtio-fs/virtiofsd/-/issues/133
- https://gitlab.com/virtio-fs/virtiofsd/-/issues/213

This is quite difficult bug to reproduce, even for the reporters.
It only happens on production, every few weeks, and/or on 1 in 300 VMs.
So, we are not 100% sure this fixes that issue. However, we think this
is still a bug, and at least we have one report that claims this fixed
the issue:

https://gitlab.com/virtio-fs/virtiofsd/-/issues/133#note_2743209419

Fixes: 5f6f6664bf ("Add vhost-user as a vhost backend.")
Signed-off-by: German Maglione <gmaglione@redhat.com>
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
Reviewed-by: Eugenio Pérez <eperezma@redhat.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Message-Id: <20251022162405.318672-1-gmaglione@redhat.com>
2025-11-09 08:24:29 -05:00
..
cbor-helpers.c device/virtio-nsm: Support for Nitro Secure Module device 2024-10-31 18:28:32 +01:00
iothread-vq-mapping.c virtio: extract iothread-vq-mapping.h API 2025-03-13 17:57:23 +01:00
Kconfig hw/virtio: rename vhost-user-device and make user creatable 2025-10-05 09:01:08 -04:00
meson.build hw/virtio: Compile virtio-mem.c once 2025-10-21 20:09:56 +02:00
trace-events virtio: unify virtio_notify_irqfd() and virtio_notify() 2025-10-05 09:01:08 -04:00
trace.h
vdpa-dev-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vdpa-dev.c vdpa-dev: add get_vhost() callback for vhost-vdpa device 2025-10-05 16:13:02 -04:00
vhost-backend.c vhost-backend: implement extended features support 2025-10-04 10:50:37 -04:00
vhost-iova-tree.c vhost-iova-tree: Update documentation 2025-02-21 07:18:42 -05:00
vhost-iova-tree.h include/system: Move exec/memory.h to system/memory.h 2025-04-23 14:08:21 -07:00
vhost-scsi-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-shadow-virtqueue.c vdpa: Fix endian bugs in shadow virtqueue 2025-02-21 07:18:42 -05:00
vhost-shadow-virtqueue.h vhost-iova-tree, svq: Implement GPA->IOVA & partial IOVA->HVA trees 2025-02-21 07:18:42 -05:00
vhost-stub.c char: rename CharBackend->CharFrontend 2025-10-28 14:49:52 +01:00
vhost-user-base.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
vhost-user-blk-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-fs-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-fs.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
vhost-user-gpio-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-gpio.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-i2c-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-i2c.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-input-pci.c hw/virtio: derive vhost-user-input from vhost-user-base 2024-02-14 06:09:32 -05:00
vhost-user-input.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-rng-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-rng.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-scmi-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-scmi.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
vhost-user-scsi-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-snd-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-snd.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-test-device-pci.c hw/virtio: rename vhost-user-device and make user creatable 2025-10-05 09:01:08 -04:00
vhost-user-test-device.c hw/virtio: rename vhost-user-device and make user creatable 2025-10-05 09:01:08 -04:00
vhost-user-vsock-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-user-vsock.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
vhost-user.c vhost-user: make vhost_set_vring_file() synchronous 2025-11-09 08:24:29 -05:00
vhost-vdpa.c vfio: return mr from vfio_get_xlat_addr 2025-06-05 10:40:38 +02:00
vhost-vsock-common.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
vhost-vsock-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
vhost-vsock.c treewide: use qemu_set_blocking instead of g_unix_set_fd_nonblocking 2025-09-19 12:46:07 +01:00
vhost.c hw/virtio/vhost: Replace legacy cpu_physical_memory_*map() calls 2025-10-07 05:03:56 +02:00
virtio-9p-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-acpi.c license: Update deprecated SPDX tag GPL-2.0+ to GPL-2.0-or-later 2024-09-20 10:11:59 +03:00
virtio-balloon-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-balloon.c system/ramblock: Move ram_block_discard_*_range() declarations 2025-10-07 03:37:03 +02:00
virtio-blk-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-bus.c virtio: add support for negotiating extended features 2025-10-04 10:50:37 -04:00
virtio-config-io.c hw/virtio: Build various files once 2025-07-15 02:56:39 -04:00
virtio-crypto-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-crypto.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
virtio-hmp-cmds.c qmp: update virtio features map to support extended features 2025-10-04 10:50:37 -04:00
virtio-input-host-pci.c hw/virtio: move virtio-pci.h into shared include space 2022-05-16 04:38:40 -04:00
virtio-input-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-iommu-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-iommu.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
virtio-md-pci.c qom: Make InterfaceInfo[] uses const 2025-04-25 17:00:41 +02:00
virtio-md-stubs.c hw/virtio: move stubs out of stubs/ 2024-04-18 11:17:27 +02:00
virtio-mem-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-mem-pci.h virtio-md-pci: New parent type for virtio-mem-pci and virtio-pmem-pci 2023-07-12 09:27:25 +02:00
virtio-mem.c hw/virtio/virtio-mem: Convert VIRTIO_MEM_HAS_LEGACY_GUESTS to runtime 2025-10-21 20:09:56 +02:00
virtio-mmio.c migration: Fix regression of passing error_fatal into vmstate_load_state() 2025-11-03 16:04:10 -05:00
virtio-net-pci.c virtio-net: Implement SR-IOV VF 2025-05-14 05:39:14 -04:00
virtio-nsm-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-nsm.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-pci.c migration: Fix regression of passing error_fatal into vmstate_load_state() 2025-11-03 16:04:10 -05:00
virtio-pmem-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-pmem-pci.h virtio-md-pci: New parent type for virtio-mem-pci and virtio-pmem-pci 2023-07-12 09:27:25 +02:00
virtio-pmem.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-qmp.c qmp: update virtio features map to support extended features 2025-10-04 10:50:37 -04:00
virtio-qmp.h qmp: update virtio features map to support extended features 2025-10-04 10:50:37 -04:00
virtio-rng-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-rng.c vhost-user: return failure if backend crash when live migration 2025-05-14 05:39:15 -04:00
virtio-scsi-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-serial-pci.c qom: Have class_init() take a const data argument 2025-04-25 17:00:41 +02:00
virtio-stub.c qmp: add QMP command x-query-virtio-queue-element 2022-10-09 16:38:45 -04:00
virtio.c migration: Fix regression of passing error_fatal into vmstate_load_state() 2025-11-03 16:04:10 -05:00