Re: [PATCH 1/2] virtio-mmio: synchronize callbacks during device reset
From: "Michael S. Tsirkin" <mst@redhat.com>
Date: 2026-09-03 11:55:59
Also in:
lkml, virtualization
On Tue, Aug 18, 2026 at 06:04:32AM +0200, Karl Mehltretter wrote:
virtio_reset_device() promises that vq callbacks are not in progress
once it returns, but vm_reset() only writes 0 to the status register.
A callback that has already entered vring_interrupt() keeps running
while the driver tears down the state it uses.
Wait for a status read to return 0, so the device has stopped raising
interrupts, then synchronize_irq() as vp_reset() does with
vp_synchronize_vectors().
Fixes: edfd52e63672 ("virtio: Add platform bus driver for memory mapped virtio device")
Assisted-by: Claude:claude-fable-5
Signed-off-by: Karl Mehltretter <redacted>I htink we should instead drop vp_synchronize_vectors from vp_reset and instead call virtio_synchronize_cbs from virtio_reset_device.
quoted hunk ↗ jump to hunk
--- drivers/virtio/virtio_mmio.c | 6 ++++++ 1 file changed, 6 insertions(+)diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c index 510b7c4efdff8..a2ca03dbe803d 100644 --- a/drivers/virtio/virtio_mmio.c +++ b/drivers/virtio/virtio_mmio.c@@ -55,6 +55,7 @@ #define pr_fmt(fmt) "virtio-mmio: " fmt #include <linux/acpi.h> +#include <linux/delay.h> #include <linux/dma-mapping.h> #include <linux/highmem.h> #include <linux/interrupt.h>@@ -254,6 +255,11 @@ static void vm_reset(struct virtio_device *vdev) /* 0 status means a reset. */ writel(0, vm_dev->base + VIRTIO_MMIO_STATUS); + + /* Wait for reset completion before flushing callbacks. */ + while (vm_get_status(vdev)) + fsleep(1000);
only needed for v3 and up
+ synchronize_irq(platform_get_irq(vm_dev->pdev, 0));
} -- 2.53.0