Message ID | 1496329675-11254-1-git-send-email-nikolay@cumulusnetworks.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Date: Thu, 1 Jun 2017 18:07:55 +0300 > When the transition of NO_STP -> KERNEL_STP was fixed by always calling > mod_timer in br_stp_start, it introduced a new regression which causes > the timer to be armed even when the bridge is down, and since we stop > the timers in its ndo_stop() function, they never get disabled if the > device is destroyed before it's upped. > > To reproduce: > $ while :; do ip l add br0 type bridge hello_time 100; brctl stp br0 on; > ip l del br0; done; > > CC: Xin Long <lucien.xin@gmail.com> > CC: Ivan Vecera <cera@cera.cz> > CC: Sebastian Ott <sebott@linux.vnet.ibm.com> > Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com> > Fixes: 6d18c732b95c ("bridge: start hello_timer when enabling KERNEL_STP in br_stp_start") > Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Applied and queued up for -stable.
On Thu, 1 Jun 2017, Nikolay Aleksandrov wrote: > When the transition of NO_STP -> KERNEL_STP was fixed by always calling > mod_timer in br_stp_start, it introduced a new regression which causes > the timer to be armed even when the bridge is down, and since we stop > the timers in its ndo_stop() function, they never get disabled if the > device is destroyed before it's upped. > > To reproduce: > $ while :; do ip l add br0 type bridge hello_time 100; brctl stp br0 on; > ip l del br0; done; > > CC: Xin Long <lucien.xin@gmail.com> > CC: Ivan Vecera <cera@cera.cz> > CC: Sebastian Ott <sebott@linux.vnet.ibm.com> > Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com> > Fixes: 6d18c732b95c ("bridge: start hello_timer when enabling KERNEL_STP in br_stp_start") > Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> > --- > Sebastian it'd be great if you can test the patch as well. I did and can confirm that it fixes the problem. Thanks, Sebastian
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 4efd5d54498a..89110319ef0f 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c @@ -173,7 +173,8 @@ static void br_stp_start(struct net_bridge *br) br_debug(br, "using kernel STP\n"); /* To start timers on any ports left in blocking */ - mod_timer(&br->hello_timer, jiffies + br->hello_time); + if (br->dev->flags & IFF_UP) + mod_timer(&br->hello_timer, jiffies + br->hello_time); br_port_state_selection(br); }
When the transition of NO_STP -> KERNEL_STP was fixed by always calling mod_timer in br_stp_start, it introduced a new regression which causes the timer to be armed even when the bridge is down, and since we stop the timers in its ndo_stop() function, they never get disabled if the device is destroyed before it's upped. To reproduce: $ while :; do ip l add br0 type bridge hello_time 100; brctl stp br0 on; ip l del br0; done; CC: Xin Long <lucien.xin@gmail.com> CC: Ivan Vecera <cera@cera.cz> CC: Sebastian Ott <sebott@linux.vnet.ibm.com> Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Fixes: 6d18c732b95c ("bridge: start hello_timer when enabling KERNEL_STP in br_stp_start") Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> --- Sebastian it'd be great if you can test the patch as well. net/bridge/br_stp_if.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)