Commit a35ee541 authored by Yevgeny Petrilin's avatar Yevgeny Petrilin Committed by David S. Miller

mlx4_en: Adaptive moderation policy change

If the net device is identified as "sender" (number of sent packets
is higher then the number of received packets and the incoming packets are
small), set the moderation time to its low limit.
We do it because the incoming packets are acks, and we don't want to delay them
Signed-off-by: default avatarYevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6cb87823
...@@ -414,6 +414,7 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv) ...@@ -414,6 +414,7 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
unsigned long avg_pkt_size; unsigned long avg_pkt_size;
unsigned long rx_packets; unsigned long rx_packets;
unsigned long rx_bytes; unsigned long rx_bytes;
unsigned long rx_byte_diff;
unsigned long tx_packets; unsigned long tx_packets;
unsigned long tx_pkt_diff; unsigned long tx_pkt_diff;
unsigned long rx_pkt_diff; unsigned long rx_pkt_diff;
...@@ -437,6 +438,8 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv) ...@@ -437,6 +438,8 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
rx_pkt_diff = ((unsigned long) (rx_packets - rx_pkt_diff = ((unsigned long) (rx_packets -
priv->last_moder_packets)); priv->last_moder_packets));
packets = max(tx_pkt_diff, rx_pkt_diff); packets = max(tx_pkt_diff, rx_pkt_diff);
rx_byte_diff = rx_bytes - priv->last_moder_bytes;
rx_byte_diff = rx_byte_diff ? rx_byte_diff : 1;
rate = packets * HZ / period; rate = packets * HZ / period;
avg_pkt_size = packets ? ((unsigned long) (rx_bytes - avg_pkt_size = packets ? ((unsigned long) (rx_bytes -
priv->last_moder_bytes)) / packets : 0; priv->last_moder_bytes)) / packets : 0;
...@@ -447,10 +450,13 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv) ...@@ -447,10 +450,13 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
/* If tx and rx packet rates are not balanced, assume that /* If tx and rx packet rates are not balanced, assume that
* traffic is mainly BW bound and apply maximum moderation. * traffic is mainly BW bound and apply maximum moderation.
* Otherwise, moderate according to packet rate */ * Otherwise, moderate according to packet rate */
if (2 * tx_pkt_diff > 3 * rx_pkt_diff || if (2 * tx_pkt_diff > 3 * rx_pkt_diff &&
2 * rx_pkt_diff > 3 * tx_pkt_diff) { rx_pkt_diff / rx_byte_diff <
MLX4_EN_SMALL_PKT_SIZE)
moder_time = priv->rx_usecs_low;
else if (2 * rx_pkt_diff > 3 * tx_pkt_diff)
moder_time = priv->rx_usecs_high; moder_time = priv->rx_usecs_high;
} else { else {
if (rate < priv->pkt_rate_low) if (rate < priv->pkt_rate_low)
moder_time = priv->rx_usecs_low; moder_time = priv->rx_usecs_low;
else if (rate > priv->pkt_rate_high) else if (rate > priv->pkt_rate_high)
......
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