• Rafael J. Wysocki's avatar
    driver core: Make driver core own stateful device links · 72175d4e
    Rafael J. Wysocki authored
    Even though stateful device links are managed by the driver core in
    principle, their creators are allowed and sometimes even expected
    to drop references to them via device_link_del() or
    device_link_remove(), but that doesn't really play well with the
    "persistent" link concept.
    
    If "persistent" managed device links are created from driver
    probe callbacks, device_link_add() called to do that will take a
    new reference on the link each time the callback runs and those
    references will never be dropped, which kind of isn't nice.
    
    This issues arises because of the link reference counting carried
    out by device_link_add() for existing links, but that is only done to
    avoid deleting device links that may still be necessary, which
    shouldn't be a concern for managed (stateful) links.  These device
    links are managed by the driver core and whoever creates one of them
    will need it at least as long as until the consumer driver is detached
    from its device and deleting it may be left to the driver core just
    fine.
    
    For this reason, rework device_link_add() to apply the reference
    counting to stateless links only and make device_link_del() and
    device_link_remove() drop references to stateless links only too.
    After this change, if called to add a stateful device link for
    a consumer-supplier pair for which a stateful device link is
    present already, device_link_add() will return the existing link
    without incrementing its reference counter.  Accordingly,
    device_link_del() and device_link_remove() will WARN() and do
    nothing when called to drop a reference to a stateful link.  Thus,
    effectively, all stateful device links will be owned by the driver
    core.
    
    In addition, clean up the handling of the link management flags,
    DL_FLAG_AUTOREMOVE_CONSUMER and DL_FLAG_AUTOREMOVE_SUPPLIER, so that
    (a) they are never set at the same time and (b) if device_link_add()
    is called for a consumer-supplier pair with an existing stateful link
    between them, the flags of that link will be combined with the flags
    passed to device_link_add() to ensure that the life time of the link
    is sufficient for all of the callers of device_link_add() for the
    same consumer-supplier pair.
    
    Update the device_link_add() kerneldoc comment to reflect the
    above changes.
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    72175d4e
core.c 86.9 KB