aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/link.h
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-02-03 08:59:17 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-04 19:09:31 -0500
commit2d72d49553d8de113d4eb1f69b2291f449a4c6bc (patch)
treec4b865c7d4a4e7b81438bba58042741865b403ae /net/tipc/link.h
parent940288b6a560710d4c63bc84d9570779dd7dec2b (diff)
tipc: add reference count to struct tipc_link
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: Erik Hugne <erik.hugne@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/link.h')
-rw-r--r--net/tipc/link.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/tipc/link.h b/net/tipc/link.h
index 9df7fa4d3bdd..f06b779c9f75 100644
--- a/net/tipc/link.h
+++ b/net/tipc/link.h
@@ -103,6 +103,7 @@ struct tipc_stats {
103 * @media_addr: media address to use when sending messages over link 103 * @media_addr: media address to use when sending messages over link
104 * @timer: link timer 104 * @timer: link timer
105 * @owner: pointer to peer node 105 * @owner: pointer to peer node
106 * @refcnt: reference counter for permanent references (owner node & timer)
106 * @flags: execution state flags for link endpoint instance 107 * @flags: execution state flags for link endpoint instance
107 * @checkpoint: reference point for triggering link continuity checking 108 * @checkpoint: reference point for triggering link continuity checking
108 * @peer_session: link session # being used by peer end of link 109 * @peer_session: link session # being used by peer end of link
@@ -142,6 +143,7 @@ struct tipc_link {
142 struct tipc_media_addr media_addr; 143 struct tipc_media_addr media_addr;
143 struct timer_list timer; 144 struct timer_list timer;
144 struct tipc_node *owner; 145 struct tipc_node *owner;
146 struct kref ref;
145 147
146 /* Management and link supervision data */ 148 /* Management and link supervision data */
147 unsigned int flags; 149 unsigned int flags;