• Rafael J. Wysocki's avatar
    driver core: Fix adding device links to probing suppliers · 15cfb094
    Rafael J. Wysocki authored
    Currently, it is not valid to add a device link from a consumer
    driver ->probe callback to a supplier that is still probing too, but
    generally this is a valid use case.  For example, if the consumer has
    just acquired a resource that can only be available if the supplier
    is functional, adding a device link to that supplier right away
    should be safe (and even desirable arguably), but device_link_add()
    doesn't handle that case correctly and the initial state of the link
    created by it is wrong then.
    
    To address this problem, change the initial state of device links
    added between a probing supplier and a probing consumer to
    DL_STATE_CONSUMER_PROBE and update device_links_driver_bound() to
    skip such links on the supplier side.
    
    With this change, if the supplier probe completes first,
    device_links_driver_bound() called for it will skip the link state
    update and when it is called for the consumer, the link state will
    be updated to "active".  In turn, if the consumer probe completes
    first, device_links_driver_bound() called for it will change the
    state of the link to "active" and when it is called for the
    supplier, the link status update will be skipped.
    
    However, in principle the supplier or consumer probe may still fail
    after the link has been added, so modify device_links_no_driver() to
    change device links in the "active" or "consumer probe" state to
    "dormant" on the supplier side and update __device_links_no_driver()
    to change the link state to "available" only if it is "consumer
    probe" or "active".
    
    Then, if the supplier probe fails first, the leftover link to the
    probing consumer will become "dormant" and device_links_no_driver()
    called for the consumer (when its probe fails) will clean it up.
    In turn, if the consumer probe fails first, it will either drop the
    link, or change its state to "available" and, in the latter case,
    when device_links_no_driver() is called for the supplier, it will
    update the link state to "dormant".  [If the supplier probe fails,
    but the consumer probe succeeds, which should not happen as long as
    the consumer driver is correct, the link still will be around, but
    it will be "dormant" until the supplier is probed again.]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    15cfb094
core.c 85.2 KB