浏览代码

i40e/i40evf: fix bug in throttle rate math

The driver was using a value expressed in 2us increments
for the divisor to figure out our bytes/usec values.

Fix the usecs variable to contain a value in microseconds.

Change-ID: I5c20493103c295d6f201947bb908add7040b7c41
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Jesse Brandeburg 10 年之前
父节点
当前提交
51cc6d9fcc
共有 2 个文件被更改,包括 16 次插入2 次删除
  1. 8 1
      drivers/net/ethernet/intel/i40e/i40e_txrx.c
  2. 8 1
      drivers/net/ethernet/intel/i40evf/i40e_txrx.c

+ 8 - 1
drivers/net/ethernet/intel/i40e/i40e_txrx.c

@@ -830,6 +830,7 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
 	enum i40e_latency_range new_latency_range = rc->latency_range;
 	enum i40e_latency_range new_latency_range = rc->latency_range;
 	u32 new_itr = rc->itr;
 	u32 new_itr = rc->itr;
 	int bytes_per_int;
 	int bytes_per_int;
+	int usecs;
 
 
 	if (rc->total_packets == 0 || !rc->itr)
 	if (rc->total_packets == 0 || !rc->itr)
 		return false;
 		return false;
@@ -838,8 +839,14 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
 	 *   0-10MB/s   lowest (100000 ints/s)
 	 *   0-10MB/s   lowest (100000 ints/s)
 	 *  10-20MB/s   low    (20000 ints/s)
 	 *  10-20MB/s   low    (20000 ints/s)
 	 *  20-1249MB/s bulk   (8000 ints/s)
 	 *  20-1249MB/s bulk   (8000 ints/s)
+	 *
+	 * The math works out because the divisor is in 10^(-6) which
+	 * turns the bytes/us input value into MB/s values, but
+	 * make sure to use usecs, as the register values written
+	 * are in 2 usec increments in the ITR registers.
 	 */
 	 */
-	bytes_per_int = rc->total_bytes / rc->itr;
+	usecs = (rc->itr << 1);
+	bytes_per_int = rc->total_bytes / usecs;
 	switch (new_latency_range) {
 	switch (new_latency_range) {
 	case I40E_LOWEST_LATENCY:
 	case I40E_LOWEST_LATENCY:
 		if (bytes_per_int > 10)
 		if (bytes_per_int > 10)

+ 8 - 1
drivers/net/ethernet/intel/i40evf/i40e_txrx.c

@@ -333,6 +333,7 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
 	enum i40e_latency_range new_latency_range = rc->latency_range;
 	enum i40e_latency_range new_latency_range = rc->latency_range;
 	u32 new_itr = rc->itr;
 	u32 new_itr = rc->itr;
 	int bytes_per_int;
 	int bytes_per_int;
+	int usecs;
 
 
 	if (rc->total_packets == 0 || !rc->itr)
 	if (rc->total_packets == 0 || !rc->itr)
 		return false;
 		return false;
@@ -341,8 +342,14 @@ static bool i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
 	 *   0-10MB/s   lowest (100000 ints/s)
 	 *   0-10MB/s   lowest (100000 ints/s)
 	 *  10-20MB/s   low    (20000 ints/s)
 	 *  10-20MB/s   low    (20000 ints/s)
 	 *  20-1249MB/s bulk   (8000 ints/s)
 	 *  20-1249MB/s bulk   (8000 ints/s)
+	 *
+	 * The math works out because the divisor is in 10^(-6) which
+	 * turns the bytes/us input value into MB/s values, but
+	 * make sure to use usecs, as the register values written
+	 * are in 2 usec increments in the ITR registers.
 	 */
 	 */
-	bytes_per_int = rc->total_bytes / rc->itr;
+	usecs = (rc->itr << 1);
+	bytes_per_int = rc->total_bytes / usecs;
 	switch (new_latency_range) {
 	switch (new_latency_range) {
 	case I40E_LOWEST_LATENCY:
 	case I40E_LOWEST_LATENCY:
 		if (bytes_per_int > 10)
 		if (bytes_per_int > 10)