Message ID | 1445963281-13704-1-git-send-email-stefan.bader@canonical.com |
---|---|
State | New |
Headers | show |
[ 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
On 10/28/2015 04:28 AM, Luis Henriques wrote: > [ Replying to kteam mailing-list only! ] >
Applied to the master-next branch of Wily.
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 --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;