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>
This commit is contained in:
committed by
David S. Miller
parent
c4282ca76c
commit
5ca509fc0b
+10
-8
@@ -378,14 +378,13 @@ static void tipc_node_calculate_timer(struct tipc_node *n, struct tipc_link *l)
|
||||
{
|
||||
unsigned long tol = tipc_link_tolerance(l);
|
||||
unsigned long intv = ((tol / 4) > 500) ? 500 : tol / 4;
|
||||
unsigned long keepalive_intv = msecs_to_jiffies(intv);
|
||||
|
||||
/* Link with lowest tolerance determines timer interval */
|
||||
if (keepalive_intv < n->keepalive_intv)
|
||||
n->keepalive_intv = keepalive_intv;
|
||||
if (intv < n->keepalive_intv)
|
||||
n->keepalive_intv = intv;
|
||||
|
||||
/* Ensure link's abort limit corresponds to current interval */
|
||||
tipc_link_set_abort_limit(l, tol / jiffies_to_msecs(n->keepalive_intv));
|
||||
/* Ensure link's abort limit corresponds to current tolerance */
|
||||
tipc_link_set_abort_limit(l, tol / n->keepalive_intv);
|
||||
}
|
||||
|
||||
static void tipc_node_delete(struct tipc_node *node)
|
||||
@@ -526,7 +525,7 @@ static void tipc_node_timeout(unsigned long data)
|
||||
if (rc & TIPC_LINK_DOWN_EVT)
|
||||
tipc_node_link_down(n, bearer_id, false);
|
||||
}
|
||||
mod_timer(&n->timer, jiffies + n->keepalive_intv);
|
||||
mod_timer(&n->timer, jiffies + msecs_to_jiffies(n->keepalive_intv));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -735,6 +734,7 @@ void tipc_node_check_dest(struct net *net, u32 onode,
|
||||
bool accept_addr = false;
|
||||
bool reset = true;
|
||||
char *if_name;
|
||||
unsigned long intv;
|
||||
|
||||
*dupl_addr = false;
|
||||
*respond = false;
|
||||
@@ -840,9 +840,11 @@ void tipc_node_check_dest(struct net *net, u32 onode,
|
||||
le->link = l;
|
||||
n->link_cnt++;
|
||||
tipc_node_calculate_timer(n, l);
|
||||
if (n->link_cnt == 1)
|
||||
if (!mod_timer(&n->timer, jiffies + n->keepalive_intv))
|
||||
if (n->link_cnt == 1) {
|
||||
intv = jiffies + msecs_to_jiffies(n->keepalive_intv);
|
||||
if (!mod_timer(&n->timer, intv))
|
||||
tipc_node_get(n);
|
||||
}
|
||||
}
|
||||
memcpy(&le->maddr, maddr, sizeof(*maddr));
|
||||
exit:
|
||||
|
||||
Reference in New Issue
Block a user