Ming Lei <tom.leiming@xxxxxxxxx> writes: > On Sat, Jun 23, 2012 at 4:45 PM, Bjørn Mork <bjorn@xxxxxxx> wrote: > >> usbnet_disconnect() cannot continue to the point where it frees the >> netdev before wdm_open/wdm_close has completed, because it waits for >> qmi_wwan_unbind which waits for wdm_disconnect. And wdm_disconnect >> takes the both read and write mutexes. > > Thanks for your explanation. > > I see, and your patch is correct, but it might not be generic enough. > > So driver_info->unbind will sync with .open/.close of the subdriver, > just like unregister_netdev will sync with .open/.close of usbnet interface. > > IMO, the general solution is to keep intfdata's lifetime after ->unbind, > which can guarantee that intfdata can be accessed safely in .open/.close > of usbnet interface and the other subdrivers' device. > > Suppose there will be another usbnet driver which has its own subdriver > too, the same trick of checking need to be added again if not taking the > general way of simply removing 'usb_set_intfdata(intf, NULL);' in > usbnet_disconnect. Yes, I guess so. I am just worrying (maybe too much) about the unknown consequences of removing that code in usbnet, not fully understanding why it was there in the first place. And I do not want to take the blame and cleanup work if anything goes wrong :-) Fixing it in qmi_wwan feels much safer. But if you want to remove the 'usb_set_intfdata(intf, NULL)', and the other USB gurus agree, then I'm of course not going to object to that alternative solution to this bug. I still think it's unlikely this will ever hit another driver though. Bjørn -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html