* [PATCH] iommu/ipmmu-vmsa: Register in a sensible order
@ 2025-03-20 14:41 Robin Murphy
2025-03-25 15:26 ` Geert Uytterhoeven
2025-04-11 7:24 ` Joerg Roedel
0 siblings, 2 replies; 6+ messages in thread
From: Robin Murphy @ 2025-03-20 14:41 UTC (permalink / raw)
To: joro, will; +Cc: iommu, linux-renesas-soc, Geert Uytterhoeven
IPMMU registers almost-initialised instances, but misses assigning the
drvdata to make them fully functional, so initial calls back into
ipmmu_probe_device() are likely to fail unnecessarily. Reorder this to
work as it should, also pruning the long-out-of-date comment and adding
the missing sysfs cleanup on error for good measure.
Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
---
drivers/iommu/ipmmu-vmsa.c | 27 ++++++++++-----------------
1 file changed, 10 insertions(+), 17 deletions(-)
diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c
index 074daf1aac4e..e424b279a8cd 100644
--- a/drivers/iommu/ipmmu-vmsa.c
+++ b/drivers/iommu/ipmmu-vmsa.c
@@ -1081,31 +1081,24 @@ static int ipmmu_probe(struct platform_device *pdev)
}
}
+ platform_set_drvdata(pdev, mmu);
/*
* Register the IPMMU to the IOMMU subsystem in the following cases:
* - R-Car Gen2 IPMMU (all devices registered)
* - R-Car Gen3 IPMMU (leaf devices only - skip root IPMMU-MM device)
*/
- if (!mmu->features->has_cache_leaf_nodes || !ipmmu_is_root(mmu)) {
- ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL,
- dev_name(&pdev->dev));
- if (ret)
- return ret;
+ if (mmu->features->has_cache_leaf_nodes && ipmmu_is_root(mmu))
+ return 0;
- ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
- if (ret)
- return ret;
- }
+ ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL, dev_name(&pdev->dev));
+ if (ret)
+ return ret;
- /*
- * We can't create the ARM mapping here as it requires the bus to have
- * an IOMMU, which only happens when bus_set_iommu() is called in
- * ipmmu_init() after the probe function returns.
- */
+ ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
+ if (ret)
+ iommu_device_sysfs_remove(&mmu->iommu);
- platform_set_drvdata(pdev, mmu);
-
- return 0;
+ return ret;
}
static void ipmmu_remove(struct platform_device *pdev)
--
2.39.2.101.g768bb238c484.dirty
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] iommu/ipmmu-vmsa: Register in a sensible order
2025-03-20 14:41 [PATCH] iommu/ipmmu-vmsa: Register in a sensible order Robin Murphy
@ 2025-03-25 15:26 ` Geert Uytterhoeven
2025-04-01 13:53 ` Robin Murphy
2025-04-11 7:24 ` Joerg Roedel
1 sibling, 1 reply; 6+ messages in thread
From: Geert Uytterhoeven @ 2025-03-25 15:26 UTC (permalink / raw)
To: Robin Murphy; +Cc: joro, will, iommu, linux-renesas-soc
Hi Robin,
On Thu, 20 Mar 2025 at 15:41, Robin Murphy <robin.murphy@arm.com> wrote:
> IPMMU registers almost-initialised instances, but misses assigning the
> drvdata to make them fully functional, so initial calls back into
> ipmmu_probe_device() are likely to fail unnecessarily. Reorder this to
> work as it should, also pruning the long-out-of-date comment and adding
> the missing sysfs cleanup on error for good measure.
>
> Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Thanks for your patch!
This fixes the
sata_rcar ee300000.sata: late IOMMU probe at driver bind,
something fishy here!
WARNING: CPU: 1 PID: 13 at drivers/iommu/iommu.c:571
__iommu_probe_device+0x208/0x38c
I saw on Salvator-XS with R-Car M3-N.
It does not fix the second issue reported, so it is indeed too early for a
"Closes: https://lore.kernel.org/CAMuHMdWPFnHTFeeWL2-BU8tKOL-E5K2ROOz=LLBLTJJLCK9NgA@mail.gmail.com"
tag.
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
> --- a/drivers/iommu/ipmmu-vmsa.c
> +++ b/drivers/iommu/ipmmu-vmsa.c
> @@ -1081,31 +1081,24 @@ static int ipmmu_probe(struct platform_device *pdev)
> }
> }
>
> + platform_set_drvdata(pdev, mmu);
Nit: perhaps insert a blank line here, before the comment below?
> /*
> * Register the IPMMU to the IOMMU subsystem in the following cases:
> * - R-Car Gen2 IPMMU (all devices registered)
> * - R-Car Gen3 IPMMU (leaf devices only - skip root IPMMU-MM device)
> */
> - if (!mmu->features->has_cache_leaf_nodes || !ipmmu_is_root(mmu)) {
> - ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL,
> - dev_name(&pdev->dev));
> - if (ret)
> - return ret;
> + if (mmu->features->has_cache_leaf_nodes && ipmmu_is_root(mmu))
> + return 0;
>
> - ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
> - if (ret)
> - return ret;
> - }
> + ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL, dev_name(&pdev->dev));
> + if (ret)
> + return ret;
>
> - /*
> - * We can't create the ARM mapping here as it requires the bus to have
> - * an IOMMU, which only happens when bus_set_iommu() is called in
> - * ipmmu_init() after the probe function returns.
> - */
> + ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
> + if (ret)
> + iommu_device_sysfs_remove(&mmu->iommu);
>
> - platform_set_drvdata(pdev, mmu);
> -
> - return 0;
> + return ret;
> }
>
> static void ipmmu_remove(struct platform_device *pdev)
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] iommu/ipmmu-vmsa: Register in a sensible order
2025-03-25 15:26 ` Geert Uytterhoeven
@ 2025-04-01 13:53 ` Robin Murphy
2025-04-01 14:11 ` Geert Uytterhoeven
0 siblings, 1 reply; 6+ messages in thread
From: Robin Murphy @ 2025-04-01 13:53 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: joro, will, iommu, linux-renesas-soc
On 2025-03-25 3:26 pm, Geert Uytterhoeven wrote:
> Hi Robin,
>
> On Thu, 20 Mar 2025 at 15:41, Robin Murphy <robin.murphy@arm.com> wrote:
>> IPMMU registers almost-initialised instances, but misses assigning the
>> drvdata to make them fully functional, so initial calls back into
>> ipmmu_probe_device() are likely to fail unnecessarily. Reorder this to
>> work as it should, also pruning the long-out-of-date comment and adding
>> the missing sysfs cleanup on error for good measure.
>>
>> Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
>> Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>
> Thanks for your patch!
>
> This fixes the
>
> sata_rcar ee300000.sata: late IOMMU probe at driver bind,
> something fishy here!
> WARNING: CPU: 1 PID: 13 at drivers/iommu/iommu.c:571
> __iommu_probe_device+0x208/0x38c
>
> I saw on Salvator-XS with R-Car M3-N.
>
> It does not fix the second issue reported, so it is indeed too early for a
> "Closes: https://lore.kernel.org/CAMuHMdWPFnHTFeeWL2-BU8tKOL-E5K2ROOz=LLBLTJJLCK9NgA@mail.gmail.com"
> tag.
You mean .of_xlate being called multiple times? That's not an issue,
it's normal and expected. Every time an IOMMU instance registers, it
triggers a probe of all relevant devices which do not yet have an IOMMU
- this has never been selective, so if a device is associated with a
different already-registered IOMMU instance, but does not have a group
because that instance's .probe_device rejected it, that probe also gets
tried (and rejected) again.
The core code behaviour has been this way for a very long time, the only
new thing is that the .of_xlate calls are now in sync with their
corresponding .probe_device calls (and the latter are also now working
properly again for fwspec-based ops).
Was it just that, or is there still something functionally amiss?
> Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Thanks!
Robin.
>> --- a/drivers/iommu/ipmmu-vmsa.c
>> +++ b/drivers/iommu/ipmmu-vmsa.c
>> @@ -1081,31 +1081,24 @@ static int ipmmu_probe(struct platform_device *pdev)
>> }
>> }
>>
>> + platform_set_drvdata(pdev, mmu);
>
> Nit: perhaps insert a blank line here, before the comment below?
>
>> /*
>> * Register the IPMMU to the IOMMU subsystem in the following cases:
>> * - R-Car Gen2 IPMMU (all devices registered)
>> * - R-Car Gen3 IPMMU (leaf devices only - skip root IPMMU-MM device)
>> */
>> - if (!mmu->features->has_cache_leaf_nodes || !ipmmu_is_root(mmu)) {
>> - ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL,
>> - dev_name(&pdev->dev));
>> - if (ret)
>> - return ret;
>> + if (mmu->features->has_cache_leaf_nodes && ipmmu_is_root(mmu))
>> + return 0;
>>
>> - ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
>> - if (ret)
>> - return ret;
>> - }
>> + ret = iommu_device_sysfs_add(&mmu->iommu, &pdev->dev, NULL, dev_name(&pdev->dev));
>> + if (ret)
>> + return ret;
>>
>> - /*
>> - * We can't create the ARM mapping here as it requires the bus to have
>> - * an IOMMU, which only happens when bus_set_iommu() is called in
>> - * ipmmu_init() after the probe function returns.
>> - */
>> + ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
>> + if (ret)
>> + iommu_device_sysfs_remove(&mmu->iommu);
>>
>> - platform_set_drvdata(pdev, mmu);
>> -
>> - return 0;
>> + return ret;
>> }
>>
>> static void ipmmu_remove(struct platform_device *pdev)
>
> Gr{oetje,eeting}s,
>
> Geert
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] iommu/ipmmu-vmsa: Register in a sensible order
2025-04-01 13:53 ` Robin Murphy
@ 2025-04-01 14:11 ` Geert Uytterhoeven
2025-04-03 16:37 ` Robin Murphy
0 siblings, 1 reply; 6+ messages in thread
From: Geert Uytterhoeven @ 2025-04-01 14:11 UTC (permalink / raw)
To: Robin Murphy; +Cc: joro, will, iommu, linux-renesas-soc
Hi Robin,
On Tue, 1 Apr 2025 at 15:53, Robin Murphy <robin.murphy@arm.com> wrote:
> On 2025-03-25 3:26 pm, Geert Uytterhoeven wrote:
> > On Thu, 20 Mar 2025 at 15:41, Robin Murphy <robin.murphy@arm.com> wrote:
> >> IPMMU registers almost-initialised instances, but misses assigning the
> >> drvdata to make them fully functional, so initial calls back into
> >> ipmmu_probe_device() are likely to fail unnecessarily. Reorder this to
> >> work as it should, also pruning the long-out-of-date comment and adding
> >> the missing sysfs cleanup on error for good measure.
> >>
> >> Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
> >> Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
> >> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
> >
> > Thanks for your patch!
> >
> > This fixes the
> >
> > sata_rcar ee300000.sata: late IOMMU probe at driver bind,
> > something fishy here!
> > WARNING: CPU: 1 PID: 13 at drivers/iommu/iommu.c:571
> > __iommu_probe_device+0x208/0x38c
> >
> > I saw on Salvator-XS with R-Car M3-N.
> >
> > It does not fix the second issue reported, so it is indeed too early for a
> > "Closes: https://lore.kernel.org/CAMuHMdWPFnHTFeeWL2-BU8tKOL-E5K2ROOz=LLBLTJJLCK9NgA@mail.gmail.com"
> > tag.
>
> You mean .of_xlate being called multiple times? That's not an issue,
> it's normal and expected. Every time an IOMMU instance registers, it
> triggers a probe of all relevant devices which do not yet have an IOMMU
> - this has never been selective, so if a device is associated with a
> different already-registered IOMMU instance, but does not have a group
> because that instance's .probe_device rejected it, that probe also gets
> tried (and rejected) again.
>
> The core code behaviour has been this way for a very long time, the only
> new thing is that the .of_xlate calls are now in sync with their
> corresponding .probe_device calls (and the latter are also now working
> properly again for fwspec-based ops).
Hmm, I started seeing the extra calls only after bcb81ac6ae3c,
i.e. not since a very long time?
> Was it just that, or is there still something functionally amiss?
That's all for now ;-)
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] iommu/ipmmu-vmsa: Register in a sensible order
2025-04-01 14:11 ` Geert Uytterhoeven
@ 2025-04-03 16:37 ` Robin Murphy
0 siblings, 0 replies; 6+ messages in thread
From: Robin Murphy @ 2025-04-03 16:37 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: joro, will, iommu, linux-renesas-soc
On 01/04/2025 3:11 pm, Geert Uytterhoeven wrote:
> Hi Robin,
>
> On Tue, 1 Apr 2025 at 15:53, Robin Murphy <robin.murphy@arm.com> wrote:
>> On 2025-03-25 3:26 pm, Geert Uytterhoeven wrote:
>>> On Thu, 20 Mar 2025 at 15:41, Robin Murphy <robin.murphy@arm.com> wrote:
>>>> IPMMU registers almost-initialised instances, but misses assigning the
>>>> drvdata to make them fully functional, so initial calls back into
>>>> ipmmu_probe_device() are likely to fail unnecessarily. Reorder this to
>>>> work as it should, also pruning the long-out-of-date comment and adding
>>>> the missing sysfs cleanup on error for good measure.
>>>>
>>>> Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
>>>> Fixes: bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe path")
>>>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>>>
>>> Thanks for your patch!
>>>
>>> This fixes the
>>>
>>> sata_rcar ee300000.sata: late IOMMU probe at driver bind,
>>> something fishy here!
>>> WARNING: CPU: 1 PID: 13 at drivers/iommu/iommu.c:571
>>> __iommu_probe_device+0x208/0x38c
>>>
>>> I saw on Salvator-XS with R-Car M3-N.
>>>
>>> It does not fix the second issue reported, so it is indeed too early for a
>>> "Closes: https://lore.kernel.org/CAMuHMdWPFnHTFeeWL2-BU8tKOL-E5K2ROOz=LLBLTJJLCK9NgA@mail.gmail.com"
>>> tag.
>>
>> You mean .of_xlate being called multiple times? That's not an issue,
>> it's normal and expected. Every time an IOMMU instance registers, it
>> triggers a probe of all relevant devices which do not yet have an IOMMU
>> - this has never been selective, so if a device is associated with a
>> different already-registered IOMMU instance, but does not have a group
>> because that instance's .probe_device rejected it, that probe also gets
>> tried (and rejected) again.
>>
>> The core code behaviour has been this way for a very long time, the only
>> new thing is that the .of_xlate calls are now in sync with their
>> corresponding .probe_device calls (and the latter are also now working
>> properly again for fwspec-based ops).
>
> Hmm, I started seeing the extra calls only after bcb81ac6ae3c,
> i.e. not since a very long time?
OK, maybe not "very" - there are a lot of pieces in this puzzle that
have all moved underfoot over time, but the point I was getting at is
that although fwspec-based drivers *are* only now seeing those extra
.probe_device calls, the design of the core code has been *trying* to
make them since at least 3-ish years ago when the last of
bus_set_iommu() went away.
Conversely though, you should also now *not* be seeing extra calls where
you weren't looking for them. I bet if you were to build the DMA driver
as a module and load/unload it a bunch of times, you would have seen
more repeated calls to .of_xlate/.probe_device, whereas now you
(correctly) won't.
>> Was it just that, or is there still something functionally amiss?
>
> That's all for now ;-)
Great!
Thanks,
Robin.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] iommu/ipmmu-vmsa: Register in a sensible order
2025-03-20 14:41 [PATCH] iommu/ipmmu-vmsa: Register in a sensible order Robin Murphy
2025-03-25 15:26 ` Geert Uytterhoeven
@ 2025-04-11 7:24 ` Joerg Roedel
1 sibling, 0 replies; 6+ messages in thread
From: Joerg Roedel @ 2025-04-11 7:24 UTC (permalink / raw)
To: Robin Murphy; +Cc: will, iommu, linux-renesas-soc, Geert Uytterhoeven
On Thu, Mar 20, 2025 at 02:41:27PM +0000, Robin Murphy wrote:
> drivers/iommu/ipmmu-vmsa.c | 27 ++++++++++-----------------
> 1 file changed, 10 insertions(+), 17 deletions(-)
Applied, thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-04-11 7:24 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-20 14:41 [PATCH] iommu/ipmmu-vmsa: Register in a sensible order Robin Murphy
2025-03-25 15:26 ` Geert Uytterhoeven
2025-04-01 13:53 ` Robin Murphy
2025-04-01 14:11 ` Geert Uytterhoeven
2025-04-03 16:37 ` Robin Murphy
2025-04-11 7:24 ` Joerg Roedel
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.