]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/linux/linux-4.14.1-igb-e1000e_fix_lock_at_update_stats.patch
reiserfsprogs: Update to 3.6.27
[ipfire-2.x.git] / src / patches / linux / linux-4.14.1-igb-e1000e_fix_lock_at_update_stats.patch
CommitLineData
2e1fe3c8
AF
1diff -Naur linux-4.14.1.org/drivers/net/ethernet/intel/e1000e/netdev.c linux-4.14.1/drivers/net/ethernet/intel/e1000e/netdev.c
2--- linux-4.14.1.org/drivers/net/ethernet/intel/e1000e/netdev.c 2017-11-21 09:49:25.000000000 +0100
3+++ linux-4.14.1/drivers/net/ethernet/intel/e1000e/netdev.c 2017-11-21 18:28:05.730711267 +0100
4@@ -5952,9 +5952,13 @@
5 struct rtnl_link_stats64 *stats)
6 {
7 struct e1000_adapter *adapter = netdev_priv(netdev);
8+ int has_lock = 0;
9+
10+ if (spin_trylock(&adapter->stats64_lock)) {
11+ e1000e_update_stats(adapter);
12+ has_lock = 1;
13+ }
14
15- spin_lock(&adapter->stats64_lock);
16- e1000e_update_stats(adapter);
17 /* Fill out the OS statistics structure */
18 stats->rx_bytes = adapter->stats.gorc;
19 stats->rx_packets = adapter->stats.gprc;
20@@ -5984,7 +5988,7 @@
21
22 /* Tx Dropped needs to be maintained elsewhere */
23
24- spin_unlock(&adapter->stats64_lock);
25+ if (has_lock) spin_unlock(&adapter->stats64_lock);
26 }
27
28 /**
29diff -Naur linux-4.14.1.org/drivers/net/ethernet/intel/igb/igb_main.c linux-4.14.1/drivers/net/ethernet/intel/igb/igb_main.c
30--- linux-4.14.1.org/drivers/net/ethernet/intel/igb/igb_main.c 2017-11-21 09:49:25.000000000 +0100
31+++ linux-4.14.1/drivers/net/ethernet/intel/igb/igb_main.c 2017-11-21 18:28:02.358749514 +0100
32@@ -5499,10 +5499,11 @@
33 {
34 struct igb_adapter *adapter = netdev_priv(netdev);
35
36- spin_lock(&adapter->stats64_lock);
37- igb_update_stats(adapter);
38+ if (spin_trylock(&adapter->stats64_lock)) {
39+ igb_update_stats(adapter);
40+ spin_unlock(&adapter->stats64_lock);
41+ }
42 memcpy(stats, &adapter->stats64, sizeof(*stats));
43- spin_unlock(&adapter->stats64_lock);
44 }
45
46 /**