net: netcp: Fixes the use of spin_lock_bh in timer function
authorWingMan Kwok <w-kwok2@ti.com>
Thu, 23 Jul 2015 19:57:19 +0000 (15:57 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 27 Jul 2015 07:18:39 +0000 (00:18 -0700)
This patch fixes a bug in which the timer routine synchronized
against the ethtool-triggered statistics updates with spin_lock_bh().
A timer function is itself a bottom-half, so this should be
spin_lock().

Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/netcp_ethss.c

index 9b7e0a34c98b10aca5eed610c47f33b2eedbbd00..cabf97728b2dc2348f6db4822374f54d0829962c 100644 (file)
@@ -2189,14 +2189,15 @@ static void netcp_ethss_timer(unsigned long arg)
                netcp_ethss_update_link_state(gbe_dev, slave, NULL);
        }
 
-       spin_lock_bh(&gbe_dev->hw_stats_lock);
+       /* A timer runs as a BH, no need to block them */
+       spin_lock(&gbe_dev->hw_stats_lock);
 
        if (gbe_dev->ss_version == GBE_SS_VERSION_14)
                gbe_update_stats_ver14(gbe_dev, NULL);
        else
                gbe_update_stats(gbe_dev, NULL);
 
-       spin_unlock_bh(&gbe_dev->hw_stats_lock);
+       spin_unlock(&gbe_dev->hw_stats_lock);
 
        gbe_dev->timer.expires  = jiffies + GBE_TIMER_INTERVAL;
        add_timer(&gbe_dev->timer);