[PATCH v3 0/2] iommu/virtio: Probe fixes for proper driver state
Xiong Weimin <[email protected]> Fri, 24 Jul 2026 10:33:33 +0800 (CST)
| Newsgroups | dev.linux.lists.iommu |
|---|---|
| Message-ID | <[email protected]> |
0000-cover-letter.patch
(text/plain, 917 B)
From: Xiong Weimin <[email protected]> Subject: [PATCH v3 0/2] iommu/virtio: Probe fixes for proper driver state To: [email protected] Cc: [email protected], [email protected], [email protected] In-Reply-To: <[email protected]> References: <[email protected]> This is v3 of the patch series. v2 is now obsolete. Changes since v2: - Rebased onto latest upstream - Patch 3 ("Reject short event buffers") has been dropped as it was independently submitted by Xu Rao - As suggested by Will Deacon, modified viommu_init_vqs() to take vdev instead of viommu, since they are now linked via vdev->priv --- Xiong Weimin (2): iommu/virtio: Set driver data before enabling virtqueues iommu/virtio: Handle iommu_device_register() failures drivers/iommu/virtio-iommu.c | 17 +++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) -- 2.43.0
0001-iommu-virtio-Set-driver-data-before-enabling-virtque.patch
(text/plain, 2.2 KB)
From fda59717330fd907f1cd3fdbba7e0b0888b54524 Mon Sep 17 00:00:00 2001 From: xiongweimin <[email protected]> Date: Thu, 23 Jul 2026 11:18:50 +0800 Subject: [PATCH v3 1/2] iommu/virtio: Set driver data before enabling virtqueues To: [email protected] Cc: [email protected], [email protected], [email protected] The event virtqueue callback retrieves the driver state through vq->vdev->priv. viommu_probe() currently initializes that pointer only after virtio_device_ready() and after the event queue is populated. Store the driver data before creating the virtqueues so callbacks always see initialized driver state once the device is made ready. Clear the pointer again on probe failure. As suggested by Will Deacon, pass vdev instead of viommu to viommu_init_vqs(), since we already linked them together. Suggested-by: Will Deacon <[email protected]> Signed-off-by: Xiong Weimin <[email protected]> Reviewed-by: Will Deacon <[email protected]> --- drivers/iommu/virtio-iommu.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c index 587fc1319..f3f74fdc1 100644 --- a/drivers/iommu/virtio-iommu.c +++ b/drivers/iommu/virtio-iommu.c @@ -1110,9 +1110,9 @@ static const struct iommu_ops viommu_ops = { } }; -static int viommu_init_vqs(struct viommu_dev *viommu) +static int viommu_init_vqs(struct virtio_device *vdev) { - struct virtio_device *vdev = dev_to_virtio(viommu->dev); + struct viommu_dev *viommu = vdev->priv; struct virtqueue_info vqs_info[] = { { "request" }, { "event", viommu_event_handler }, @@ -1169,11 +1169,12 @@ static int viommu_probe(struct virtio_device *vdev) ida_init(&viommu->domain_ids); viommu->dev = dev; viommu->vdev = vdev; + vdev->priv = viommu; INIT_LIST_HEAD(&viommu->requests); - ret = viommu_init_vqs(viommu); + ret = viommu_init_vqs(vdev); if (ret) - return ret; + goto err_clear_priv; virtio_cread_le(vdev, struct virtio_iommu_config, page_size_mask, &viommu->pgsize_bitmap); @@ -1246,6 +1247,8 @@ static int viommu_probe(struct virtio_device *vdev) err_free_vqs: vdev->config->del_vqs(vdev); +err_clear_priv: + vdev->priv = NULL; return ret; } -- 2.43.0
0002-iommu-virtio-Handle-iommu_device_register-failures.patch
(text/plain, 1.4 KB)
From 3f94f2266bc35c31234b19c1e9acb847ff7e445c Mon Sep 17 00:00:00 2001 From: xiongweimin <[email protected]> Date: Thu, 23 Jul 2026 11:19:07 +0800 Subject: [PATCH v3 2/2] iommu/virtio: Handle iommu_device_register() failures To: [email protected] Cc: [email protected], [email protected], [email protected] Check the return value of iommu_device_register() and properly clean up sysfs entries on failure. This ensures that the device sysfs directory is removed if registration fails. Reviewed-by: Will Deacon <[email protected]> Signed-off-by: Xiong Weimin <[email protected]> --- drivers/iommu/virtio-iommu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c index f3f74fdc1..288eea386 100644 --- a/drivers/iommu/virtio-iommu.c +++ b/drivers/iommu/virtio-iommu.c @@ -1237,7 +1237,9 @@ static int viommu_probe(struct virtio_device *vdev) vdev->priv = viommu; - iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev); + ret = iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev); + if (ret) + goto err_free_sysfs; dev_info(dev, "input address: %u bits\n", order_base_2(viommu->geometry.aperture_end)); @@ -1245,6 +1247,8 @@ static int viommu_probe(struct virtio_device *vdev) return 0; +err_free_sysfs: + iommu_device_sysfs_remove(&viommu->iommu); err_free_vqs: vdev->config->del_vqs(vdev); err_clear_priv: -- 2.43.0