forcedeth: fix race when unloading module
authordavid decotigny <david.decotigny@google.com>
Sat, 5 Nov 2011 14:38:20 +0000 (14:38 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Nov 2011 18:31:24 +0000 (13:31 -0500)
When forcedeth module is unloaded, there exists a path that can lead
to mod_timer() after del_timer_sync(), causing an oops. This patch
short-circuits this unneeded path, which originates in
nv_get_ethtool_stats().

Tested:
  x86_64 16-way + 3 ethtool -S infinite loops + 100Mbps incoming traffic
  + rmmod/modprobe/ifconfig in a loop

Initial-Author: Salman Qazi <sqazi@google.com>
Discussion: http://patchwork.ozlabs.org/patch/123548/

Signed-off-by: David Decotigny <david.decotigny@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/nvidia/forcedeth.c

index 1e37eb98c4e29265030dfe930b048d91ea384295..344cb5fa512d5662711864edfdfa75a66a7f05d4 100644 (file)
@@ -4566,7 +4566,7 @@ static void nv_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *e
        struct fe_priv *np = netdev_priv(dev);
 
        /* update stats */
-       nv_do_stats_poll((unsigned long)dev);
+       nv_get_hw_stats(dev);
 
        memcpy(buffer, &np->estats, nv_get_sset_count(dev, ETH_SS_STATS)*sizeof(u64));
 }