Linux IOMMU Development
 help / color / mirror / Atom feed
From: Xiong Weimin <xiongwm2026@163.com>
To: iommu@lists.linux.dev
Cc: will@kernel.org, robin.murphy@arm.com, joro@8bytes.org
Subject: [PATCH] iommu/virtio: Fix probe error handling and driver state initialization
Date: Fri, 24 Jul 2026 10:42:19 +0800 (CST)	[thread overview]
Message-ID: <6A62D10B.36BC3D.00001@m16.mail.163.com> (raw)
In-Reply-To: <20260724023549.GA2036@myrica>

[-- Attachment #1: Type: text/plain, Size: 3793 bytes --]

Hi Will,

Thank you for your patience and I'm really sorry for the email mess earlier.

The previous emails had issues with my sending script, which caused:
1. Cover letter sent without patch content
2. Duplicate v2 patches that should have been marked obsolete

I've now fixed the script and combined the two probe fixes into a single
patch. Here's what the new patch does:

1. Store vdev->priv before creating virtqueues so the event callback
   always sees initialized driver state

2. Check the return value of iommu_device_register() and clean up sysfs
   entries on failure

3. As you suggested, pass vdev instead of viommu to viommu_init_vqs()

I've also dropped the "Reject short event buffers" patch since Xu Rao
independently submitted an identical fix.

The patch is attached below. Could you please take another look?

Sorry again for the confusion.

Best regards,
Xiong Weimin

---

From: Xiong Weimin <xiongweimin@kylinos.cn>
Subject: [PATCH] iommu/virtio: Fix probe error handling and driver state initialization
To: iommu@lists.linux.dev
Cc: will@kernel.org, robin.murphy@arm.com, joro@8bytes.org

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.

Also 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.

As suggested by Will Deacon, pass vdev instead of viommu to
viommu_init_vqs(), since we already linked them together.

Note: The "Reject short event buffers" patch has been dropped as Xu Rao
independently submitted an identical fix.

Suggested-by: Will Deacon <will@kernel.org>
Signed-off-by: Xiong Weimin <xiongweimin@kylinos.cn>
Reviewed-by: Will Deacon <will@kernel.org>
---
 drivers/iommu/virtio-iommu.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index 587fc1319..288eea386 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);
@@ -1236,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));
@@ -1244,8 +1247,12 @@ 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:
+	vdev->priv = NULL;
 
 	return ret;
 }
-- 
2.43.0

      parent reply	other threads:[~2026-07-24  2:42 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20260714025913.2042-1-xiongweimin@kylinos.cn>
2026-07-23  3:24 ` [PATCH v3 0/2] iommu/virtio: Probe fixes for proper driver state Xiong Weimin
2026-07-23 11:44   ` Will Deacon
2026-07-24  2:33 ` Xiong Weimin
2026-07-24 12:33   ` Will Deacon
     [not found] ` <20260724023549.GA2036@myrica>
2026-07-24  2:42   ` Xiong Weimin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6A62D10B.36BC3D.00001@m16.mail.163.com \
    --to=xiongwm2026@163.com \
    --cc=iommu@lists.linux.dev \
    --cc=joro@8bytes.org \
    --cc=robin.murphy@arm.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox