On Friday 10 January 2003 00:28, Oliver Neukum wrote: > > static void __exit udsl_usb_cleanup (void) > > { > > - /* killing threads */ > > - udsl_atm_sar_stop (); > > usb_deregister (&udsl_usb_driver); > > Not quite. You need to make sure that no tasklet is running.
Hi Oliver, thanks for looking the patch over. I thought about this issue and came to the conclusion that the tasklet cannot be running. The reason is as follows: the tasklet is only scheduled in the completion handler udsl_usb_data_receive (and only when status is normal). This is in_interrupt() so the tasklet is run before returning from the interrupt (see softirq.c). Thus at worst the tasklet will have finished running by the following point (udsl_usb_data_exit): /* destroy urbs */ for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) { struct udsl_data_ctx *ctx = &(instance->rcvbufs[i]); if ((!ctx->urb) || (!ctx->skb)) continue; usb_unlink_urb (ctx->urb); <======== HERE usb_free_urb (ctx->urb); kfree_skb (ctx->skb); ctx->skb = NULL; } And this is OK. Do you agree? All the best, Duncan. ------------------------------------------------------- This SF.NET email is sponsored by: SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See! http://www.vasoftware.com _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel