Re: [PATCH 1/2] virtio-mmio: synchronize callbacks during device reset
From: "Michael S. Tsirkin" <mst@redhat.com>
Date: 2026-09-03 11:28:58
Also in:
lkml, virtualization
On Tue, Aug 18, 2026 at 06:04:32AM +0200, Karl Mehltretter wrote:
quoted hunk ↗ jump to hunk
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> --- 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);
this is only required for transport version 3.
+ synchronize_irq(platform_get_irq(vm_dev->pdev, 0)); } -- 2.53.0