Johannes Erdfelt <[EMAIL PROTECTED]> writes: > While the patch is good for the header->bLength case, I don't think > this is what is causing the problem. > > All connects and disconnects are serialized through khubd. There's no > way we could call usb_destroy_configuration when we're in > usb_parse_interface.
Here is part of the stack trace from the oops/panic in my first message about this problem: >>EIP; c012ad65 <kfree+35/a0> <===== Trace; c4817ee4 <[usbcore]usb_destroy_configuration+104/210> Trace; c48171e2 <[usbcore]usb_free_dev+22/50> Trace; c48288b5 <[usb-uhci]process_urb+1e5/200> Trace; c4828991 <[usb-uhci]uhci_interrupt+c1/130> As can be seen from the above, usb_destroy_configuration is called from interrupt context, and I don't see how a kernel thread could serialize interrupt processing, unless it is preventing the interrupts from triggering. Anyway, usb_free_dev looks like this: void usb_free_dev(struct usb_device *dev) { if (atomic_dec_and_test(&dev->refcnt)) { dev->bus->op->deallocate(dev); usb_destroy_configuration(dev); ... Maybe the dec_and_test is not supposed to ever return true when called from interrupt context. That would indicate there is a reference counting bug somewhere. > Also, if header->bLength is < 2, then we'll almost always get an oops, > not just if the device disappears quickly. That's another strange thing. I added code to explicitly set bLength to 0, just to trigger this error condition. Then I added debug messages in usb_destroy_configuration to see what would happen, and the kfree(as->extra) line was never executed. It didn't even kfree(ifp->altsetting), so this looks like a memory leak. -- Peter Osterlund - [EMAIL PROTECTED] http://w1.894.telia.com/~u89404340 _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel