aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mlx4
diff options
context:
space:
mode:
authorYevgeny Petrilin <yevgenyp@mellanox.co.il>2009-08-06 22:27:28 -0400
committerDavid S. Miller <davem@davemloft.net>2009-08-06 22:27:28 -0400
commita35ee541a66d11d26da30d3f6046dbddd073334e (patch)
tree35f39f572d30b6c3edcd2b3f064e60f7ab659c69 /drivers/net/mlx4
parent6cb87823627699b0267234a210d8199b681c70e3 (diff)
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: Yevgeny Petrilin <yevgenyp@mellanox.co.il> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/mlx4')
-rw-r--r--drivers/net/mlx4/en_netdev.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/net/mlx4/en_netdev.c b/drivers/net/mlx4/en_netdev.c
index 93f4abd990a9..c8a24dcca762 100644
--- a/drivers/net/mlx4/en_netdev.c
+++ b/drivers/net/mlx4/en_netdev.c
@@ -414,6 +414,7 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
414 unsigned long avg_pkt_size; 414 unsigned long avg_pkt_size;
415 unsigned long rx_packets; 415 unsigned long rx_packets;
416 unsigned long rx_bytes; 416 unsigned long rx_bytes;
417 unsigned long rx_byte_diff;
417 unsigned long tx_packets; 418 unsigned long tx_packets;
418 unsigned long tx_pkt_diff; 419 unsigned long tx_pkt_diff;
419 unsigned long rx_pkt_diff; 420 unsigned long rx_pkt_diff;
@@ -437,6 +438,8 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
437 rx_pkt_diff = ((unsigned long) (rx_packets - 438 rx_pkt_diff = ((unsigned long) (rx_packets -
438 priv->last_moder_packets)); 439 priv->last_moder_packets));
439 packets = max(tx_pkt_diff, rx_pkt_diff); 440 packets = max(tx_pkt_diff, rx_pkt_diff);
441 rx_byte_diff = rx_bytes - priv->last_moder_bytes;
442 rx_byte_diff = rx_byte_diff ? rx_byte_diff : 1;
440 rate = packets * HZ / period; 443 rate = packets * HZ / period;
441 avg_pkt_size = packets ? ((unsigned long) (rx_bytes - 444 avg_pkt_size = packets ? ((unsigned long) (rx_bytes -
442 priv->last_moder_bytes)) / packets : 0; 445 priv->last_moder_bytes)) / packets : 0;
@@ -447,10 +450,13 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)
447 /* If tx and rx packet rates are not balanced, assume that 450 /* If tx and rx packet rates are not balanced, assume that
448 * traffic is mainly BW bound and apply maximum moderation. 451 * traffic is mainly BW bound and apply maximum moderation.
449 * Otherwise, moderate according to packet rate */ 452 * Otherwise, moderate according to packet rate */
450 if (2 * tx_pkt_diff > 3 * rx_pkt_diff || 453 if (2 * tx_pkt_diff > 3 * rx_pkt_diff &&
451 2 * rx_pkt_diff > 3 * tx_pkt_diff) { 454 rx_pkt_diff / rx_byte_diff <
455 MLX4_EN_SMALL_PKT_SIZE)
456 moder_time = priv->rx_usecs_low;
457 else if (2 * rx_pkt_diff > 3 * tx_pkt_diff)
452 moder_time = priv->rx_usecs_high; 458 moder_time = priv->rx_usecs_high;
453 } else { 459 else {
454 if (rate < priv->pkt_rate_low) 460 if (rate < priv->pkt_rate_low)
455 moder_time = priv->rx_usecs_low; 461 moder_time = priv->rx_usecs_low;
456 else if (rate > priv->pkt_rate_high) 462 else if (rate > priv->pkt_rate_high)