I've seen this issue before as well when adding RCU locking to xlate. It happens because refs to a netdev still exist (in this case, likely the tunnel has a ref to the netdev) when the main thread tries to delete the netdev. Thus, the netdev never gets deleted and the netdev cannot be recreated with a new type. I tested out the fix and it works with my patch as well.
Ryan Wilson Member of Technical Staff wr...@vmware.com 3401 Hillview Avenue, Palo Alto, CA 650.427.1511 Office 916.588.7783 Mobile On May 4, 2014, at 4:18 PM, Joe Stringer <joestrin...@nicira.com> wrote: > On 3 May 2014 02:56, Ben Pfaff <b...@nicira.com> wrote: > On Fri, May 02, 2014 at 01:13:43PM +1200, Joe Stringer wrote: > > Previously, it was possible to open a netdevice as one type, then > > proceed to open it as a different type without first closing it. The > > bridge code would expect it to be opened as the latter type and try to > > apply configuration to it. This patch catches the problem earlier by > > detecting the case in netdev_open() and logging a warning message. > > > > Bug #1198386. > > > > Signed-off-by: Joe Stringer <joestrin...@nicira.com> > > --- > > I'm not sure if this case is meant to be possible, but I've observed it, > > and this patch makes the error more obvious in the logs. > > You might want to test this against usage patterns that would try to > reuse a netdev name quickly for a different kind of device. e.g.: > > # Create myport as internal port. > ovs-vsctl add-port br0 myport -- set interface myport type=internal > > # Change myport to a tunnel. > ovs-vsctl set interface myport type=gre options:remote_ip=1.2.3.4 > > (I believe that this currently works. It should; it used to.) > > This case seems to work fine. However, if you start with two tunnel ports, > then changing the configuration for one does not always work. This appears to > be a long-standing bug. > > > A full example which I would expect to work, but doesn't: > > * ovs-vsctl add-port br0 p0 -- set int p0 type=gre options:remote_ip=1.2.3.4 > * ovs-vsctl add-port br0 p1 -- set int p1 type=internal > * ovs-vsctl set int p1 type=gre options:remote_ip=1.2.3.4 > * ovs-vsctl set int p1 type=internal > > The last step here fails: before this patch, it cannot apply gre settings to > the device (even though it is configuring to type internal). With this patch, > we see EEXIST and the error message added by this patch. For some reason, > having the other gre port around means that p1 is not completely unreferenced > before reconfiguration. Subsequently, when we reopen p1 as a different type, > we receive the original (gre) netdev. Although ovs-vsctl reflects the change > in type, the actual netdev class being used is the gre one. > > > I've proposed a fix for this bug here: > http://openvswitch.org/pipermail/dev/2014-May/039755.html > _______________________________________________ > dev mailing list > dev@openvswitch.org > https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailman/listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=TfBS78Vw3dzttvXidhbffg%3D%3D%0A&m=av4pG3HTLdorDKsrLxxaUUZHLH%2Bm5WyoFfhanzvZx4E%3D%0A&s=867aea33cbeaee0ce83bec77ca97321a68419328a264d09bf3c60698f50f89e0
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev