Stephen Hemminger
2007-Oct-16 09:40 UTC
[Bridge] [PATCH 2.6.23.1] Kill STP hello timer if STP is not enabled
On Mon, 15 Oct 2007 23:48:12 +0200 Micha? Miros?aw <mirq-linux@rere.qmqm.pl> wrote:> Quick CPU eater kill. This might be not the best fix possible. > > Without this patch, hello_timer is firing 250 times/sec and eating about > 8% CPU time on my an otherwise idle system (dynticks enabled). 2.6.21.5 was > even worse - 20% (HZ=1000). (br->hello_time was supposedly 0 when STP was > disabled). > > Signed-off-by: Micha? Miros?aw <mirq-linux@rere.qmqm.pl>Good idea, but patch needs work. The default hello_time is 2 seconds, so if it is going up to 250/sec then maybe other root bridge is updating it. I don't see where hello_time gets set to 0 if STP disabled? My preference would be to have hello_time set to zero if not running STP and not start timer if it is zero. Also, the check for not sending config BPDU is separate. We do was time deciding to send BPDU when STP is disabled, the existing test could just be moved up the call chain. -- Stephen Hemminger <shemminger@linux-foundation.org>
Michał Mirosław
2007-Oct-16 10:31 UTC
[Bridge] [PATCH 2.6.23.1] Kill STP hello timer if STP is not enabled
Quick CPU eater kill. This might be not the best fix possible. Without this patch, hello_timer is firing 250 times/sec and eating about 8% CPU time on my an otherwise idle system (dynticks enabled). 2.6.21.5 was even worse - 20% (HZ=1000). (br->hello_time was supposedly 0 when STP was disabled). Signed-off-by: Micha? Miros?aw <mirq-linux@rere.qmqm.pl> --- qmqm/net/bridge/br_stp_if.c.orig 2007-10-15 10:30:24.000000000 +0200 +++ qmqm/net/bridge/br_stp_if.c 2007-10-15 10:34:07.000000000 +0200 @@ -47,10 +47,12 @@ struct net_bridge_port *p; spin_lock_bh(&br->lock); - mod_timer(&br->hello_timer, jiffies + br->hello_time); + if (br->stp_enabled == BR_KERNEL_STP) + mod_timer(&br->hello_timer, jiffies + br->hello_time); mod_timer(&br->gc_timer, jiffies + HZ/10); - br_config_bpdu_generation(br); + if (br->stp_enabled == BR_KERNEL_STP) + br_config_bpdu_generation(br); list_for_each_entry(p, &br->port_list, list) { if ((p->dev->flags & IFF_UP) && netif_carrier_ok(p->dev))