vxlan: release lock after each bucket in vxlan_cleanup
authorSorin Dumitru <sorin@returnze.ro>
Tue, 26 May 2015 07:42:04 +0000 (10:42 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 May 2015 17:33:21 +0000 (13:33 -0400)
We're seeing some softlockups from this function when there
are a lot fdb entries on a vxlan device. Taking the lock for
each bucket instead of the whole table is enough to fix that.

Signed-off-by: Sorin Dumitru <sdumitru@ixiacom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c

index 5eddbc02c6c22cf0958ad00fb594f2c2c93cc333..34c519eb1db5092a6e1bd17e02b9a3e53a5c5cb2 100644 (file)
@@ -2131,9 +2131,10 @@ static void vxlan_cleanup(unsigned long arg)
        if (!netif_running(vxlan->dev))
                return;
 
-       spin_lock_bh(&vxlan->hash_lock);
        for (h = 0; h < FDB_HASH_SIZE; ++h) {
                struct hlist_node *p, *n;
+
+               spin_lock_bh(&vxlan->hash_lock);
                hlist_for_each_safe(p, n, &vxlan->fdb_head[h]) {
                        struct vxlan_fdb *f
                                = container_of(p, struct vxlan_fdb, hlist);
@@ -2152,8 +2153,8 @@ static void vxlan_cleanup(unsigned long arg)
                        } else if (time_before(timeout, next_timer))
                                next_timer = timeout;
                }
+               spin_unlock_bh(&vxlan->hash_lock);
        }
-       spin_unlock_bh(&vxlan->hash_lock);
 
        mod_timer(&vxlan->age_timer, next_timer);
 }