diff mbox

Stable-4.2 inclusion request for e1000e fix

Message ID 1445963281-13704-1-git-send-email-stefan.bader@canonical.com
State New
Headers show

Commit Message

Stefan Bader Oct. 27, 2015, 4:28 p.m. UTC
This was attempted to get into 4.2 before release but did not seem to
be successful[1]. But was now reported to us and verified[2] that adding
this prevents issues when the NIC is not connected.

Could the patch below be added to the stable queue for 4.2. Thanks.

-Stefan


[1] http://lkml.iu.edu/hypermail/linux/kernel/1508.2/01174.html
[2] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1509929

--

From 37b12910dd11d9ab969f2c310dc9160b7f3e3405 Mon Sep 17 00:00:00 2001
From: Raanan Avargil <raanan.avargil@intel.com>
Date: Sun, 19 Jul 2015 16:33:20 +0300
Subject: [PATCH] e1000e: Fix tight loop implementation of systime read
 algorithm

Change the algorithm. Read systimel twice and check for overflow.
If there was no overflow, use the first value.
If there was an overflow, read systimeh again and use the second
systimel value.

Signed-off-by: Raanan Avargil <raanan.avargil@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
(cherry-picked from commit 37b12910dd11d9ab969f2c310dc9160b7f3e3405)
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
---
 drivers/net/ethernet/intel/e1000e/netdev.c | 31 ++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

Comments

Luis Henriques Oct. 28, 2015, 10:28 a.m. UTC | #1
[ Replying to kteam mailing-list only! ]

On Tue, Oct 27, 2015 at 05:28:01PM +0100, Stefan Bader wrote:
> This was attempted to get into 4.2 before release but did not seem to
> be successful[1]. But was now reported to us and verified[2] that adding
> this prevents issues when the NIC is not connected.
> 
> Could the patch below be added to the stable queue for 4.2. Thanks.
>

Since this may take some time before going into the 4.2 stable kernel and
then into wily, I guess we can simply SRU it in the next cycle.  We have a
buglink and positive testing, so... ACK!

Cheers,
--
Luís


