Stephen Hemminger
2007-May-30 12:26 UTC
[Bridge] [PATCH 1/2] 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 <baruch@ev-en.org> Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> --- 2.6.22-rc2/net/bridge/br_fdb.c 2007-05-20 00:51:11.000000000 +0300 +++ 2.6-rc2/net/bridge/br_fdb.c 2007-05-20 00:50:31.000000000 +0300 @@ -121,6 +121,7 @@ { 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 @@ struct hlist_node *h, *n; hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) { + unsigned long this_timer; + if (f->is_static) + continue; + this_timer = f->ageing_timer + delay; + if (time_before_eq(this_timer, jiffies)) - if (!f->is_static && - time_before_eq(f->ageing_timer + delay, jiffies)) fdb_delete(f); + else if (this_timer < next_timer) + next_timer = this_timer; } } spin_unlock_bh(&br->hash_lock); + /* 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)); - mod_timer(&br->gc_timer, jiffies + HZ/10); } /* Completely flush all dynamic entries in forwarding database.*/
Stephen Hemminger
2007-May-30 12:26 UTC
[Bridge] [PATCH 2/2] bridge: round off STP perodic timers
Peroidic STP timers don't have to be exact. The hold timer runs at 1HZ, and the hello timer normally runs at 2HZ; save power by aligning it them to next second. Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org> --- net/bridge/br_stp.c | 3 ++- net/bridge/br_stp_timer.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) --- a/net/bridge/br_stp.c 2007-05-30 11:42:16.000000000 -0700 +++ b/net/bridge/br_stp.c 2007-05-30 11:51:51.000000000 -0700 @@ -178,7 +178,8 @@ void br_transmit_config(struct net_bridg br_send_config_bpdu(p, &bpdu); p->topology_change_ack = 0; p->config_pending = 0; - mod_timer(&p->hold_timer, jiffies + BR_HOLD_TIME); + mod_timer(&p->hold_timer, + round_jiffies(jiffies + BR_HOLD_TIME)); } } --- a/net/bridge/br_stp_timer.c 2007-05-30 11:42:16.000000000 -0700 +++ b/net/bridge/br_stp_timer.c 2007-05-30 11:53:08.000000000 -0700 @@ -42,7 +42,7 @@ static void br_hello_timer_expired(unsig if (br->dev->flags & IFF_UP) { br_config_bpdu_generation(br); - mod_timer(&br->hello_timer, jiffies + br->hello_time); + mod_timer(&br->hello_timer, round_jiffies(jiffies + br->hello_time)); } spin_unlock(&br->lock); }