Re: open sockets preventing unregister_netdevice from completing in linux-next (next-20120724)
From: Eric Dumazet <hidden>
Date: 2012-07-25 14:38:53
On Wed, 2012-07-25 at 15:45 +0200, Bjørn Mork wrote:
I am currently researching several power management regressions in linux-next as of next-20120724, spread over the PCI, USB and net subsystems. This one I believe belongs to the net subsystem, although I definitely may be wrong, mixing these together. My test case is: - open a ssh connection over a USB network device (qmi_wwan - which is why I am looking at this, but I really don't think it's the driver this time) - suspend laptop with netdev and ssh connection up - attempt to resume The USB device will be gone on resume because it is power cycled, so the drivers need to clean up, to let the device be rediscovered and bound again. But this does not happen anymore in linux-next as long as some socket is open. Instead we have these messages: Jul 25 15:13:11 nemi kernel: [ 7704.560306] unregister_netdevice: waiting for wwan0 to become free. Usage count = 1 Jul 25 15:13:21 nemi kernel: [ 7714.800308] unregister_netdevice: waiting for wwan0 to become free. Usage count = 1 Jul 25 15:13:31 nemi kernel: [ 7725.040316] unregister_netdevice: waiting for wwan0 to become free. Usage count = 1 There are quite a few problems with the system in this state. Any write to the power/control associated with that USB device will hang, presumably because the USB device does not exist anymore. This will also make new attempts to suspend fail. And the USB device is of course not functional. The driver has not yet had a chance to clean up any of the other devices associated with the dead USB device (wwan1, /dev/cdc-wdm0 and /dev/cdc-wdm1), so these ghost devices will appear as non- functional. And new devices cannot be registered until the previous USB device is deleted and a new one created. Killing the ssh session let the unregister_netdevice continue and everything will be cleaned up and go back to normal. This is a regression compared to 3.5, where unregister_netdevice would succeed regardless of any open sockets. Or maybe the sockets were auto-reaped? I don't know the inner details - just observing the results. The test case above is quite normal operational mode for me. I often leave open sessions while suspending (because I intend to continue using them after resuming). And I always forget that this won't work for the USB modem case. I don't really care either. I expect the netdev to be removed, routes deleted and any sockets referencing either should just die or live on as zombies or whatever. The important part is that they should not prevent deletion of a netdev when e.g. the physical device is gone. That's the way things used to work.
Yes, we miss what was done with rt_cache_flush() : find all cached routes and release all dev references...