summaryrefslogtreecommitdiff
path: root/arch/um/drivers
diff options
context:
space:
mode:
authorBenjamin Berg <benjamin.berg@intel.com>2026-05-05 14:43:18 +0200
committerJohannes Berg <johannes.berg@intel.com>2026-09-24 16:29:21 +0200
commit6b2742ff43b4a1c344f132bed45599a06da311de (patch)
tree58c18ffe6d3b13e9f809abd43ba54dc7ba12e978 /arch/um/drivers
parent5b5df6678080e4852f9e56e13fe0988c82ac8a1b (diff)
um: virtio-pci: free the IRQ message buffers
These buffers are allocated when initializing the virtual queues, but were not freed again. Wrap all of the del_vqs calls to detach and free the unused buffers before deleting the IRQ VQ. Signed-off-by: Benjamin Berg <benjamin.berg@intel.com> Link: https://patch.msgid.link/20260505124317.2330700-2-benjamin@sipsolutions.net Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'arch/um/drivers')
-rw-r--r--arch/um/drivers/virtio_pcidev.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/arch/um/drivers/virtio_pcidev.c b/arch/um/drivers/virtio_pcidev.c
index 2bf5a645db45..53cffd373890 100644
--- a/arch/um/drivers/virtio_pcidev.c
+++ b/arch/um/drivers/virtio_pcidev.c
@@ -490,13 +490,24 @@ static int virtio_pcidev_init_vqs(struct virtio_pcidev_device *dev)
return 0;
}
+static void virtio_pcidev_del_vqs(struct virtio_device *vdev,
+ struct virtio_pcidev_device *dev)
+{
+ void *msg;
+
+ while ((msg = virtqueue_detach_unused_buf(dev->irq_vq)))
+ kfree(msg);
+
+ vdev->config->del_vqs(vdev);
+}
+
static void __virtio_pcidev_virtio_platform_remove(struct virtio_device *vdev,
struct virtio_pcidev_device *dev)
{
um_pci_platform_device_unregister(&dev->pdev);
virtio_reset_device(vdev);
- vdev->config->del_vqs(vdev);
+ virtio_pcidev_del_vqs(vdev, dev);
kfree(dev);
}
@@ -526,7 +537,7 @@ err_unregister:
um_pci_platform_device_unregister(&dev->pdev);
err_reset:
virtio_reset_device(vdev);
- vdev->config->del_vqs(vdev);
+ virtio_pcidev_del_vqs(vdev, dev);
err_free:
kfree(dev);
return err;
@@ -569,7 +580,7 @@ static int virtio_pcidev_virtio_probe(struct virtio_device *vdev)
err_reset:
virtio_reset_device(vdev);
- vdev->config->del_vqs(vdev);
+ virtio_pcidev_del_vqs(vdev, dev);
err_free:
kfree(dev);
return err;
@@ -591,9 +602,9 @@ static void virtio_pcidev_virtio_remove(struct virtio_device *vdev)
/* Stop all virtqueues */
virtio_reset_device(vdev);
+ virtio_pcidev_del_vqs(vdev, dev);
dev->cmd_vq = NULL;
dev->irq_vq = NULL;
- vdev->config->del_vqs(vdev);
kfree(dev);
}