aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/link.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2014-06-25 21:41:42 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-27 15:50:56 -0400
commit60120526c26f42fd658e32bf4a6d548483d09da8 (patch)
treed8d74d0ae3e05b1228498f5db04ff88a66b03035 /net/tipc/link.c
parentac0074ee70ddb32f62d918b31cb20e3c947c75a1 (diff)
tipc: simplify connection congestion handling
As a consequence of the recently introduced serialized access to the socket in commit 8d94168a761819d10252bab1f8de6d7b202c3baa ("tipc: same receive code path for connection protocol and data messages") we can make a number of simplifications in the detection and handling of connection congestion situations. - We don't need to keep two counters, one for sent messages and one for acked messages. There is no longer any risk for races between acknowledge messages arriving in BH and data message sending running in user context. So we merge this into one counter, 'sent_unacked', which is incremented at sending and subtracted from at acknowledge reception. - We don't need to set the 'congested' field in tipc_port to true before we sent the message, and clear it when sending is successful. (As a matter of fact, it was never necessary; the field was set in link_schedule_port() before any wakeup could arrive anyway.) - We keep the conditions for link congestion and connection connection congestion separated. There would otherwise be a risk that an arriving acknowledge message may wake up a user sleeping because of link congestion. - We can simplify reception of acknowledge messages. We also make some cosmetic/structural changes: - We rename the 'congested' field to the more correct 'link_congĀ“. - We rename 'conn_unacked' to 'rcv_unacked' - We move the above mentioned fields from struct tipc_port to struct tipc_sock. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Erik Hugne <erik.hugne@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/link.c')
-rw-r--r--net/tipc/link.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 96a8072f73cc..a081e7d08d22 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -332,13 +332,15 @@ void tipc_link_delete_list(unsigned int bearer_id, bool shutting_down)
332static int link_schedule_port(struct tipc_link *l_ptr, u32 origport, u32 sz) 332static int link_schedule_port(struct tipc_link *l_ptr, u32 origport, u32 sz)
333{ 333{
334 struct tipc_port *p_ptr; 334 struct tipc_port *p_ptr;
335 struct tipc_sock *tsk;
335 336
336 spin_lock_bh(&tipc_port_list_lock); 337 spin_lock_bh(&tipc_port_list_lock);
337 p_ptr = tipc_port_lock(origport); 338 p_ptr = tipc_port_lock(origport);
338 if (p_ptr) { 339 if (p_ptr) {
339 if (!list_empty(&p_ptr->wait_list)) 340 if (!list_empty(&p_ptr->wait_list))
340 goto exit; 341 goto exit;
341 p_ptr->congested = 1; 342 tsk = tipc_port_to_sock(p_ptr);
343 tsk->link_cong = 1;
342 p_ptr->waiting_pkts = 1 + ((sz - 1) / l_ptr->max_pkt); 344 p_ptr->waiting_pkts = 1 + ((sz - 1) / l_ptr->max_pkt);
343 list_add_tail(&p_ptr->wait_list, &l_ptr->waiting_ports); 345 list_add_tail(&p_ptr->wait_list, &l_ptr->waiting_ports);
344 l_ptr->stats.link_congs++; 346 l_ptr->stats.link_congs++;
@@ -352,6 +354,7 @@ exit:
352void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all) 354void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all)
353{ 355{
354 struct tipc_port *p_ptr; 356 struct tipc_port *p_ptr;
357 struct tipc_sock *tsk;
355 struct tipc_port *temp_p_ptr; 358 struct tipc_port *temp_p_ptr;
356 int win = l_ptr->queue_limit[0] - l_ptr->out_queue_size; 359 int win = l_ptr->queue_limit[0] - l_ptr->out_queue_size;
357 360
@@ -367,10 +370,11 @@ void tipc_link_wakeup_ports(struct tipc_link *l_ptr, int all)
367 wait_list) { 370 wait_list) {
368 if (win <= 0) 371 if (win <= 0)
369 break; 372 break;
373 tsk = tipc_port_to_sock(p_ptr);
370 list_del_init(&p_ptr->wait_list); 374 list_del_init(&p_ptr->wait_list);
371 spin_lock_bh(p_ptr->lock); 375 spin_lock_bh(p_ptr->lock);
372 p_ptr->congested = 0; 376 tsk->link_cong = 0;
373 tipc_port_wakeup(p_ptr); 377 tipc_sock_wakeup(tsk);
374 win -= p_ptr->waiting_pkts; 378 win -= p_ptr->waiting_pkts;
375 spin_unlock_bh(p_ptr->lock); 379 spin_unlock_bh(p_ptr->lock);
376 } 380 }