• Jakub Kicinski's avatar
    devlink: remove the registration guarantee of references · 9053637e
    Jakub Kicinski authored
    The objective of exposing the devlink instance locks to
    drivers was to let them use these locks to prevent user space
    from accessing the device before it's fully initialized.
    This is difficult because devlink_unregister() waits for all
    references to be released, meaning that devlink_unregister()
    can't itself be called under the instance lock.
    
    To avoid this issue devlink_register() was moved after subobject
    registration a while ago. Unfortunately the netdev paths get
    a hold of the devlink instances _before_ they are registered.
    Ideally netdev should wait for devlink init to finish (synchronizing
    on the instance lock). This can't work because we don't know if the
    instance will _ever_ be registered (in case of failures it may not).
    The other option of returning an error until devlink_register()
    is called is unappealing (user space would get a notification
    netdev exist but would have to wait arbitrary amount of time
    before accessing some of its attributes).
    
    Weaken the guarantees of the devlink references.
    
    Holding a reference will now only guarantee that the memory
    of the object is around. Another way of looking at it is that
    the reference now protects the object not its "registered" status.
    Use devlink instance lock to synchronize unregistration.
    
    This implies that releasing of the "main" reference of the devlink
    instance moves from devlink_unregister() to devlink_free().
    Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9053637e
devlink.h 68.9 KB