[PATCH] iommu: dont fail silently
Caleb Connolly
caleb.connolly at linaro.org
Fri Jan 5 17:09:45 CET 2024
On 05/01/2024 14:47, Dragan Simic wrote:
> On 2024-01-05 14:55, Caleb Connolly wrote:
>> On 04/01/2024 17:47, Dragan Simic wrote:
>>> On 2024-01-04 18:12, Caleb Connolly wrote:
>>>> When attempting to probe a device which has an associated IOMMU, if the
>>>> IOMMU device can't be found (no driver, disabled driver, driver failed
>>>> to probe, etc) then we currently fail to probe the device with no
>>>> discernable error.
>>>>
>>>> If we fail to hook the device up to its IOMMU, we should make sure that
>>>> the user knows about it. Write some better error messages for
>>>> dev_iommu_enable() to facilitate this.
>>>
>>> Quite frankly, I think those should remain as debug-only error messages,
>>> but of course with the additional details you added. The reasoning
>>> behind it would be to use debug builds while testing, to be able to see
>>> any error messages, and then use production, size-optimized builds
>>> later. I hope you agree.
>>>
>>> There are many other places where using log messages instead of debug
>>> messages would be really useful in the field, such as in the MMC
>>> drivers, but we'd quickly start increasing the image sizes if we start
>>> converting those from debug to log messages.
>>
>> The problem is that with a debug build there are SO MANY messages, it's
>> hard to spot actual errors in the midst of the other stuff. I would
>> rather see some actual numbers to justify breaking ease-of-use like this.
>
> As a reminder, debugging can be enabled on a per-file basis, which is
> usually the way it's performed. In other words, debug messages usually
> get enabled during development only on the files you're actually working
> on, and perhaps on a few more related files.
Yes, and this would be fine, but when I need to know to add "#define
LOG_DEBUG" specifically to drivers/iommu/iommu-uclass.c to know that my
driver failed to probe due to the IOMMU device not being found... Well,
you can see how that isn't super useful in this case.
Maybe adding a single error message to device_probe() if the call to
dev_iommu_enable() fails would be a sensible middleground here?
>
>> I can definitely foresee folks hitting this error path when using an
>> incompatible devicetree, having absolutely no idea where to start
>> debugging is pretty frustrating and I don't think it's the right
>> tradeoff to make in this case.
>
> I see. Perhaps we should hear opinions from other people as well.
Yeah, I'm curious to know how others feel about this.
>
>> If you're really space constrained then wouldn't you disable log
>> messages altogether?
>
> Of course not, but there aren't _that_ many log messages already.
> Actually, "oh, logging that would be nice" has crossed my mind many
> times, while either debug messages were already in place, or there was
> nothing logged at all.
Well, you can disable logging but still get printf() outputs I mean...
>
>>>> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
>>>> ---
>>>> drivers/iommu/iommu-uclass.c | 13 ++++++++-----
>>>> 1 file changed, 8 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/drivers/iommu/iommu-uclass.c
>>>> b/drivers/iommu/iommu-uclass.c
>>>> index 6babc0e3a672..dff3239cccb1 100644
>>>> --- a/drivers/iommu/iommu-uclass.c
>>>> +++ b/drivers/iommu/iommu-uclass.c
>>>> @@ -86,16 +86,16 @@ int dev_iommu_enable(struct udevice *dev)
>>>> ret = dev_read_phandle_with_args(dev, "iommus",
>>>> "#iommu-cells", 0, i, &args);
>>>> if (ret) {
>>>> - debug("%s: dev_read_phandle_with_args failed: %d\n",
>>>> - __func__, ret);
>>>> + log_err("%s: Failed to parse 'iommus' property for '%s':
>>>> %d\n",
>>>> + __func__, dev->name, ret);
>>>> return ret;
>>>> }
>>>>
>>>> ret = uclass_get_device_by_ofnode(UCLASS_IOMMU, args.node,
>>>> &dev_iommu);
>>>> if (ret) {
>>>> - debug("%s: uclass_get_device_by_ofnode failed: %d\n",
>>>> - __func__, ret);
>>>> + log_err("%s: Failed to find IOMMU device for '%s': %d\n",
>>>> + __func__, dev->name, ret);
>>>> return ret;
>>>> }
>>>> dev->iommu = dev_iommu;
>>>> @@ -106,8 +106,11 @@ int dev_iommu_enable(struct udevice *dev)
>>>> ops = device_get_ops(dev->iommu);
>>>> if (ops && ops->connect) {
>>>> ret = ops->connect(dev);
>>>> - if (ret)
>>>> + if (ret) {
>>>> + log_err("%s: Failed to connect '%s' to IOMMU '%s':
>>>> %d\n",
>>>> + __func__, dev->name, dev->iommu->name, ret);
>>>> return ret;
>>>> + }
>>>> }
>>>> }
--
// Caleb (they/them)
More information about the U-Boot
mailing list