]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/linux/linux-4.9.17-igb-e1000e_fix_lock_at_update_stats.patch
Merge branch 'next' into kernel-4.9
[ipfire-2.x.git] / src / patches / linux / linux-4.9.17-igb-e1000e_fix_lock_at_update_stats.patch
1 diff -Naur linux-4.9.17.org/drivers/net/ethernet/intel/e1000e/netdev.c linux-4.9.17/drivers/net/ethernet/intel/e1000e/netdev.c
2 --- linux-4.9.17.org/drivers/net/ethernet/intel/e1000e/netdev.c 2017-03-22 12:44:07.000000000 +0100
3 +++ linux-4.9.17/drivers/net/ethernet/intel/e1000e/netdev.c 2017-03-26 16:20:47.253511522 +0200
4 @@ -5924,10 +5924,14 @@
5 struct rtnl_link_stats64 *stats)
6 {
7 struct e1000_adapter *adapter = netdev_priv(netdev);
8 + int has_lock = 0;
9
10 memset(stats, 0, sizeof(struct rtnl_link_stats64));
11 - spin_lock(&adapter->stats64_lock);
12 - e1000e_update_stats(adapter);
13 + if (spin_trylock(&adapter->stats64_lock)) {
14 + e1000e_update_stats(adapter);
15 + has_lock = 1;
16 + }
17 +
18 /* Fill out the OS statistics structure */
19 stats->rx_bytes = adapter->stats.gorc;
20 stats->rx_packets = adapter->stats.gprc;
21 @@ -5957,7 +5961,7 @@
22
23 /* Tx Dropped needs to be maintained elsewhere */
24
25 - spin_unlock(&adapter->stats64_lock);
26 + if (has_lock) spin_unlock(&adapter->stats64_lock);
27 return stats;
28 }
29
30 diff -Naur linux-4.9.17.org/drivers/net/ethernet/intel/igb/igb_main.c linux-4.9.17/drivers/net/ethernet/intel/igb/igb_main.c
31 --- linux-4.9.17.org/drivers/net/ethernet/intel/igb/igb_main.c 2017-03-22 12:44:07.000000000 +0100
32 +++ linux-4.9.17/drivers/net/ethernet/intel/igb/igb_main.c 2017-03-26 16:02:46.820093793 +0200
33 @@ -5391,10 +5391,11 @@
34 {
35 struct igb_adapter *adapter = netdev_priv(netdev);
36
37 - spin_lock(&adapter->stats64_lock);
38 - igb_update_stats(adapter, &adapter->stats64);
39 + if (spin_trylock(&adapter->stats64_lock)) {
40 + igb_update_stats(adapter, &adapter->stats64);
41 + spin_unlock(&adapter->stats64_lock);
42 + }
43 memcpy(stats, &adapter->stats64, sizeof(*stats));
44 - spin_unlock(&adapter->stats64_lock);
45
46 return stats;
47 }