Thread (10 messages) 10 messages, 2 authors, 2017-05-18

[PATCH V2 2/3] iommu: of: Ignore all errors except EPROBE_DEFER

From: laurent.pinchart@ideasonboard.com (Laurent Pinchart)
Date: 2017-05-18 13:43:57
Also in: linux-acpi, linux-arch, linux-arm-msm, linux-devicetree, linux-iommu, linux-pci, lkml

Hi Sricharan

On Thursday 18 May 2017 19:08:12 Sricharan R wrote:
On 5/18/2017 6:00 PM, Laurent Pinchart wrote:
quoted
On Thursday 18 May 2017 17:26:14 Sricharan R wrote:
quoted
On 5/18/2017 4:09 PM, Laurent Pinchart wrote:
quoted
On Thursday 18 May 2017 15:37:09 Sricharan R wrote:
quoted
While deferring the probe of IOMMU masters,
xlate and add_device callback can pass back error values
like -ENODEV, which means IOMMU cannot be connected
with that master for real reasons. So rather than
killing the master's probe for such errors, just
ignore the errors and let the master work without
an IOMMU.
I don't think this is a good idea. Why should we allow IOMMU drivers to
return an error if we're always going to ignore the error value ? That
will lead to drivers implementing slightly different behaviours, which
will be painful the day we'll need to start acting based on the error
value.
The of_iommu_configure interface, before this series, was returning
either correct 'iommu_ops' or NULL. Also there was no return value from
of_dma_configure which calls of_iommu_configure. This means that if we
block only -ENODEV now and let the other errors, the probe of the master
devices can be killed for reasons apart from deferring. This would be a
change in behavior introduced. All of xlate, add_device, of_pci_map_rid
and others can return values apart from -ENODEV. So was thinking that
restoring the old behavior, except for returning EPROBE_DEFER was the
better thing to do ?
We went from a situation where of_iommu_configure() could return either
valid operations in the case the device was to be handled by the IOMMU or
NULL otherwise, to a situation where we needed a third option for probe
deferral. The way we've done this, through error pointers, allows lots of
other errors to be returned as well from the of_xlate and add_device
operations.
right, this was difference in the behavior now.
quoted
There is currently no use for returning error codes other than
-EPROBE_DEFFER from of_iommu_configure(), so your proposal is to block
errors returned from the of_xlate and add_device operations inside
of_iommu_configure(). My point is that, by doing so, we allow IOMMU
drivers to return random error codes that are then ignored. I believe
this can cause problems in the future when we will need to extend the API
and standardize more error codes, as by then IOMMU drivers will return
random errors (they actually do so already to some extent).

For of_xlate I agree with you to some extent. v4.11 just checked whether
of_xlate succeeded or not, and just didn't use the IOMMU in case it
failed. The exact error value was ignored, and drivers already return
random errors. Going back to the v4.11 behaviour is what we need to do in
the short-term, even if I believe we should standardize the error values
returned from of_xlate after v4.12.

For add_device, however, the situation is a bit different. The add_device
operation is called from the IOMMU bus notifier, and the -ENODEV error is
ignored by add_iommu_group(). Any other error will cause bus_set_iommu()
to fail, which makes IOMMU probing fail for the drivers that check the
return value of bus_set_iommu() (some of them don't :-/).

Fixing all this properly requires standardizing the error codes, and going
through the existing IOMMU drivers to comply with the standardized
behaviour.
I understand your concern on standardizing the error codes from xlate,
add_device, others and handling them properly. As you said there are quite
some errors returned from them today. Also another thing is standardizing
the behavior of of_iommu_configure itself. So that API serves to connect a
device to its correct iommu_ops. When that's not possible, what should be
the output and how should that be handled by the caller. The current
behavior is to either 1) connect to correct ops or 2) wait for it or 3)
progress further with plain/default dma_ops. Anyways as you said
standardizing the iommu api ops, would make the of_iommu_configure handling
more specific. Having said that i think similar fix needs to be done for
acpi's iort_iommu_configure as well.
I'm less knowledgeable about ACPI but I think you're right. Would you like to 
tackle this for v4.13 ? :-)
quoted
While this shouldn't be very difficult, it's likely not material for a
v4.12- rc fix. We will thus likely need to merge this patch (or something
very similar to it), but I'd really like to see this fixed properly for
v4.13.
When you say "merge this patch (or something similar)", is that about
documenting the error values for of_xlate and add_device that you showed
down below  (or) about the patch in discussion ?
I meant the patch we're discussing, "[PATCH V2 2/3] iommu: of: Ignore all 
errors except EPROBE_DEFER". Sorry for the confusion. One more comment about 
this below.
quoted
quoted
quoted
At the very least, if you want to give a specific meaning to -ENODEV,
you should check for that value specifically and not ignore all errors
other than -EPROBE_DEFER. You also need to document the meaning of the
error value. This can be done in the documentation of the of_xlate
operation in include/linux/iommu.h:
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 2cb54adc4a33..6ba553e7384a 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -181,7 +181,6 @@ struct iommu_resv_region {
  * @domain_window_disable: Disable a particular window for a domain
  * @domain_set_windows: Set the number of windows for a domain
  * @domain_get_windows: Return the number of windows for a domain
- * @of_xlate: add OF master IDs to iommu grouping
  * @pgsize_bitmap: bitmap of all possible supported page sizes
  */
 struct iommu_ops {
@@ -224,6 +223,11 @@ struct iommu_ops {
 	/* Get the number of windows per domain */
 	u32 (*domain_get_windows)(struct iommu_domain *domain);

+	/**
+	 * @of_xlate:
+	 *
+	 * Add OF master IDs to iommu grouping.
+	 */
 	int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
 	
 	unsigned long pgsize_bitmap;
And add documentation for the error codes there.

If you want to ignore some errors returned from the add_device operation
you should document it similarly, and in particular document which error
check(s) need to be performed by of_xlate and which are the
responsibility of add_device.
quoted
Fixes: 7b07cbefb68d ("iommu: of: Handle IOMMU lookup failure with
deferred probing or error")
Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Tested-by: Magnus Damn <redacted>
Signed-off-by: Sricharan R <redacted>
---
[V2] Corrected spelling/case in commit log

 drivers/iommu/of_iommu.c | 6 ++++++
 1 file changed, 6 insertions(+)
diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
index e6e9bec..f0d22c0 100644
--- a/drivers/iommu/of_iommu.c
+++ b/drivers/iommu/of_iommu.c
@@ -237,6 +237,12 @@ const struct iommu_ops *of_iommu_configure(struct
device *dev,
			ops = ERR_PTR(err);
 	}

+	/* Ignore all other errors apart from EPROBE_DEFER */
+	if (IS_ERR(ops) && (PTR_ERR(ops) != -EPROBE_DEFER)) {
+		dev_info(dev, "Adding to IOMMU failed: %ld\n", 
PTR_ERR(ops));

I would turn this into a dev_dbg(), as at least the -ENODEV error returned 
from add_device has a defined meaning (see the comment in add_iommu_group()) 
and is in my opinion not a condition that should be reported in the kernel log 
by default.
quoted
quoted
quoted
quoted
+		ops = NULL;
+	}
+
 	return ops;
 }
-- 
Regards,

Laurent Pinchart
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help