diff options
Diffstat (limited to 'drivers/net/mlx4')
-rw-r--r-- | drivers/net/mlx4/en_netdev.c | 12 |
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) |