e1000e: Fix tight loop implementation of systime read algorithm
This commit is contained in:
parent
20ad6e5150
commit
30da8b4d4f
|
@ -20,6 +20,7 @@ linux (4.2.1-1) UNRELEASED; urgency=medium
|
|||
* RDS: verify the underlying transport exists before creating a connection
|
||||
(CVE-2015-6937)
|
||||
* Set ABI to 1
|
||||
* e1000e: Fix tight loop implementation of systime read algorithm
|
||||
|
||||
[ Aurelien Jarno ]
|
||||
* [mips*el] Fix BPF assembly code for pre-R2 CPUs. (fixes FTBFS)
|
||||
|
|
61
debian/patches/bugfix/all/e1000e-fix-tight-loop-implementation-of-systime-read.patch
vendored
Normal file
61
debian/patches/bugfix/all/e1000e-fix-tight-loop-implementation-of-systime-read.patch
vendored
Normal file
|
@ -0,0 +1,61 @@
|
|||
From: Raanan Avargil <raanan.avargil@intel.com>
|
||||
Date: Sun, 19 Jul 2015 16:33:20 +0300
|
||||
Subject: e1000e: Fix tight loop implementation of systime read algorithm
|
||||
Origin: https://git.kernel.org/linus/37b12910dd11d9ab969f2c310dc9160b7f3e3405
|
||||
|
||||
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>
|
||||
---
|
||||
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;
|
|
@ -95,3 +95,4 @@ bugfix/all/dcache-handle-escaped-paths-in-prepend_path.patch
|
|||
bugfix/all/dcache-reduce-the-scope-of-i_lock-in-d_splice_alias.patch
|
||||
bugfix/all/vfs-test-for-and-handle-paths-that-are-unreachable-f.patch
|
||||
bugfix/all/rds-verify-the-underlying-transport-exists-before-cr.patch
|
||||
bugfix/all/e1000e-fix-tight-loop-implementation-of-systime-read.patch
|
||||
|
|
Loading…
Reference in New Issue