From: Arne Fitzenreiter Date: Sat, 25 Mar 2017 09:43:55 +0000 (+0100) Subject: kernel: fix igb crash if update_stats was often used. X-Git-Tag: v2.21-core122~178^2~146 X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=commitdiff_plain;h=d52f116913a0ed5ee6ce22b69cd68e8c5214ac8e kernel: fix igb crash if update_stats was often used. Signed-off-by: Arne Fitzenreiter --- diff --git a/lfs/linux b/lfs/linux index a068d68c8d..08bb710f75 100644 --- a/lfs/linux +++ b/lfs/linux @@ -152,6 +152,9 @@ endif # Add LED trigger cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-4.9.16-ledtrig_netdev.patch + # Fix igb crash + cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-4.9.17-igb_fix_lock_at_update_stats.patch + # cs5535audio spams syslog if no ac97 was present (geos router) cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-4.9.8_cs5535audio_fix_logspam_on_geos.patch diff --git a/src/patches/linux/linux-4.9.17-igb_fix_lock_at_update_stats.patch b/src/patches/linux/linux-4.9.17-igb_fix_lock_at_update_stats.patch new file mode 100644 index 0000000000..f8a090c7ab --- /dev/null +++ b/src/patches/linux/linux-4.9.17-igb_fix_lock_at_update_stats.patch @@ -0,0 +1,33 @@ +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 +--- linux-4.9.17.org/drivers/net/ethernet/intel/igb/igb_main.c 2017-03-22 12:44:07.000000000 +0100 ++++ linux-4.9.17/drivers/net/ethernet/intel/igb/igb_main.c 2017-03-24 10:00:52.854812142 +0100 +@@ -4609,9 +4609,10 @@ + } + } + +- spin_lock(&adapter->stats64_lock); +- igb_update_stats(adapter, &adapter->stats64); +- spin_unlock(&adapter->stats64_lock); ++ if (spin_trylock(&adapter->stats64_lock)) { ++ igb_update_stats(adapter, &adapter->stats64); ++ spin_unlock(&adapter->stats64_lock); ++ } + + for (i = 0; i < adapter->num_tx_queues; i++) { + struct igb_ring *tx_ring = adapter->tx_ring[i]; +@@ -5391,11 +5392,11 @@ + { + struct igb_adapter *adapter = netdev_priv(netdev); + +- spin_lock(&adapter->stats64_lock); +- igb_update_stats(adapter, &adapter->stats64); ++ if (spin_trylock(&adapter->stats64_lock)) { ++ igb_update_stats(adapter, &adapter->stats64); ++ spin_unlock(&adapter->stats64_lock); ++ } + memcpy(stats, &adapter->stats64, sizeof(*stats)); +- spin_unlock(&adapter->stats64_lock); +- + return stats; + } +