On Fri, Jun 21, 2013 at 12:52 AM, Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > On Thu, 20 Jun 2013, Ming Lei wrote: > >> On Thu, Jun 20, 2013 at 10:59 PM, Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: >> > >> > By the way, did you consider the race that Oliver pointed out? When an >> > HCD is removed, all the outstanding URBs for all devices on its bus get >> > cancelled. The core waits until the urb_list for each endpoint is >> > empty. >> >> This should be enough since during remove path usbcore will wait for all >> URBs' completion which is only triggered by tasklet, so once all URBs are >> finished, the tasklet list has been empty already. > > No, usbcore only waits until the urb_list for each endpoint is empty. > It doesn't keep track of the individual URB completions. Look at > usb_hcd_flush_endpoint() and you'll see. But, if URBs still aren't completed after usb_disconnect(), it should be bug of usbcore or driver, shouldn't it? > >> > (Probably it's sufficient to wait until the tasklet lists are empty. I >> > assume tasklet_kill() won't stop a tasklet that's currently running.) >> >> From the implementation of tasklet_kill(), it will wait for the completion >> of the tasklet. >> >> Actually the tasklet_kill() should not be necessary, I think. > > You're probably right. But we should wait until the tasklet's list is > empty; we don't want to deallocate an hcd structure until all the URBs > are taken off. I will keep the tasklet_kill() for safe reason. Thanks, -- Ming Lei -- 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