> -Stefan
> 
> 
> [1] http://lkml.iu.edu/hypermail/linux/kernel/1508.2/01174.html
> [2] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1509929
> 
> --
> 
> From 37b12910dd11d9ab969f2c310dc9160b7f3e3405 Mon Sep 17 00:00:00 2001
> From: Raanan Avargil <raanan.avargil@intel.com>
> Date: Sun, 19 Jul 2015 16:33:20 +0300
> Subject: [PATCH] e1000e: Fix tight loop implementation of systime read
>  algorithm
> 
> Change the algorithm. Read systimel twice and check for overflow.
> If there was no overflow, use the first value.
> If there was an overflow, read systimeh again and use the second
> systimel value.
> 
> Signed-off-by: Raanan Avargil <raanan.avargil@intel.com>
> Tested-by: Aaron Brown <aaron.f.brown@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> (cherry-picked from commit 37b12910dd11d9ab969f2c310dc9160b7f3e3405)
> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
> ---
>  drivers/net/ethernet/intel/e1000e/netdev.c | 31 ++++++++++++++++++++----------
>  1 file changed, 21 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
> index 24b7269..96a8166 100644
> --- a/drivers/net/ethernet/intel/e1000e/netdev.c
> +++ b/drivers/net/ethernet/intel/e1000e/netdev.c
> @@ -4280,18 +4280,29 @@ static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
>  	struct e1000_adapter *adapter = container_of(cc, struct e1000_adapter,
>  						     cc);
>  	struct e1000_hw *hw = &adapter->hw;
> +	u32 systimel_1, systimel_2, systimeh;
>  	cycle_t systim, systim_next;
> -	/* SYSTIMH latching upon SYSTIML read does not work well. To fix that
> -	 * we don't want to allow overflow of SYSTIML and a change to SYSTIMH
> -	 * to occur between reads, so if we read a vale close to overflow, we
> -	 * wait for overflow to occur and read both registers when its safe.
> +	/* SYSTIMH latching upon SYSTIML read does not work well.
> +	 * This means that if SYSTIML overflows after we read it but before
> +	 * we read SYSTIMH, the value of SYSTIMH has been incremented and we
> +	 * will experience a huge non linear increment in the systime value
> +	 * to fix that we test for overflow and if true, we re-read systime.
>  	 */
> -	u32 systim_overflow_latch_fix = 0x3FFFFFFF;
> -
> -	do {
> -		systim = (cycle_t)er32(SYSTIML);
> -	} while (systim > systim_overflow_latch_fix);
> -	systim |= (cycle_t)er32(SYSTIMH) << 32;
> +	systimel_1 = er32(SYSTIML);
> +	systimeh = er32(SYSTIMH);
> +	systimel_2 = er32(SYSTIML);
> +	/* Check for overflow. If there was no overflow, use the values */
> +	if (systimel_1 < systimel_2) {
> +		systim = (cycle_t)systimel_1;
> +		systim |= (cycle_t)systimeh << 32;
> +	} else {
> +		/* There was an overflow, read again SYSTIMH, and use
> +		 * systimel_2
> +		 */
> +		systimeh = er32(SYSTIMH);
> +		systim = (cycle_t)systimel_2;
> +		systim |= (cycle_t)systimeh << 32;
> +	}
>  
>  	if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) {
>  		u64 incvalue, time_delta, rem, temp;
> -- 
> 1.9.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Tim Gardner Oct. 28, 2015, 2:06 p.m. UTC | #2
On 10/28/2015 04:28 AM, Luis Henriques wrote:
> [ Replying to kteam mailing-list only! ]
>
Brad Figg Oct. 28, 2015, 6:10 p.m. UTC | #3
Applied to the master-next branch of Wily.
Jason DeRose Oct. 28, 2015, 7:11 p.m. UTC | #4
Was in the e1000e that's on the new Wild Dog and Ratel?

----- Original Message -----
From: "Brad Figg" <brad.figg@canonical.com>
To: "Stefan Bader" <stefan.bader@canonical.com>
Cc: kernel-team@lists.ubuntu.com
Sent: Wednesday, October 28, 2015 12:10:41 PM
Subject: Applied [wily]: Stable-4.2 inclusion request for e1000e fix


Applied to the master-next branch of Wily.
diff mbox

Patch

diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index 24b7269..96a8166 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -4280,18 +4280,29 @@  static cycle_t e1000e_cyclecounter_read(const struct cyclecounter *cc)
 	struct e1000_adapter *adapter = container_of(cc, struct e1000_adapter,
 						     cc);
 	struct e1000_hw *hw = &adapter->hw;
+	u32 systimel_1, systimel_2, systimeh;
 	cycle_t systim, systim_next;
-	/* SYSTIMH latching upon SYSTIML read does not work well. To fix that
-	 * we don't want to allow overflow of SYSTIML and a change to SYSTIMH
-	 * to occur between reads, so if we read a vale close to overflow, we
-	 * wait for overflow to occur and read both registers when its safe.
+	/* SYSTIMH latching upon SYSTIML read does not work well.
+	 * This means that if SYSTIML overflows after we read it but before
+	 * we read SYSTIMH, the value of SYSTIMH has been incremented and we
+	 * will experience a huge non linear increment in the systime value
+	 * to fix that we test for overflow and if true, we re-read systime.
 	 */
-	u32 systim_overflow_latch_fix = 0x3FFFFFFF;
-
-	do {
-		systim = (cycle_t)er32(SYSTIML);
-	} while (systim > systim_overflow_latch_fix);
-	systim |= (cycle_t)er32(SYSTIMH) << 32;
+	systimel_1 = er32(SYSTIML);
+	systimeh = er32(SYSTIMH);
+	systimel_2 = er32(SYSTIML);
+	/* Check for overflow. If there was no overflow, use the values */
+	if (systimel_1 < systimel_2) {
+		systim = (cycle_t)systimel_1;
+		systim |= (cycle_t)systimeh << 32;
+	} else {
+		/* There was an overflow, read again SYSTIMH, and use
+		 * systimel_2
+		 */
+		systimeh = er32(SYSTIMH);
+		systim = (cycle_t)systimel_2;
+		systim |= (cycle_t)systimeh << 32;
+	}
 
 	if ((hw->mac.type == e1000_82574) || (hw->mac.type == e1000_82583)) {
 		u64 incvalue, time_delta, rem, temp;