ACK: Stable-4.2 inclusion request for e1000e fix
Luis Henriques
luis.henriques at canonical.com
Wed Oct 28 10:28:12 UTC 2015
[ 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 at 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 at intel.com>
> Tested-by: Aaron Brown <aaron.f.brown at intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher at intel.com>
> (cherry-picked from commit 37b12910dd11d9ab969f2c310dc9160b7f3e3405)
> Signed-off-by: Stefan Bader <stefan.bader at 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 at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
More information about the kernel-team
mailing list