diff options
author | Sven Eckelmann <sven@narfation.org> | 2015-06-22 03:13:23 -0400 |
---|---|---|
committer | Antonio Quartulli <antonio@meshcoding.com> | 2015-08-11 12:10:04 -0400 |
commit | e071d93eb40c969dc8c578dde5ddd89a30fb01cb (patch) | |
tree | f32db816f78240c73b810137f3a8d360955cde2b /net/batman-adv | |
parent | 07a51cd3794960548627a27aae68c1446341db32 (diff) |
batman-adv: Replace gw_reselect divisor with simple shift
The gw_factor is divided by BATADV_TQ_LOCAL_WINDOW_SIZE ** 2 * 64. But the
rest of the calculation has nothing to do with the tq window size and
therefore the calculation is just (tmp_gw_factor / (64 ** 3)).
Replace it with a simple shift to avoid a costly 64-bit divide when the
max_gw_factor is changed from u32 to u64. This type change is necessary
to avoid an overflow bug.
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: Antonio Quartulli <antonio@meshcoding.com>
Diffstat (limited to 'net/batman-adv')
-rw-r--r-- | net/batman-adv/gateway_client.c | 6 |
1 files changed, 1 insertions, 5 deletions
diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c index bb0158620628..e1e1f317b915 100644 --- a/net/batman-adv/gateway_client.c +++ b/net/batman-adv/gateway_client.c | |||
@@ -154,14 +154,10 @@ batadv_gw_get_best_gw_node(struct batadv_priv *bat_priv) | |||
154 | struct batadv_neigh_ifinfo *router_ifinfo; | 154 | struct batadv_neigh_ifinfo *router_ifinfo; |
155 | struct batadv_gw_node *gw_node, *curr_gw = NULL; | 155 | struct batadv_gw_node *gw_node, *curr_gw = NULL; |
156 | uint32_t max_gw_factor = 0, tmp_gw_factor = 0; | 156 | uint32_t max_gw_factor = 0, tmp_gw_factor = 0; |
157 | uint32_t gw_divisor; | ||
158 | uint8_t max_tq = 0; | 157 | uint8_t max_tq = 0; |
159 | uint8_t tq_avg; | 158 | uint8_t tq_avg; |
160 | struct batadv_orig_node *orig_node; | 159 | struct batadv_orig_node *orig_node; |
161 | 160 | ||
162 | gw_divisor = BATADV_TQ_LOCAL_WINDOW_SIZE * BATADV_TQ_LOCAL_WINDOW_SIZE; | ||
163 | gw_divisor *= 64; | ||
164 | |||
165 | rcu_read_lock(); | 161 | rcu_read_lock(); |
166 | hlist_for_each_entry_rcu(gw_node, &bat_priv->gw.list, list) { | 162 | hlist_for_each_entry_rcu(gw_node, &bat_priv->gw.list, list) { |
167 | if (gw_node->deleted) | 163 | if (gw_node->deleted) |
@@ -187,7 +183,7 @@ batadv_gw_get_best_gw_node(struct batadv_priv *bat_priv) | |||
187 | tmp_gw_factor = tq_avg * tq_avg; | 183 | tmp_gw_factor = tq_avg * tq_avg; |
188 | tmp_gw_factor *= gw_node->bandwidth_down; | 184 | tmp_gw_factor *= gw_node->bandwidth_down; |
189 | tmp_gw_factor *= 100 * 100; | 185 | tmp_gw_factor *= 100 * 100; |
190 | tmp_gw_factor /= gw_divisor; | 186 | tmp_gw_factor >>= 18; |
191 | 187 | ||
192 | if ((tmp_gw_factor > max_gw_factor) || | 188 | if ((tmp_gw_factor > max_gw_factor) || |
193 | ((tmp_gw_factor == max_gw_factor) && | 189 | ((tmp_gw_factor == max_gw_factor) && |