diff options
author | Fuyun Liang <liangfuyun1@huawei.com> | 2018-03-21 03:49:26 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-03-22 13:12:02 -0400 |
commit | a95e1f8666e910f43f47b5b1bec2cdf25f513f74 (patch) | |
tree | 50155258c8510a2f0d0e94eedafcac7f799af457 | |
parent | cd9d187b07c23df4925c3a47e06367315ba794ca (diff) |
net: hns3: change the time interval of int_gl calculating
Since we change the update rate of int_gl from every interrupt to every
one hundred interrupts, the old way to get time interval by int_gl value
is not accurate. This patch calculates the time interval using the jiffies
value.
Signed-off-by: Fuyun Liang <liangfuyun1@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 46 | ||||
-rw-r--r-- | drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | 1 |
2 files changed, 30 insertions, 17 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index e7cf7b4b40d3..0b4a676999ca 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | |||
@@ -2406,15 +2406,15 @@ out: | |||
2406 | 2406 | ||
2407 | static bool hns3_get_new_int_gl(struct hns3_enet_ring_group *ring_group) | 2407 | static bool hns3_get_new_int_gl(struct hns3_enet_ring_group *ring_group) |
2408 | { | 2408 | { |
2409 | #define HNS3_RX_ULTRA_PACKET_RATE 40000 | 2409 | struct hns3_enet_tqp_vector *tqp_vector = |
2410 | ring_group->ring->tqp_vector; | ||
2410 | enum hns3_flow_level_range new_flow_level; | 2411 | enum hns3_flow_level_range new_flow_level; |
2411 | struct hns3_enet_tqp_vector *tqp_vector; | 2412 | int packets_per_msecs; |
2412 | int packets_per_secs; | 2413 | int bytes_per_msecs; |
2413 | int bytes_per_usecs; | 2414 | u32 time_passed_ms; |
2414 | u16 new_int_gl; | 2415 | u16 new_int_gl; |
2415 | int usecs; | ||
2416 | 2416 | ||
2417 | if (!ring_group->coal.int_gl) | 2417 | if (!ring_group->coal.int_gl || !tqp_vector->last_jiffies) |
2418 | return false; | 2418 | return false; |
2419 | 2419 | ||
2420 | if (ring_group->total_packets == 0) { | 2420 | if (ring_group->total_packets == 0) { |
@@ -2431,33 +2431,44 @@ static bool hns3_get_new_int_gl(struct hns3_enet_ring_group *ring_group) | |||
2431 | */ | 2431 | */ |
2432 | new_flow_level = ring_group->coal.flow_level; | 2432 | new_flow_level = ring_group->coal.flow_level; |
2433 | new_int_gl = ring_group->coal.int_gl; | 2433 | new_int_gl = ring_group->coal.int_gl; |
2434 | tqp_vector = ring_group->ring->tqp_vector; | 2434 | time_passed_ms = |
2435 | usecs = (ring_group->coal.int_gl << 1); | 2435 | jiffies_to_msecs(jiffies - tqp_vector->last_jiffies); |
2436 | bytes_per_usecs = ring_group->total_bytes / usecs; | 2436 | |
2437 | /* 1000000 microseconds */ | 2437 | if (!time_passed_ms) |
2438 | packets_per_secs = ring_group->total_packets * 1000000 / usecs; | 2438 | return false; |
2439 | |||
2440 | do_div(ring_group->total_packets, time_passed_ms); | ||
2441 | packets_per_msecs = ring_group->total_packets; | ||
2442 | |||
2443 | do_div(ring_group->total_bytes, time_passed_ms); | ||
2444 | bytes_per_msecs = ring_group->total_bytes; | ||
2445 | |||
2446 | #define HNS3_RX_LOW_BYTE_RATE 10000 | ||
2447 | #define HNS3_RX_MID_BYTE_RATE 20000 | ||
2439 | 2448 | ||
2440 | switch (new_flow_level) { | 2449 | switch (new_flow_level) { |
2441 | case HNS3_FLOW_LOW: | 2450 | case HNS3_FLOW_LOW: |
2442 | if (bytes_per_usecs > 10) | 2451 | if (bytes_per_msecs > HNS3_RX_LOW_BYTE_RATE) |
2443 | new_flow_level = HNS3_FLOW_MID; | 2452 | new_flow_level = HNS3_FLOW_MID; |
2444 | break; | 2453 | break; |
2445 | case HNS3_FLOW_MID: | 2454 | case HNS3_FLOW_MID: |
2446 | if (bytes_per_usecs > 20) | 2455 | if (bytes_per_msecs > HNS3_RX_MID_BYTE_RATE) |
2447 | new_flow_level = HNS3_FLOW_HIGH; | 2456 | new_flow_level = HNS3_FLOW_HIGH; |
2448 | else if (bytes_per_usecs <= 10) | 2457 | else if (bytes_per_msecs <= HNS3_RX_LOW_BYTE_RATE) |
2449 | new_flow_level = HNS3_FLOW_LOW; | 2458 | new_flow_level = HNS3_FLOW_LOW; |
2450 | break; | 2459 | break; |
2451 | case HNS3_FLOW_HIGH: | 2460 | case HNS3_FLOW_HIGH: |
2452 | case HNS3_FLOW_ULTRA: | 2461 | case HNS3_FLOW_ULTRA: |
2453 | default: | 2462 | default: |
2454 | if (bytes_per_usecs <= 20) | 2463 | if (bytes_per_msecs <= HNS3_RX_MID_BYTE_RATE) |
2455 | new_flow_level = HNS3_FLOW_MID; | 2464 | new_flow_level = HNS3_FLOW_MID; |
2456 | break; | 2465 | break; |
2457 | } | 2466 | } |
2458 | 2467 | ||
2459 | if ((packets_per_secs > HNS3_RX_ULTRA_PACKET_RATE) && | 2468 | #define HNS3_RX_ULTRA_PACKET_RATE 40 |
2460 | (&tqp_vector->rx_group == ring_group)) | 2469 | |
2470 | if (packets_per_msecs > HNS3_RX_ULTRA_PACKET_RATE && | ||
2471 | &tqp_vector->rx_group == ring_group) | ||
2461 | new_flow_level = HNS3_FLOW_ULTRA; | 2472 | new_flow_level = HNS3_FLOW_ULTRA; |
2462 | 2473 | ||
2463 | switch (new_flow_level) { | 2474 | switch (new_flow_level) { |
@@ -2512,6 +2523,7 @@ static void hns3_update_new_int_gl(struct hns3_enet_tqp_vector *tqp_vector) | |||
2512 | tx_group->coal.int_gl); | 2523 | tx_group->coal.int_gl); |
2513 | } | 2524 | } |
2514 | 2525 | ||
2526 | tqp_vector->last_jiffies = jiffies; | ||
2515 | tqp_vector->int_adapt_down = HNS3_INT_ADAPT_DOWN_START; | 2527 | tqp_vector->int_adapt_down = HNS3_INT_ADAPT_DOWN_START; |
2516 | } | 2528 | } |
2517 | 2529 | ||
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h index 2fe870b580b1..39daa01f08d5 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | |||
@@ -499,6 +499,7 @@ struct hns3_enet_tqp_vector { | |||
499 | 499 | ||
500 | /* when 0 should adjust interrupt coalesce parameter */ | 500 | /* when 0 should adjust interrupt coalesce parameter */ |
501 | u8 int_adapt_down; | 501 | u8 int_adapt_down; |
502 | unsigned long last_jiffies; | ||
502 | } ____cacheline_internodealigned_in_smp; | 503 | } ____cacheline_internodealigned_in_smp; |
503 | 504 | ||
504 | enum hns3_udp_tnl_type { | 505 | enum hns3_udp_tnl_type { |