Commit 071f7722686151817855195654f16a0b65d9473c

Authored by Baruch Even
Committed by David S. Miller
1 parent 67403754bc

[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>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 11 additions and 3 deletions Side-by-side Diff

... ... @@ -121,6 +121,7 @@
121 121 {
122 122 struct net_bridge *br = (struct net_bridge *)_data;
123 123 unsigned long delay = hold_time(br);
  124 + unsigned long next_timer = jiffies + br->forward_delay;
124 125 int i;
125 126  
126 127 spin_lock_bh(&br->hash_lock);
127 128  
128 129  
... ... @@ -129,14 +130,21 @@
129 130 struct hlist_node *h, *n;
130 131  
131 132 hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) {
132   - if (!f->is_static &&
133   - time_before_eq(f->ageing_timer + delay, jiffies))
  133 + unsigned long this_timer;
  134 + if (f->is_static)
  135 + continue;
  136 + this_timer = f->ageing_timer + delay;
  137 + if (time_before_eq(this_timer, jiffies))
134 138 fdb_delete(f);
  139 + else if (this_timer < next_timer)
  140 + next_timer = this_timer;
135 141 }
136 142 }
137 143 spin_unlock_bh(&br->hash_lock);
138 144  
139   - mod_timer(&br->gc_timer, jiffies + HZ/10);
  145 + /* Add HZ/4 to ensure we round the jiffies upwards to be after the next
  146 + * timer, otherwise we might round down and will have no-op run. */
  147 + mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4));
140 148 }
141 149  
142 150 /* Completely flush all dynamic entries in forwarding database.*/