Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=071f7722686151817855195654f16a0b65d9473c
Commit:     071f7722686151817855195654f16a0b65d9473c
Parent:     67403754bceda484a62a697878ff20a0e8d3aae6
Author:     Baruch Even <[EMAIL PROTECTED]>
AuthorDate: Thu May 31 01:20:45 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Thu May 31 01:23:38 2007 -0700

    [BRIDGE]: Reduce frequency of forwarding cleanup timer in bridge.
    
    The bridge cleanup timer is fired 10 times a second for timers that
    are at least 15 seconds ahead in time and that are not critical to be
    cleaned asap.
    
    This patch calculates the next time to run the timer as the minimum of
    all timers or a minimum based on the current state.
    
    Signed-off-by: Baruch Even <[EMAIL PROTECTED]>
    Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/bridge/br_fdb.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index 91b0170..3fc6972 100644
--- a/net/bridge/br_fdb.c
+++ b/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.*/
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to