From bc9bed94785fce608ec3e1ec21b931cb62588c5e Mon Sep 17 00:00:00 2001 From: Baruch Even Date: Thu, 31 May 2007 01:20:45 -0700 Subject: [PATCH] --- yaml --- r: 57168 b: refs/heads/master c: 071f7722686151817855195654f16a0b65d9473c h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/net/bridge/br_fdb.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index c7ef828fd1b1..7083ea34e9b6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 67403754bceda484a62a697878ff20a0e8d3aae6 +refs/heads/master: 071f7722686151817855195654f16a0b65d9473c diff --git a/trunk/net/bridge/br_fdb.c b/trunk/net/bridge/br_fdb.c index 91b017016d5b..3fc697293819 100644 --- a/trunk/net/bridge/br_fdb.c +++ b/trunk/net/bridge/br_fdb.c @@ -121,6 +121,7 @@ void br_fdb_cleanup(unsigned long _data) { struct net_bridge *br = (struct net_bridge *)_data; unsigned long delay = hold_time(br); + unsigned long next_timer = jiffies + br->forward_delay; int i; spin_lock_bh(&br->hash_lock); @@ -129,14 +130,21 @@ void br_fdb_cleanup(unsigned long _data) struct hlist_node *h, *n; hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) { - if (!f->is_static && - time_before_eq(f->ageing_timer + delay, jiffies)) + unsigned long this_timer; + if (f->is_static) + continue; + this_timer = f->ageing_timer + delay; + if (time_before_eq(this_timer, jiffies)) fdb_delete(f); + else if (this_timer < next_timer) + next_timer = this_timer; } } spin_unlock_bh(&br->hash_lock); - mod_timer(&br->gc_timer, jiffies + HZ/10); + /* Add HZ/4 to ensure we round the jiffies upwards to be after the next + * timer, otherwise we might round down and will have no-op run. */ + mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4)); } /* Completely flush all dynamic entries in forwarding database.*/