Skip to content

Commit 2de9d8e

Browse files
Saravana Kannangregkh
authored andcommitted
driver core: fw_devlink: Improve handling of cyclic dependencies
When we have a dependency of the form: Device-A -> Device-C Device-B Device-C -> Device-B Where, * Indentation denotes "child of" parent in previous line. * X -> Y denotes X is consumer of Y based on firmware (Eg: DT). We have cyclic dependency: device-A -> device-C -> device-B -> device-A fw_devlink current treats device-C -> device-B dependency as an invalid dependency and doesn't enforce it but leaves the rest of the dependencies as is. While the current behavior is necessary, it is not sufficient if the false dependency in this example is actually device-A -> device-C. When this is the case, device-C will correctly probe defer waiting for device-B to be added, but device-A will be incorrectly probe deferred by fw_devlink waiting on device-C to probe successfully. Due to this, none of the devices in the cycle will end up probing. To fix this, we need to go relax all the dependencies in the cycle like we already do in the other instances where fw_devlink detects cycles. A real world example of this was reported[1] and analyzed[2]. [1] - https://lore.kernel.org/lkml/[email protected]/ [2] - https://lore.kernel.org/lkml/CAGETcx8peaew90SWiux=TyvuGgvTQOmO4BFALz7aj0Za5QdNFQ@mail.gmail.com/ Fixes: f9aa460 ("driver core: Refactor fw_devlink feature") Cc: stable <[email protected]> Reported-by: Marek Szyprowski <[email protected]> Tested-by: Marek Szyprowski <[email protected]> Signed-off-by: Saravana Kannan <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent c86a2d9 commit 2de9d8e

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

drivers/base/core.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,14 +1772,21 @@ static int fw_devlink_create_devlink(struct device *con,
17721772
* be broken by applying logic. Check for these types of cycles and
17731773
* break them so that devices in the cycle probe properly.
17741774
*
1775-
* If the supplier's parent is dependent on the consumer, then
1776-
* the consumer-supplier dependency is a false dependency. So,
1777-
* treat it as an invalid link.
1775+
* If the supplier's parent is dependent on the consumer, then the
1776+
* consumer and supplier have a cyclic dependency. Since fw_devlink
1777+
* can't tell which of the inferred dependencies are incorrect, don't
1778+
* enforce probe ordering between any of the devices in this cyclic
1779+
* dependency. Do this by relaxing all the fw_devlink device links in
1780+
* this cycle and by treating the fwnode link between the consumer and
1781+
* the supplier as an invalid dependency.
17781782
*/
17791783
sup_dev = fwnode_get_next_parent_dev(sup_handle);
17801784
if (sup_dev && device_is_dependent(con, sup_dev)) {
1781-
dev_dbg(con, "Not linking to %pfwP - False link\n",
1782-
sup_handle);
1785+
dev_info(con, "Fixing up cyclic dependency with %pfwP (%s)\n",
1786+
sup_handle, dev_name(sup_dev));
1787+
device_links_write_lock();
1788+
fw_devlink_relax_cycle(con, sup_dev);
1789+
device_links_write_unlock();
17831790
ret = -EINVAL;
17841791
} else {
17851792
/*

0 commit comments

Comments
 (0)