• Jon Paul Maloy's avatar
    tipc: add reference count to struct tipc_link · 2d72d495
    Jon Paul Maloy authored
    When a bearer is disabled, all pertaining links will be reset and
    deleted. However, if there is a second active link towards a killed
    link's destination, the delete has to be postponed until the failover
    is finished. During this interval, we currently put the link in zombie
    mode, i.e., we take it out of traffic, delete its timer, but leave it
    attached to the owner node structure until all missing packets have
    been received.  When this is done, we detach the link from its node
    and delete it, assuming that the synchronous timer deletion that was
    initiated earlier in a different thread has finished.
    
    This is unsafe, as the failover may finish before del_timer_sync()
    has returned in the other thread.
    
    We fix this by adding an atomic reference counter of type kref in
    struct tipc_link. The counter keeps track of the references kept
    to the link by the owner node and the timer. We then do a conditional
    delete, based on the reference counter, both after the failover has
    been finished and when the timer expires, if applicable. Whoever
    comes last, will actually delete the link. This approach also implies
    that we can make the deletion of the timer asynchronous.
    Reviewed-by: default avatarErik Hugne <erik.hugne@ericsson.com>
    Reviewed-by: default avatarYing Xue <ying.xue@windriver.com>
    Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2d72d495
link.h 10.4 KB