Skip to content
  • James Smart's avatar
    nvme-fc: decouple ns references from lldd references · 158bfb88
    James Smart authored
    
    
    In the lldd api, a lldd may unregister a remoteport (loss of connectivity
    or driver unload) or localport (driver unload). The lldd must wait for the
    remoteport_delete or localport_delete before completing its actions post
    the unregister.  The xxx_deletes currently occur only when the xxxport
    structure is fully freed after all references are removed. Thus the lldd
    may be held hostage until an app or in-kernel entity that has a namespace
    open finally closes so the namespace can be removed, the controller
    removed, thus the transport objects, thus the lldd.
    
    This patch decouples the transport and os-facing objects from the lldd
    and the remoteport and localport. There is a point in all deletions
    where the transport will no longer interact with the lldd on behalf of
    a controller. That point centers around the association established
    with the target/subsystem. It will access the lldd whenever it attempts
    to create an association and while the association is active. New
    associations may only be created if the remoteport is live (thus the
    localport is live). It will not access the lldd after deleting the
    association.
    
    Therefore, the patch tracks the count of active controllers - those with
    associations being created or that are active - on a remoteport. It also
    tracks the number of remoteports that have active controllers, on a
    a localport. When a remoteport is unregistered, as soon as there are no
    active controllers, the lldd's remoteport_delete may be called and the
    lldd may continue. Similarly, when a localport is unregistered, as soon
    as there are no remoteports with active controllers, the localport_delete
    callback may be made. This significantly speeds up unregistration with
    the lldd.
    
    The transport objects continue in suspended status with reconnect timers
    running, and upon expiration, normal ref-counting will occur and the
    objects will be freed. The transport object may still be held hostage
    by the application/kernel module, but that is acceptable.
    
    With this change, the lldd may be fully unloaded and reloaded, and
    if registrations occur prior to the timeouts, the nvme controller and
    namespaces will resume normally as if a link bounce.
    
    Signed-off-by: default avatarJames Smart <james.smart@broadcom.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    158bfb88