aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2016-06-08 12:00:05 -0400
committerDavid S. Miller <davem@davemloft.net>2016-06-08 14:27:02 -0400
commit5ca509fc0b6bcfeccf03c8c4bb5e4d1a62720c03 (patch)
tree13904d6d2fc5ee71548362698378e7206dfcbdab /net/tipc
parentc4282ca76c5b81ed73ef4c5eb5c07ee397e51642 (diff)
tipc: change node timer unit from jiffies to ms
The node keepalive interval is recalculated at each timer expiration to catch any changes in the link tolerance, and stored in a field in struct tipc_node. We use jiffies as unit for the stored value. This is suboptimal, because it makes the calculation unnecessary complex, including two unit conversions. The conversions also lead to a rounding error that causes the link "abort limit" to be 3 in the normal case, instead of 4, as intended. This again leads to unnecessary link resets when the network is pushed close to its limit, e.g., in an environment with hundreds of nodes or namesapces. In this commit, we do instead let the keepalive value be calculated and stored in milliseconds, so that there is only one conversion and the rounding error is eliminated. We also remove a redundant "keepalive" field in struct tipc_link. This is remnant from the previous implementation. Acked-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')
-rw-r--r--net/tipc/link.c2
-rw-r--r--net/tipc/node.c18
2 files changed, 10 insertions, 10 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 7059c94f33c5..a904ccd5a93a 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -87,7 +87,6 @@ struct tipc_stats {
87 * @peer_bearer_id: bearer id used by link's peer endpoint 87 * @peer_bearer_id: bearer id used by link's peer endpoint
88 * @bearer_id: local bearer id used by link 88 * @bearer_id: local bearer id used by link
89 * @tolerance: minimum link continuity loss needed to reset link [in ms] 89 * @tolerance: minimum link continuity loss needed to reset link [in ms]
90 * @keepalive_intv: link keepalive timer interval
91 * @abort_limit: # of unacknowledged continuity probes needed to reset link 90 * @abort_limit: # of unacknowledged continuity probes needed to reset link
92 * @state: current state of link FSM 91 * @state: current state of link FSM
93 * @peer_caps: bitmap describing capabilities of peer node 92 * @peer_caps: bitmap describing capabilities of peer node
@@ -131,7 +130,6 @@ struct tipc_link {
131 u32 peer_bearer_id; 130 u32 peer_bearer_id;
132 u32 bearer_id; 131 u32 bearer_id;
133 u32 tolerance; 132 u32 tolerance;
134 unsigned long keepalive_intv;
135 u32 abort_limit; 133 u32 abort_limit;
136 u32 state; 134 u32 state;
137 u16 peer_caps; 135 u16 peer_caps;
diff --git a/net/tipc/node.c b/net/tipc/node.c
index c7985b2cb759..d6a490f991a4 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -378,14 +378,13 @@ static void tipc_node_calculate_timer(struct tipc_node *n, struct tipc_link *l)
378{ 378{
379 unsigned long tol = tipc_link_tolerance(l); 379 unsigned long tol = tipc_link_tolerance(l);
380 unsigned long intv = ((tol / 4) > 500) ? 500 : tol / 4; 380 unsigned long intv = ((tol / 4) > 500) ? 500 : tol / 4;
381 unsigned long keepalive_intv = msecs_to_jiffies(intv);
382 381
383 /* Link with lowest tolerance determines timer interval */ 382 /* Link with lowest tolerance determines timer interval */
384 if (keepalive_intv < n->keepalive_intv) 383 if (intv < n->keepalive_intv)
385 n->keepalive_intv = keepalive_intv; 384 n->keepalive_intv = intv;
386 385
387 /* Ensure link's abort limit corresponds to current interval */ 386 /* Ensure link's abort limit corresponds to current tolerance */
388 tipc_link_set_abort_limit(l, tol / jiffies_to_msecs(n->keepalive_intv)); 387 tipc_link_set_abort_limit(l, tol / n->keepalive_intv);
389} 388}
390 389
391static void tipc_node_delete(struct tipc_node *node) 390static void tipc_node_delete(struct tipc_node *node)
@@ -526,7 +525,7 @@ static void tipc_node_timeout(unsigned long data)
526 if (rc & TIPC_LINK_DOWN_EVT) 525 if (rc & TIPC_LINK_DOWN_EVT)
527 tipc_node_link_down(n, bearer_id, false); 526 tipc_node_link_down(n, bearer_id, false);
528 } 527 }
529 mod_timer(&n->timer, jiffies + n->keepalive_intv); 528 mod_timer(&n->timer, jiffies + msecs_to_jiffies(n->keepalive_intv));
530} 529}
531 530
532/** 531/**
@@ -735,6 +734,7 @@ void tipc_node_check_dest(struct net *net, u32 onode,
735 bool accept_addr = false; 734 bool accept_addr = false;
736 bool reset = true; 735 bool reset = true;
737 char *if_name; 736 char *if_name;
737 unsigned long intv;
738 738
739 *dupl_addr = false; 739 *dupl_addr = false;
740 *respond = false; 740 *respond = false;
@@ -840,9 +840,11 @@ void tipc_node_check_dest(struct net *net, u32 onode,
840 le->link = l; 840 le->link = l;
841 n->link_cnt++; 841 n->link_cnt++;
842 tipc_node_calculate_timer(n, l); 842 tipc_node_calculate_timer(n, l);
843 if (n->link_cnt == 1) 843 if (n->link_cnt == 1) {
844 if (!mod_timer(&n->timer, jiffies + n->keepalive_intv)) 844 intv = jiffies + msecs_to_jiffies(n->keepalive_intv);
845 if (!mod_timer(&n->timer, intv))
845 tipc_node_get(n); 846 tipc_node_get(n);
847 }
846 } 848 }
847 memcpy(&le->maddr, maddr, sizeof(*maddr)); 849 memcpy(&le->maddr, maddr, sizeof(*maddr));
848exit: 850exit: