]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/linux/linux-4.14.1-igb-e1000e_fix_lock_at_update_stats.patch
Merge remote-tracking branch 'origin/next' into kernel-4.14
[ipfire-2.x.git] / src / patches / linux / linux-4.14.1-igb-e1000e_fix_lock_at_update_stats.patch
1 diff -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 /**
29 diff -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 /**