Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tg3: driver sleeps indefinitely when EEH errors exceed eeh_max_freezes

The driver function tg3_io_error_detected() calls napi_disable twice,
without an intervening napi_enable, when the number of EEH errors exceeds
eeh_max_freezes, resulting in an indefinite sleep while holding rtnl_lock.

Add check for pcierr_recovery which skips code already executed for the
"Frozen" state.

Signed-off-by: David Christensen <drc@linux.vnet.ibm.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

David Christensen and committed by
David S. Miller
3a2656a2 4c98045c

+2 -2
+2 -2
drivers/net/ethernet/broadcom/tg3.c
··· 18168 18168 18169 18169 rtnl_lock(); 18170 18170 18171 - /* We probably don't have netdev yet */ 18172 - if (!netdev || !netif_running(netdev)) 18171 + /* Could be second call or maybe we don't have netdev yet */ 18172 + if (!netdev || tp->pcierr_recovery || !netif_running(netdev)) 18173 18173 goto done; 18174 18174 18175 18175 /* We needn't recover from permanent error */