aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2014-01-07 17:02:44 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-07 18:44:26 -0500
commit581465fa285863344efc233bc546823bfabd295f (patch)
treea60f322078d1d53319ef2ece706ac96470bf3cc0 /net/tipc
parentf9a2c80b8b7366748a1c3975df07f4a34aa80538 (diff)
tipc: make link start event synchronous
When a link is created we delay the start event by launching it to be executed later in a tasklet. As we hold all the necessary locks at the moment of creation, and there is no risk of deadlock or contention, this delay serves no purpose in the current code. We remove this obsolete indirection step, and the associated function link_start(). At the same time, we rename the function tipc_link_stop() to the more appropriate tipc_link_purge_queues(). Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Paul Gortmaker <paul.gortmaker@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bcast.c2
-rw-r--r--net/tipc/link.c16
-rw-r--r--net/tipc/link.h2
3 files changed, 7 insertions, 13 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index 4c2a80b3c01e..bf860d9e75af 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -794,7 +794,7 @@ void tipc_bclink_init(void)
794void tipc_bclink_stop(void) 794void tipc_bclink_stop(void)
795{ 795{
796 spin_lock_bh(&bc_lock); 796 spin_lock_bh(&bc_lock);
797 tipc_link_stop(bcl); 797 tipc_link_purge_queues(bcl);
798 spin_unlock_bh(&bc_lock); 798 spin_unlock_bh(&bc_lock);
799 799
800 memset(bclink, 0, sizeof(*bclink)); 800 memset(bclink, 0, sizeof(*bclink));
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 9fb0f6b96b45..471973ff134f 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -87,7 +87,6 @@ static int link_send_sections_long(struct tipc_port *sender,
87static void link_state_event(struct tipc_link *l_ptr, u32 event); 87static void link_state_event(struct tipc_link *l_ptr, u32 event);
88static void link_reset_statistics(struct tipc_link *l_ptr); 88static void link_reset_statistics(struct tipc_link *l_ptr);
89static void link_print(struct tipc_link *l_ptr, const char *str); 89static void link_print(struct tipc_link *l_ptr, const char *str);
90static void link_start(struct tipc_link *l_ptr);
91static int link_send_long_buf(struct tipc_link *l_ptr, struct sk_buff *buf); 90static int link_send_long_buf(struct tipc_link *l_ptr, struct sk_buff *buf);
92static void tipc_link_send_sync(struct tipc_link *l); 91static void tipc_link_send_sync(struct tipc_link *l);
93static void tipc_link_recv_sync(struct tipc_node *n, struct sk_buff *buf); 92static void tipc_link_recv_sync(struct tipc_node *n, struct sk_buff *buf);
@@ -281,7 +280,8 @@ struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
281 k_init_timer(&l_ptr->timer, (Handler)link_timeout, 280 k_init_timer(&l_ptr->timer, (Handler)link_timeout,
282 (unsigned long)l_ptr); 281 (unsigned long)l_ptr);
283 list_add_tail(&l_ptr->link_list, &b_ptr->links); 282 list_add_tail(&l_ptr->link_list, &b_ptr->links);
284 tipc_k_signal((Handler)link_start, (unsigned long)l_ptr); 283
284 link_state_event(l_ptr, STARTING_EVT);
285 285
286 return l_ptr; 286 return l_ptr;
287} 287}
@@ -306,19 +306,13 @@ void tipc_link_delete(struct tipc_link *l_ptr)
306 tipc_node_lock(l_ptr->owner); 306 tipc_node_lock(l_ptr->owner);
307 tipc_link_reset(l_ptr); 307 tipc_link_reset(l_ptr);
308 tipc_node_detach_link(l_ptr->owner, l_ptr); 308 tipc_node_detach_link(l_ptr->owner, l_ptr);
309 tipc_link_stop(l_ptr); 309 tipc_link_purge_queues(l_ptr);
310 list_del_init(&l_ptr->link_list); 310 list_del_init(&l_ptr->link_list);
311 tipc_node_unlock(l_ptr->owner); 311 tipc_node_unlock(l_ptr->owner);
312 k_term_timer(&l_ptr->timer); 312 k_term_timer(&l_ptr->timer);
313 kfree(l_ptr); 313 kfree(l_ptr);
314} 314}
315 315
316static void link_start(struct tipc_link *l_ptr)
317{
318 tipc_node_lock(l_ptr->owner);
319 link_state_event(l_ptr, STARTING_EVT);
320 tipc_node_unlock(l_ptr->owner);
321}
322 316
323/** 317/**
324 * link_schedule_port - schedule port for deferred sending 318 * link_schedule_port - schedule port for deferred sending
@@ -404,10 +398,10 @@ void tipc_link_reset_fragments(struct tipc_link *l_ptr)
404} 398}
405 399
406/** 400/**
407 * tipc_link_stop - purge all inbound and outbound messages associated with link 401 * tipc_link_purge_queues - purge all pkt queues associated with link
408 * @l_ptr: pointer to link 402 * @l_ptr: pointer to link
409 */ 403 */
410void tipc_link_stop(struct tipc_link *l_ptr) 404void tipc_link_purge_queues(struct tipc_link *l_ptr)
411{ 405{
412 kfree_skb_list(l_ptr->oldest_deferred_in); 406 kfree_skb_list(l_ptr->oldest_deferred_in);
413 kfree_skb_list(l_ptr->first_out); 407 kfree_skb_list(l_ptr->first_out);
diff --git a/net/tipc/link.h b/net/tipc/link.h
index 89ab89be848d..3b6aa65b608c 100644
--- a/net/tipc/link.h
+++ b/net/tipc/link.h
@@ -222,7 +222,7 @@ void tipc_link_dup_send_queue(struct tipc_link *l_ptr,
222void tipc_link_reset_fragments(struct tipc_link *l_ptr); 222void tipc_link_reset_fragments(struct tipc_link *l_ptr);
223int tipc_link_is_up(struct tipc_link *l_ptr); 223int tipc_link_is_up(struct tipc_link *l_ptr);
224int tipc_link_is_active(struct tipc_link *l_ptr); 224int tipc_link_is_active(struct tipc_link *l_ptr);
225void tipc_link_stop(struct tipc_link *l_ptr); 225void tipc_link_purge_queues(struct tipc_link *l_ptr);
226struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, 226struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area,
227 int req_tlv_space, 227 int req_tlv_space,
228 u16 cmd); 228 u16 cmd);