On 03/05/2016 03:44 PM, Xin Long wrote: > On Thu, Mar 3, 2016 at 8:29 PM, Nikolay Aleksandrov > <niko...@cumulusnetworks.com> wrote: >> >> This is incorrect because you don't have rtnl here, bridge device sysfs >> options take care of rtnl only on per-option basis and they obtain and >> release it themselves, so you won't have rtnl held when you call >> netdev_state_change. While I agree that this is needed, a larger change >> would be necessary for br_sysfs_br.c. > Sorry, I can't follow you, cause I didn't see any held in dev_ioctl, like: > ipip6_tunnel_ioctl > ipip6_tunnel_update > netdev_state_change > > why sysfs have to hold rtnl ? >
See the comment above dev_ifsioc: /* * Perform the SIOCxIFxxx calls, inside rtnl_lock() */ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) { ... it is usually called like: rtnl_lock(); ret = dev_ifsioc(net, &ifr, cmd); rtnl_unlock(); And also you cannot be calling netdevice notifiers without RTNL. So in any case you do need it here as well, in fact you'll surely hit the ASSERT_RTNL(); in call_netdevice_notifiers_info if you do so, thus I'm not sure how this patch was actually tested. >> Off-topic: I've been looking into factoring out the bond option API and >> reusing >> it here as it already has all of this handled, but I won't have time to >> finish >> it before the next merge window, so if you fix the issue here I'm okay with >> this as interim solution. >> >> Cheers, >> Nik >>