diff options
Diffstat (limited to 'net/bridge/br_fdb.c')
-rw-r--r-- | 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 91b017016d5b..3fc697293819 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
@@ -121,6 +121,7 @@ void br_fdb_cleanup(unsigned long _data) | |||
121 | { | 121 | { |
122 | struct net_bridge *br = (struct net_bridge *)_data; | 122 | struct net_bridge *br = (struct net_bridge *)_data; |
123 | unsigned long delay = hold_time(br); | 123 | unsigned long delay = hold_time(br); |
124 | unsigned long next_timer = jiffies + br->forward_delay; | ||
124 | int i; | 125 | int i; |
125 | 126 | ||
126 | spin_lock_bh(&br->hash_lock); | 127 | spin_lock_bh(&br->hash_lock); |
@@ -129,14 +130,21 @@ void br_fdb_cleanup(unsigned long _data) | |||
129 | struct hlist_node *h, *n; | 130 | struct hlist_node *h, *n; |
130 | 131 | ||
131 | hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) { | 132 | hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) { |
132 | if (!f->is_static && | 133 | unsigned long this_timer; |
133 | time_before_eq(f->ageing_timer + delay, jiffies)) | 134 | if (f->is_static) |
135 | continue; | ||
136 | this_timer = f->ageing_timer + delay; | ||
137 | if (time_before_eq(this_timer, jiffies)) | ||
134 | fdb_delete(f); | 138 | fdb_delete(f); |
139 | else if (this_timer < next_timer) | ||
140 | next_timer = this_timer; | ||
135 | } | 141 | } |
136 | } | 142 | } |
137 | spin_unlock_bh(&br->hash_lock); | 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 | /* Completely flush all dynamic entries in forwarding database.*/ | 150 | /* Completely flush all dynamic entries in forwarding database.*/ |