]> git.ipfire.org Git - people/arne_f/ipfire-2.x.git/blob - src/patches/linux/linux-4.9.17-igb_fix_lock_at_update_stats.patch
kernel: fix igb crash if update_stats was often used.
[people/arne_f/ipfire-2.x.git] / src / patches / linux / linux-4.9.17-igb_fix_lock_at_update_stats.patch
1 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
2 --- linux-4.9.17.org/drivers/net/ethernet/intel/igb/igb_main.c 2017-03-22 12:44:07.000000000 +0100
3 +++ linux-4.9.17/drivers/net/ethernet/intel/igb/igb_main.c 2017-03-24 10:00:52.854812142 +0100
4 @@ -4609,9 +4609,10 @@
5 }
6 }
7
8 - spin_lock(&adapter->stats64_lock);
9 - igb_update_stats(adapter, &adapter->stats64);
10 - spin_unlock(&adapter->stats64_lock);
11 + if (spin_trylock(&adapter->stats64_lock)) {
12 + igb_update_stats(adapter, &adapter->stats64);
13 + spin_unlock(&adapter->stats64_lock);
14 + }
15
16 for (i = 0; i < adapter->num_tx_queues; i++) {
17 struct igb_ring *tx_ring = adapter->tx_ring[i];
18 @@ -5391,11 +5392,11 @@
19 {
20 struct igb_adapter *adapter = netdev_priv(netdev);
21
22 - spin_lock(&adapter->stats64_lock);
23 - igb_update_stats(adapter, &adapter->stats64);
24 + if (spin_trylock(&adapter->stats64_lock)) {
25 + igb_update_stats(adapter, &adapter->stats64);
26 + spin_unlock(&adapter->stats64_lock);
27 + }
28 memcpy(stats, &adapter->stats64, sizeof(*stats));
29 - spin_unlock(&adapter->stats64_lock);
30 -
31 return stats;
32 }
33