• Saravana Kannan's avatar
    driver core: fw_devlink: Make cycle detection more robust · 3fb16866
    Saravana Kannan authored
    fw_devlink could only detect a single and simple cycle because it relied
    mainly on device link cycle detection code that only checked for cycles
    between devices. The expectation was that the firmware wouldn't have
    complicated cycles and multiple cycles between devices. That expectation
    has been proven to be wrong.
    
    For example, fw_devlink could handle:
    
    +-+        +-+
    |A+------> |B+
    +-+        +++
     ^          |
     |          |
     +----------+
    
    But it couldn't handle even something as "simple" as:
    
     +---------------------+
     |                     |
     v                     |
    +-+        +-+        +++
    |A+------> |B+------> |C|
    +-+        +++        +-+
     ^          |
     |          |
     +----------+
    
    But firmware has even more complicated cycles like:
    
        +---------------------+
        |                     |
        v                     |
       +-+       +---+       +++
    +--+A+------>| B +-----> |C|<--+
    |  +-+       ++--+       +++   |
    |   ^         | ^         |    |
    |   |         | |         |    |
    |   +---------+ +---------+    |
    |                              |
    +------------------------------+
    
    And this is without including parent child dependencies or nodes in the
    cycle that are just firmware nodes that'll never have a struct device
    created for them.
    
    The proper way to treat these devices it to not force any probe ordering
    between them, while still enforce dependencies between node in the
    cycles (A, B and C) and their consumers.
    
    So this patch goes all out and just deals with all types of cycles. It
    does this by:
    
    1. Following dependencies across device links, parent-child and fwnode
       links.
    2. When it find cycles, it mark the device links and fwnode links as
       such instead of just deleting them or making the indistinguishable
       from proxy SYNC_STATE_ONLY device links.
    
    This way, when new nodes get added, we can immediately find and mark any
    new cycles whether the new node is a device or firmware node.
    
    Fixes: 2de9d8e0 ("driver core: fw_devlink: Improve handling of cyclic dependencies")
    Signed-off-by: default avatarSaravana Kannan <saravanak@google.com>
    Tested-by: default avatarColin Foster <colin.foster@in-advantage.com>
    Tested-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Tested-by: default avatarDouglas Anderson <dianders@chromium.org>
    Tested-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Tested-by: Luca Weiss <luca.weiss@fairphone.com> # qcom/sm7225-fairphone-fp4
    Link: https://lore.kernel.org/r/20230207014207.1678715-9-saravanak@google.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3fb16866
core.c 138 KB