Thread (36 messages) 36 messages, 5 authors, 2016-09-06

[PATCH v2 06/10] driver core: Avoid endless recursion if device has more than one link

From: Rafael J. Wysocki <hidden>
Date: 2016-09-06 23:03:47
Also in: linux-iommu, linux-pm, linux-samsung-soc, lkml

On Friday, June 17, 2016 08:26:56 AM Marek Szyprowski wrote:
quoted hunk ↗ jump to hunk
This patch fixes endless recursion, which happends when device has
more than one link.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
 drivers/base/core.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 215cd44de761..4e778539b750 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -57,7 +57,8 @@ static int device_reorder_to_tail(struct device *dev, void *not_used)
 	device_pm_move_last(dev);
 	device_for_each_child(dev, NULL, device_reorder_to_tail);
 	list_for_each_entry(link, &dev->consumer_links, c_node)
-		device_reorder_to_tail(link->consumer, NULL);
+		if (link->consumer != dev)
+			device_reorder_to_tail(link->consumer, NULL);
 
 	return 0;
 }
If I'm not mistaken, this should not be necessary unless dev has a link
pointing to itself as a consumer.  That would be a bug, though.

I can add a WARN_ON() to catch this case, but then if there's a link from
a consumer of dev pointing back to dev as a consumer, that still will loop
forever.

I guess we need to detect circular dependencies and fail link creation in
such cases.  Oh well.

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