* [PATCH v2] iommu/virtio: Make instance lookup robust
@ 2025-08-14 16:47 Robin Murphy
2025-08-14 17:11 ` Eric Auger
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Robin Murphy @ 2025-08-14 16:47 UTC (permalink / raw)
To: will, joro, jean-philippe; +Cc: iommu, virtualization, eric.auger, stable
Much like arm-smmu in commit 7d835134d4e1 ("iommu/arm-smmu: Make
instance lookup robust"), virtio-iommu appears to have the same issue
where iommu_device_register() makes the IOMMU instance visible to other
API callers (including itself) straight away, but internally the
instance isn't ready to recognise itself for viommu_probe_device() to
work correctly until after viommu_probe() has returned. This matters a
lot more now that bus_iommu_probe() has the DT/VIOT knowledge to probe
client devices the way that was always intended. Tweak the lookup and
initialisation in much the same way as for arm-smmu, to ensure that what
we register is functional and ready to go.
Cc: stable@vger.kernel.org
Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---
v2: Of course generic bus_find_device_by_fwnode() didn't work, since
it's dev->parent we need to check rather than dev itself, sigh...
---
drivers/iommu/virtio-iommu.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
index 532db1de201b..b39d6f134ab2 100644
--- a/drivers/iommu/virtio-iommu.c
+++ b/drivers/iommu/virtio-iommu.c
@@ -998,8 +998,7 @@ static void viommu_get_resv_regions(struct device *dev, struct list_head *head)
iommu_dma_get_resv_regions(dev, head);
}
-static const struct iommu_ops viommu_ops;
-static struct virtio_driver virtio_iommu_drv;
+static const struct bus_type *virtio_bus_type;
static int viommu_match_node(struct device *dev, const void *data)
{
@@ -1008,8 +1007,9 @@ static int viommu_match_node(struct device *dev, const void *data)
static struct viommu_dev *viommu_get_by_fwnode(struct fwnode_handle *fwnode)
{
- struct device *dev = driver_find_device(&virtio_iommu_drv.driver, NULL,
- fwnode, viommu_match_node);
+ struct device *dev = bus_find_device(virtio_bus_type, NULL, fwnode,
+ viommu_match_node);
+
put_device(dev);
return dev ? dev_to_virtio(dev)->priv : NULL;
@@ -1160,6 +1160,9 @@ static int viommu_probe(struct virtio_device *vdev)
if (!viommu)
return -ENOMEM;
+ /* Borrow this for easy lookups later */
+ virtio_bus_type = dev->bus;
+
spin_lock_init(&viommu->request_lock);
ida_init(&viommu->domain_ids);
viommu->dev = dev;
@@ -1229,10 +1232,10 @@ static int viommu_probe(struct virtio_device *vdev)
if (ret)
goto err_free_vqs;
- iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
-
vdev->priv = viommu;
+ iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
+
dev_info(dev, "input address: %u bits\n",
order_base_2(viommu->geometry.aperture_end));
dev_info(dev, "page mask: %#llx\n", viommu->pgsize_bitmap);
--
2.39.2.101.g768bb238c484.dirty
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2] iommu/virtio: Make instance lookup robust
2025-08-14 16:47 [PATCH v2] iommu/virtio: Make instance lookup robust Robin Murphy
@ 2025-08-14 17:11 ` Eric Auger
2025-08-21 9:00 ` Eric Auger
2025-08-22 6:43 ` Joerg Roedel
2 siblings, 0 replies; 4+ messages in thread
From: Eric Auger @ 2025-08-14 17:11 UTC (permalink / raw)
To: Robin Murphy, will, joro, jean-philippe; +Cc: iommu, virtualization, stable
Hi Robin,
On 8/14/25 6:47 PM, Robin Murphy wrote:
> Much like arm-smmu in commit 7d835134d4e1 ("iommu/arm-smmu: Make
> instance lookup robust"), virtio-iommu appears to have the same issue
> where iommu_device_register() makes the IOMMU instance visible to other
> API callers (including itself) straight away, but internally the
> instance isn't ready to recognise itself for viommu_probe_device() to
> work correctly until after viommu_probe() has returned. This matters a
> lot more now that bus_iommu_probe() has the DT/VIOT knowledge to probe
> client devices the way that was always intended. Tweak the lookup and
> initialisation in much the same way as for arm-smmu, to ensure that what
> we register is functional and ready to go.
>
> Cc: stable@vger.kernel.org
> Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
This version works for me. Thanks for the diligent respin.
Tested-by: Eric Auger <eric.auger@redhat.com>
Thanks
Eric
> ---
>
> v2: Of course generic bus_find_device_by_fwnode() didn't work, since
> it's dev->parent we need to check rather than dev itself, sigh...
> ---
> drivers/iommu/virtio-iommu.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
> index 532db1de201b..b39d6f134ab2 100644
> --- a/drivers/iommu/virtio-iommu.c
> +++ b/drivers/iommu/virtio-iommu.c
> @@ -998,8 +998,7 @@ static void viommu_get_resv_regions(struct device *dev, struct list_head *head)
> iommu_dma_get_resv_regions(dev, head);
> }
>
> -static const struct iommu_ops viommu_ops;
> -static struct virtio_driver virtio_iommu_drv;
> +static const struct bus_type *virtio_bus_type;
>
> static int viommu_match_node(struct device *dev, const void *data)
> {
> @@ -1008,8 +1007,9 @@ static int viommu_match_node(struct device *dev, const void *data)
>
> static struct viommu_dev *viommu_get_by_fwnode(struct fwnode_handle *fwnode)
> {
> - struct device *dev = driver_find_device(&virtio_iommu_drv.driver, NULL,
> - fwnode, viommu_match_node);
> + struct device *dev = bus_find_device(virtio_bus_type, NULL, fwnode,
> + viommu_match_node);
> +
> put_device(dev);
>
> return dev ? dev_to_virtio(dev)->priv : NULL;
> @@ -1160,6 +1160,9 @@ static int viommu_probe(struct virtio_device *vdev)
> if (!viommu)
> return -ENOMEM;
>
> + /* Borrow this for easy lookups later */
> + virtio_bus_type = dev->bus;
> +
> spin_lock_init(&viommu->request_lock);
> ida_init(&viommu->domain_ids);
> viommu->dev = dev;
> @@ -1229,10 +1232,10 @@ static int viommu_probe(struct virtio_device *vdev)
> if (ret)
> goto err_free_vqs;
>
> - iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
> -
> vdev->priv = viommu;
>
> + iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
> +
> dev_info(dev, "input address: %u bits\n",
> order_base_2(viommu->geometry.aperture_end));
> dev_info(dev, "page mask: %#llx\n", viommu->pgsize_bitmap);
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] iommu/virtio: Make instance lookup robust
2025-08-14 16:47 [PATCH v2] iommu/virtio: Make instance lookup robust Robin Murphy
2025-08-14 17:11 ` Eric Auger
@ 2025-08-21 9:00 ` Eric Auger
2025-08-22 6:43 ` Joerg Roedel
2 siblings, 0 replies; 4+ messages in thread
From: Eric Auger @ 2025-08-21 9:00 UTC (permalink / raw)
To: Robin Murphy, will, joro, jean-philippe; +Cc: iommu, virtualization, stable
Hi Robin, Joerg,
On 8/14/25 6:47 PM, Robin Murphy wrote:
> Much like arm-smmu in commit 7d835134d4e1 ("iommu/arm-smmu: Make
> instance lookup robust"), virtio-iommu appears to have the same issue
> where iommu_device_register() makes the IOMMU instance visible to other
> API callers (including itself) straight away, but internally the
> instance isn't ready to recognise itself for viommu_probe_device() to
> work correctly until after viommu_probe() has returned. This matters a
> lot more now that bus_iommu_probe() has the DT/VIOT knowledge to probe
> client devices the way that was always intended. Tweak the lookup and
> initialisation in much the same way as for arm-smmu, to ensure that what
> we register is functional and ready to go.
>
> Cc: stable@vger.kernel.org
> Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
could we get that fix merged as soon as possible? the virtio-iommu is
currently totally broken.
Thanks
Eric
> ---
>
> v2: Of course generic bus_find_device_by_fwnode() didn't work, since
> it's dev->parent we need to check rather than dev itself, sigh...
> ---
> drivers/iommu/virtio-iommu.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iommu/virtio-iommu.c b/drivers/iommu/virtio-iommu.c
> index 532db1de201b..b39d6f134ab2 100644
> --- a/drivers/iommu/virtio-iommu.c
> +++ b/drivers/iommu/virtio-iommu.c
> @@ -998,8 +998,7 @@ static void viommu_get_resv_regions(struct device *dev, struct list_head *head)
> iommu_dma_get_resv_regions(dev, head);
> }
>
> -static const struct iommu_ops viommu_ops;
> -static struct virtio_driver virtio_iommu_drv;
> +static const struct bus_type *virtio_bus_type;
>
> static int viommu_match_node(struct device *dev, const void *data)
> {
> @@ -1008,8 +1007,9 @@ static int viommu_match_node(struct device *dev, const void *data)
>
> static struct viommu_dev *viommu_get_by_fwnode(struct fwnode_handle *fwnode)
> {
> - struct device *dev = driver_find_device(&virtio_iommu_drv.driver, NULL,
> - fwnode, viommu_match_node);
> + struct device *dev = bus_find_device(virtio_bus_type, NULL, fwnode,
> + viommu_match_node);
> +
> put_device(dev);
>
> return dev ? dev_to_virtio(dev)->priv : NULL;
> @@ -1160,6 +1160,9 @@ static int viommu_probe(struct virtio_device *vdev)
> if (!viommu)
> return -ENOMEM;
>
> + /* Borrow this for easy lookups later */
> + virtio_bus_type = dev->bus;
> +
> spin_lock_init(&viommu->request_lock);
> ida_init(&viommu->domain_ids);
> viommu->dev = dev;
> @@ -1229,10 +1232,10 @@ static int viommu_probe(struct virtio_device *vdev)
> if (ret)
> goto err_free_vqs;
>
> - iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
> -
> vdev->priv = viommu;
>
> + iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
> +
> dev_info(dev, "input address: %u bits\n",
> order_base_2(viommu->geometry.aperture_end));
> dev_info(dev, "page mask: %#llx\n", viommu->pgsize_bitmap);
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2] iommu/virtio: Make instance lookup robust
2025-08-14 16:47 [PATCH v2] iommu/virtio: Make instance lookup robust Robin Murphy
2025-08-14 17:11 ` Eric Auger
2025-08-21 9:00 ` Eric Auger
@ 2025-08-22 6:43 ` Joerg Roedel
2 siblings, 0 replies; 4+ messages in thread
From: Joerg Roedel @ 2025-08-22 6:43 UTC (permalink / raw)
To: Robin Murphy
Cc: will, jean-philippe, iommu, virtualization, eric.auger, stable
On Thu, Aug 14, 2025 at 05:47:16PM +0100, Robin Murphy wrote:
> drivers/iommu/virtio-iommu.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
Applied for -rc, thanks Robin.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-08-22 6:43 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-14 16:47 [PATCH v2] iommu/virtio: Make instance lookup robust Robin Murphy
2025-08-14 17:11 ` Eric Auger
2025-08-21 9:00 ` Eric Auger
2025-08-22 6:43 ` Joerg Roedel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).