Commit 88e8ac70 authored by Jon Paul Maloy's avatar Jon Paul Maloy Committed by David S. Miller

tipc: reduce transmission rate of reset messages when link is down

When a link is down, it will continuously try to re-establish contact
with the peer by sending out a RESET or an ACTIVATE message at each
timeout interval. The default value for this interval is currently
375 ms. This is wasteful, and may become a problem in very large
clusters with dozens or hundreds of nodes being down simultaneously.

We now introduce a simple backoff algorithm for these cases. The
first five messages are sent at default rate; thereafter a message
is sent only each 16th timer interval.

This will cover the vast majority of link recycling cases, since the
endpoint starting last will transmit at the higher speed, and the link
should normally be established well be before the rate needs to be
reduced.

The only case where we will see a degradation of link re-establishment
times is when the endpoints remain intact, and a glitch in the
transmission media is causing the link reset. We will then experience
a worst-case re-establishing time of 6 seconds, something we deem
acceptable.
Acked-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>
parent 634696b1
...@@ -140,6 +140,7 @@ struct tipc_link { ...@@ -140,6 +140,7 @@ struct tipc_link {
char if_name[TIPC_MAX_IF_NAME]; char if_name[TIPC_MAX_IF_NAME];
u32 priority; u32 priority;
char net_plane; char net_plane;
u16 rst_cnt;
/* Failover/synch */ /* Failover/synch */
u16 drop_point; u16 drop_point;
...@@ -699,8 +700,6 @@ static void link_profile_stats(struct tipc_link *l) ...@@ -699,8 +700,6 @@ static void link_profile_stats(struct tipc_link *l)
l->stats.msg_length_profile[6]++; l->stats.msg_length_profile[6]++;
} }
/* tipc_link_timeout - perform periodic task as instructed from node timeout
*/
/* tipc_link_timeout - perform periodic task as instructed from node timeout /* tipc_link_timeout - perform periodic task as instructed from node timeout
*/ */
int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq) int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq)
...@@ -730,7 +729,8 @@ int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq) ...@@ -730,7 +729,8 @@ int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq)
l->silent_intv_cnt++; l->silent_intv_cnt++;
break; break;
case LINK_RESET: case LINK_RESET:
xmit = true; xmit = l->rst_cnt++ <= 4;
xmit |= !(l->rst_cnt % 16);
mtyp = RESET_MSG; mtyp = RESET_MSG;
break; break;
case LINK_ESTABLISHING: case LINK_ESTABLISHING:
...@@ -833,6 +833,7 @@ void tipc_link_reset(struct tipc_link *l) ...@@ -833,6 +833,7 @@ void tipc_link_reset(struct tipc_link *l)
l->rcv_nxt = 1; l->rcv_nxt = 1;
l->acked = 0; l->acked = 0;
l->silent_intv_cnt = 0; l->silent_intv_cnt = 0;
l->rst_cnt = 0;
l->stats.recv_info = 0; l->stats.recv_info = 0;
l->stale_count = 0; l->stale_count = 0;
l->bc_peer_is_up = false; l->bc_peer_is_up = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment