Hi, The xhcd_hci driver causes some scary warnings to be printed on rmmod: [ 33.189425] xhci_hcd 0000:04:00.0: remove, state 4 [ 33.189528] usb usb8: USB disconnect, address 1 [ 33.225678] xhci_hcd 0000:04:00.0: Host controller not halted, aborting reset. [ 33.225678] [ 33.225678] ====================================================== [ 33.225678] [ INFO: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected ] [ 33.225678] 2.6.37-rc6+ #12 [ 33.225678] ------------------------------------------------------ [ 33.225678] rmmod/6075 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire: [ 33.225678] (proc_subdir_lock){+.+...}, at: [<ffffffff81152aae>] remove_proc_entry+0x2e/0x2a0 [ 33.225678] [ 33.225678] and this task is already holding: [ 33.225678] (&(&xhci->lock)->rlock){-.....}, at: [<ffffffffa0134c9d>] xhci_stop+0x1d/0x80 [xhci_hcd] [ 33.225678] which would create a new lock dependency: [ 33.225678] (&(&xhci->lock)->rlock){-.....} -> (proc_subdir_lock){+.+...} [ 33.225678] [ 33.225678] but this new dependency connects a HARDIRQ-irq-safe lock: [ 33.240111] (&(&xhci->lock)->rlock){-.....} [ 33.240111] ... which became HARDIRQ-irq-safe at: [ 33.240111] [<ffffffff8107a462>] __lock_acquire+0xc52/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffffa013e3f4>] xhci_irq+0x34/0x1c0 [xhci_hcd] [ 33.240111] [<ffffffffa013e594>] xhci_msi_irq+0x14/0x20 [xhci_hcd] [ 33.240111] [<ffffffff810a3e2a>] handle_IRQ_event+0x3a/0xe0 [ 33.240111] [<ffffffff810a66ee>] handle_edge_irq+0xce/0x180 [ 33.240111] [<ffffffff810057e4>] handle_irq+0x44/0xa0 [ 33.240111] [<ffffffff8100541d>] do_IRQ+0x6d/0xf0 [ 33.240111] [<ffffffff81495c53>] ret_from_intr+0x0/0xf [ 33.240111] [ 33.240111] to a HARDIRQ-irq-unsafe lock: [ 33.240111] (proc_subdir_lock){+.+...} [ 33.240111] ... which became HARDIRQ-irq-unsafe at: [ 33.240111] ... [<ffffffff81079f75>] __lock_acquire+0x765/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffff81151f31>] __proc_create+0x61/0x150 [ 33.240111] [<ffffffff811528db>] proc_symlink+0x2b/0xb0 [ 33.240111] [<ffffffff81ac3254>] proc_root_init+0x69/0xc0 [ 33.240111] [<ffffffff81aa6c55>] start_kernel+0x3ca/0x3e9 [ 33.240111] [<ffffffff81aa6322>] x86_64_start_reservations+0x132/0x136 [ 33.240111] [<ffffffff81aa641c>] x86_64_start_kernel+0xf6/0xfd [ 33.240111] [ 33.240111] other info that might help us debug this: [ 33.240111] [ 33.240111] 3 locks held by rmmod/6075: [ 33.240111] #0: (&__lockdep_no_validate__){+.+.+.}, at: [<ffffffff8132e56c>] driver_detach+0x4c/0xd0 [ 33.240111] #1: (&__lockdep_no_validate__){+.+.+.}, at: [<ffffffff8132e57a>] driver_detach+0x5a/0xd0 [ 33.240111] #2: (&(&xhci->lock)->rlock){-.....}, at: [<ffffffffa0134c9d>] xhci_stop+0x1d/0x80 [xhci_hcd] [ 33.240111] [ 33.240111] the dependencies between HARDIRQ-irq-safe lock and the holding lock: [ 33.240111] -> (&(&xhci->lock)->rlock){-.....} ops: 14 { [ 33.240111] IN-HARDIRQ-W at: [ 33.240111] [<ffffffff8107a462>] __lock_acquire+0xc52/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffffa013e3f4>] xhci_irq+0x34/0x1c0 [xhci_hcd] [ 33.240111] [<ffffffffa013e594>] xhci_msi_irq+0x14/0x20 [xhci_hcd] [ 33.240111] [<ffffffff810a3e2a>] handle_IRQ_event+0x3a/0xe0 [ 33.240111] [<ffffffff810a66ee>] handle_edge_irq+0xce/0x180 [ 33.240111] [<ffffffff810057e4>] handle_irq+0x44/0xa0 [ 33.240111] [<ffffffff8100541d>] do_IRQ+0x6d/0xf0 [ 33.240111] [<ffffffff81495c53>] ret_from_intr+0x0/0xf [ 33.240111] INITIAL USE at: [ 33.240111] [<ffffffff81079bd9>] __lock_acquire+0x3c9/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffffa013e3f4>] xhci_irq+0x34/0x1c0 [xhci_hcd] [ 33.240111] [<ffffffffa013e594>] xhci_msi_irq+0x14/0x20 [xhci_hcd] [ 33.240111] [<ffffffff810a3e2a>] handle_IRQ_event+0x3a/0xe0 [ 33.240111] [<ffffffff810a66ee>] handle_edge_irq+0xce/0x180 [ 33.240111] [<ffffffff810057e4>] handle_irq+0x44/0xa0 [ 33.240111] [<ffffffff8100541d>] do_IRQ+0x6d/0xf0 [ 33.240111] [<ffffffff81495c53>] ret_from_intr+0x0/0xf [ 33.240111] } [ 33.240111] ... key at: [<ffffffffa0149314>] __key.26332+0x0/0xffffffffffff649c [xhci_hcd] [ 33.240111] ... acquired at: [ 33.240111] [<ffffffff81079100>] check_irq_usage+0x60/0xf0 [ 33.240111] [<ffffffff8107a840>] __lock_acquire+0x1030/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffff81152aae>] remove_proc_entry+0x2e/0x2a0 [ 33.240111] [<ffffffff810a779c>] unregister_handler_proc+0x2c/0x40 [ 33.240111] [<ffffffff810a4500>] __free_irq+0x100/0x250 [ 33.240111] [<ffffffff810a4692>] free_irq+0x42/0x80 [ 33.240111] [<ffffffffa01345be>] xhci_free_irq+0x7e/0x90 [xhci_hcd] [ 33.240111] [<ffffffffa01345f0>] xhci_cleanup_msix+0x20/0x80 [xhci_hcd] [ 33.240111] [<ffffffffa0134cb5>] xhci_stop+0x35/0x80 [xhci_hcd] [ 33.240111] [<ffffffff813799f6>] usb_remove_hcd+0xe6/0x160 [ 33.240111] [<ffffffff81389f01>] usb_hcd_pci_remove+0x51/0xc0 [ 33.240111] [<ffffffff811e415d>] pci_device_remove+0x4d/0x110 [ 33.240111] [<ffffffff8132dd70>] __device_release_driver+0x70/0xe0 [ 33.240111] [<ffffffff8132e5e8>] driver_detach+0xc8/0xd0 [ 33.240111] [<ffffffff8132dbe6>] bus_remove_driver+0x96/0x100 [ 33.240111] [<ffffffff8132e679>] driver_unregister+0x59/0x90 [ 33.240111] [<ffffffff811e3dbf>] pci_unregister_driver+0x3f/0xa0 [ 33.240111] [<ffffffffa013a7d0>] xhci_unregister_pci+0x10/0x20 [xhci_hcd] [ 33.240111] [<ffffffffa013f7ae>] xhci_hcd_cleanup+0x9/0xb [xhci_hcd] [ 33.240111] [<ffffffff81085a07>] sys_delete_module+0x167/0x250 [ 33.240111] [<ffffffff8100273b>] system_call_fastpath+0x16/0x1b [ 33.240111] [ 33.240111] [ 33.240111] the dependencies between the lock to be acquired and HARDIRQ-irq-unsafe lock: [ 33.240111] -> (proc_subdir_lock){+.+...} ops: 6970 { [ 33.240111] HARDIRQ-ON-W at: [ 33.240111] [<ffffffff81079f75>] __lock_acquire+0x765/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffff81151f31>] __proc_create+0x61/0x150 [ 33.240111] [<ffffffff811528db>] proc_symlink+0x2b/0xb0 [ 33.240111] [<ffffffff81ac3254>] proc_root_init+0x69/0xc0 [ 33.240111] [<ffffffff81aa6c55>] start_kernel+0x3ca/0x3e9 [ 33.240111] [<ffffffff81aa6322>] x86_64_start_reservations+0x132/0x136 [ 33.240111] [<ffffffff81aa641c>] x86_64_start_kernel+0xf6/0xfd [ 33.240111] SOFTIRQ-ON-W at: [ 33.240111] [<ffffffff81079fb0>] __lock_acquire+0x7a0/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffff81151f31>] __proc_create+0x61/0x150 [ 33.240111] [<ffffffff811528db>] proc_symlink+0x2b/0xb0 [ 33.240111] [<ffffffff81ac3254>] proc_root_init+0x69/0xc0 [ 33.240111] [<ffffffff81aa6c55>] start_kernel+0x3ca/0x3e9 [ 33.240111] [<ffffffff81aa6322>] x86_64_start_reservations+0x132/0x136 [ 33.240111] [<ffffffff81aa641c>] x86_64_start_kernel+0xf6/0xfd [ 33.240111] INITIAL USE at: [ 33.240111] [<ffffffff81079bd9>] __lock_acquire+0x3c9/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffff81151f31>] __proc_create+0x61/0x150 [ 33.240111] [<ffffffff811528db>] proc_symlink+0x2b/0xb0 [ 33.240111] [<ffffffff81ac3254>] proc_root_init+0x69/0xc0 [ 33.240111] [<ffffffff81aa6c55>] start_kernel+0x3ca/0x3e9 [ 33.240111] [<ffffffff81aa6322>] x86_64_start_reservations+0x132/0x136 [ 33.240111] [<ffffffff81aa641c>] x86_64_start_kernel+0xf6/0xfd [ 33.240111] } [ 33.240111] ... key at: [<ffffffff81a443f8>] proc_subdir_lock+0x18/0x40 [ 33.240111] ... acquired at: [ 33.240111] [<ffffffff81079100>] check_irq_usage+0x60/0xf0 [ 33.240111] [<ffffffff8107a840>] __lock_acquire+0x1030/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffff81152aae>] remove_proc_entry+0x2e/0x2a0 [ 33.240111] [<ffffffff810a779c>] unregister_handler_proc+0x2c/0x40 [ 33.240111] [<ffffffff810a4500>] __free_irq+0x100/0x250 [ 33.240111] [<ffffffff810a4692>] free_irq+0x42/0x80 [ 33.240111] [<ffffffffa01345be>] xhci_free_irq+0x7e/0x90 [xhci_hcd] [ 33.240111] [<ffffffffa01345f0>] xhci_cleanup_msix+0x20/0x80 [xhci_hcd] [ 33.240111] [<ffffffffa0134cb5>] xhci_stop+0x35/0x80 [xhci_hcd] [ 33.240111] [<ffffffff813799f6>] usb_remove_hcd+0xe6/0x160 [ 33.240111] [<ffffffff81389f01>] usb_hcd_pci_remove+0x51/0xc0 [ 33.240111] [<ffffffff811e415d>] pci_device_remove+0x4d/0x110 [ 33.240111] [<ffffffff8132dd70>] __device_release_driver+0x70/0xe0 [ 33.240111] [<ffffffff8132e5e8>] driver_detach+0xc8/0xd0 [ 33.240111] [<ffffffff8132dbe6>] bus_remove_driver+0x96/0x100 [ 33.240111] [<ffffffff8132e679>] driver_unregister+0x59/0x90 [ 33.240111] [<ffffffff811e3dbf>] pci_unregister_driver+0x3f/0xa0 [ 33.240111] [<ffffffffa013a7d0>] xhci_unregister_pci+0x10/0x20 [xhci_hcd] [ 33.240111] [<ffffffffa013f7ae>] xhci_hcd_cleanup+0x9/0xb [xhci_hcd] [ 33.240111] [<ffffffff81085a07>] sys_delete_module+0x167/0x250 [ 33.240111] [<ffffffff8100273b>] system_call_fastpath+0x16/0x1b [ 33.240111] [ 33.240111] [ 33.240111] stack backtrace: [ 33.240111] Pid: 6075, comm: rmmod Not tainted 2.6.37-rc6+ #12 [ 33.240111] Call Trace: [ 33.240111] [<ffffffff81079097>] check_usage+0x497/0x4a0 [ 33.240111] [<ffffffff81079100>] check_irq_usage+0x60/0xf0 [ 33.240111] [<ffffffff8107a840>] __lock_acquire+0x1030/0x1ca0 [ 33.240111] [<ffffffff8107b9f7>] lock_acquire+0x57/0x70 [ 33.240111] [<ffffffff81152aae>] ? remove_proc_entry+0x2e/0x2a0 [ 33.240111] [<ffffffff81494e06>] _raw_spin_lock+0x36/0x50 [ 33.240111] [<ffffffff81152aae>] ? remove_proc_entry+0x2e/0x2a0 [ 33.240111] [<ffffffff81152aae>] remove_proc_entry+0x2e/0x2a0 [ 33.240111] [<ffffffff8104a939>] ? vprintk+0x2f9/0x4b0 [ 33.240111] [<ffffffff810a779c>] unregister_handler_proc+0x2c/0x40 [ 33.240111] [<ffffffff810a4500>] __free_irq+0x100/0x250 [ 33.240111] [<ffffffff810a4692>] free_irq+0x42/0x80 [ 33.240111] [<ffffffffa01345be>] xhci_free_irq+0x7e/0x90 [xhci_hcd] [ 33.240111] [<ffffffffa01345f0>] xhci_cleanup_msix+0x20/0x80 [xhci_hcd] [ 33.240111] [<ffffffffa0134cb5>] xhci_stop+0x35/0x80 [xhci_hcd] [ 33.240111] [<ffffffff813799f6>] usb_remove_hcd+0xe6/0x160 [ 33.240111] [<ffffffff81389f01>] usb_hcd_pci_remove+0x51/0xc0 [ 33.240111] [<ffffffff811e415d>] pci_device_remove+0x4d/0x110 [ 33.240111] [<ffffffff8132dd70>] __device_release_driver+0x70/0xe0 [ 33.240111] [<ffffffff8132e5e8>] driver_detach+0xc8/0xd0 [ 33.240111] [<ffffffff8132dbe6>] bus_remove_driver+0x96/0x100 [ 33.240111] [<ffffffff8132e679>] driver_unregister+0x59/0x90 [ 33.240111] [<ffffffff811e3dbf>] pci_unregister_driver+0x3f/0xa0 [ 33.240111] [<ffffffffa013a7d0>] xhci_unregister_pci+0x10/0x20 [xhci_hcd] [ 33.240111] [<ffffffffa013f7ae>] xhci_hcd_cleanup+0x9/0xb [xhci_hcd] [ 33.240111] [<ffffffff81085a07>] sys_delete_module+0x167/0x250 [ 33.240111] [<ffffffff8100276c>] ? sysret_check+0x27/0x62 [ 33.240111] [<ffffffff8107c3bd>] ? trace_hardirqs_on_caller+0x12d/0x170 [ 33.240111] [<ffffffff8100273b>] system_call_fastpath+0x16/0x1b [ 33.240111] BUG: sleeping function called from invalid context at /home/rafael/src/linux-2.6/kernel/mutex.c:278 [ 33.240111] in_atomic(): 1, irqs_disabled(): 1, pid: 6075, name: rmmod [ 33.240111] INFO: lockdep is turned off. [ 33.240111] irq event stamp: 4560 [ 33.240111] hardirqs last enabled at (4559): [<ffffffff8149571d>] _raw_spin_unlock_irqrestore+0x5d/0x70 [ 33.240111] hardirqs last disabled at (4560): [<ffffffff81494e92>] _raw_spin_lock_irq+0x12/0x50 [ 33.240111] softirqs last enabled at (4494): [<ffffffff81400845>] sk_filter+0xd5/0x100 [ 33.240111] softirqs last disabled at (4492): [<ffffffff814007ad>] sk_filter+0x3d/0x100 [ 33.240111] Pid: 6075, comm: rmmod Not tainted 2.6.37-rc6+ #12 [ 33.240111] Call Trace: [ 33.240111] [<ffffffff81079290>] ? print_irqtrace_events+0xd0/0xe0 [ 33.240111] [<ffffffff81036783>] __might_sleep+0x103/0x130 [ 33.240111] [<ffffffff81492f73>] mutex_lock_nested+0x33/0x380 [ 33.240111] [<ffffffff814956fd>] ? _raw_spin_unlock_irqrestore+0x3d/0x70 [ 33.240111] [<ffffffff810a39de>] ? dynamic_irq_cleanup+0xde/0x100 [ 33.240111] [<ffffffff810a3a58>] irq_free_descs+0x58/0x90 [ 33.240111] [<ffffffff81022008>] destroy_irq+0x78/0x90 [ 33.240111] [<ffffffff810222c9>] native_teardown_msi_irq+0x9/0x10 [ 33.240111] [<ffffffff811ee0b0>] default_teardown_msi_irqs+0x70/0xa0 [ 33.240111] [<ffffffff811edb41>] free_msi_irqs+0xa1/0x110 [ 33.240111] [<ffffffff811eec1d>] pci_disable_msix+0x3d/0x50 [ 33.240111] [<ffffffffa0134609>] xhci_cleanup_msix+0x39/0x80 [xhci_hcd] [ 33.240111] [<ffffffffa0134cb5>] xhci_stop+0x35/0x80 [xhci_hcd] [ 33.240111] [<ffffffff813799f6>] usb_remove_hcd+0xe6/0x160 [ 33.240111] [<ffffffff81389f01>] usb_hcd_pci_remove+0x51/0xc0 [ 33.240111] [<ffffffff811e415d>] pci_device_remove+0x4d/0x110 [ 33.240111] [<ffffffff8132dd70>] __device_release_driver+0x70/0xe0 [ 33.240111] [<ffffffff8132e5e8>] driver_detach+0xc8/0xd0 [ 33.240111] [<ffffffff8132dbe6>] bus_remove_driver+0x96/0x100 [ 33.240111] [<ffffffff8132e679>] driver_unregister+0x59/0x90 [ 33.240111] [<ffffffff811e3dbf>] pci_unregister_driver+0x3f/0xa0 [ 33.240111] [<ffffffffa013a7d0>] xhci_unregister_pci+0x10/0x20 [xhci_hcd] [ 33.240111] [<ffffffffa013f7ae>] xhci_hcd_cleanup+0x9/0xb [xhci_hcd] [ 33.240111] [<ffffffff81085a07>] sys_delete_module+0x167/0x250 [ 33.240111] [<ffffffff8100276c>] ? sysret_check+0x27/0x62 [ 33.240111] [<ffffffff8107c3bd>] ? trace_hardirqs_on_caller+0x12d/0x170 [ 33.240111] [<ffffffff8100273b>] system_call_fastpath+0x16/0x1b [ 33.240111] ------------[ cut here ]------------ [ 33.240111] WARNING: at /home/rafael/src/linux-2.6/kernel/smp.c:432 smp_call_function_many+0xac/0x1f0() [ 33.240111] Hardware name: MS-7640 [ 33.240111] Modules linked in: nfsd lockd nfs_acl auth_rpcgss sunrpc exportfs snd_pcm_oss snd_mixer_oss snd_seq snd_seq_device edd ipv6 cpufreq_conservative cpufreq_ondemand cpufreq_userspace cpufreq_powersave powernow_k8 freq_table mperf ext3 jbd dm_mod snd_hda_codec_hdmi snd_hda_codec_realtek snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_timer snd sr_mod soundcore firewire_ohci evdev cdrom firewire_core serio_raw joydev snd_page_alloc button sg r8169 mii xhci_hcd(-) crc_itu_t ext4 jbd2 crc16 raid456 async_pq async_xor xor async_memcpy async_raid6_recov raid6_pq async_tx raid10 raid0 ohci_hcd ehci_hcd sd_mod crc_t10dif rtc_cmos rtc_core rtc_lib fan processor pata_jmicron thermal [ 33.240111] Pid: 6075, comm: rmmod Not tainted 2.6.37-rc6+ #12 [ 33.240111] Call Trace: [ 33.240111] [<ffffffff81049e5a>] warn_slowpath_common+0x7a/0xb0 [ 33.240111] [<ffffffff81030f60>] ? do_flush_tlb_all+0x0/0x50 [ 33.240111] [<ffffffff81049ea5>] warn_slowpath_null+0x15/0x20 [ 33.240111] [<ffffffff81082c5c>] smp_call_function_many+0xac/0x1f0 [ 33.240111] [<ffffffff81030f60>] ? do_flush_tlb_all+0x0/0x50 [ 33.240111] [<ffffffff81082de1>] smp_call_function+0x41/0x80 [ 33.240111] [<ffffffff81030f60>] ? do_flush_tlb_all+0x0/0x50 [ 33.240111] [<ffffffff8104fba5>] on_each_cpu+0x35/0x80 [ 33.240111] [<ffffffff810312c7>] flush_tlb_all+0x17/0x20 [ 33.240111] [<ffffffff810e0990>] remove_vm_area+0x90/0xc0 [ 33.240111] [<ffffffff8102c1a1>] iounmap+0x91/0xe0 [ 33.240111] [<ffffffff811edba9>] free_msi_irqs+0x109/0x110 [ 33.240111] [<ffffffff811eec1d>] pci_disable_msix+0x3d/0x50 [ 33.240111] [<ffffffffa0134609>] xhci_cleanup_msix+0x39/0x80 [xhci_hcd] [ 33.240111] [<ffffffffa0134cb5>] xhci_stop+0x35/0x80 [xhci_hcd] [ 33.240111] [<ffffffff813799f6>] usb_remove_hcd+0xe6/0x160 [ 33.240111] [<ffffffff81389f01>] usb_hcd_pci_remove+0x51/0xc0 [ 33.240111] [<ffffffff811e415d>] pci_device_remove+0x4d/0x110 [ 33.240111] [<ffffffff8132dd70>] __device_release_driver+0x70/0xe0 [ 33.240111] [<ffffffff8132e5e8>] driver_detach+0xc8/0xd0 [ 33.240111] [<ffffffff8132dbe6>] bus_remove_driver+0x96/0x100 [ 33.240111] [<ffffffff8132e679>] driver_unregister+0x59/0x90 [ 33.240111] [<ffffffff811e3dbf>] pci_unregister_driver+0x3f/0xa0 [ 33.240111] [<ffffffffa013a7d0>] xhci_unregister_pci+0x10/0x20 [xhci_hcd] [ 33.240111] [<ffffffffa013f7ae>] xhci_hcd_cleanup+0x9/0xb [xhci_hcd] [ 33.240111] [<ffffffff81085a07>] sys_delete_module+0x167/0x250 [ 33.240111] [<ffffffff8100276c>] ? sysret_check+0x27/0x62 [ 33.240111] [<ffffffff8107c3bd>] ? trace_hardirqs_on_caller+0x12d/0x170 [ 33.240111] [<ffffffff8100273b>] system_call_fastpath+0x16/0x1b [ 33.240111] ---[ end trace 78a8387880057ad9 ]--- [ 33.269230] xhci_hcd 0000:04:00.0: USB bus 8 deregistered [ 33.486574] xhci_hcd 0000:04:00.0: PCI INT A disabled [ 69.159848] xhci_hcd 0000:04:00.0: PCI INT A -> GSI 48 (level, low) -> IRQ 48 [ 69.161130] xhci_hcd 0000:04:00.0: enabling bus mastering [ 69.162281] xhci_hcd 0000:04:00.0: setting latency timer to 64 [ 69.163433] xhci_hcd 0000:04:00.0: xHCI Host Controller [ 69.164848] xhci_hcd 0000:04:00.0: new USB bus registered, assigned bus number 8 [ 69.193629] xhci_hcd 0000:04:00.0: enabling Mem-Wr-Inval [ 69.194848] xhci_hcd 0000:04:00.0: irq 48, io mem 0xfe5fe000 [ 69.196022] xhci_hcd 0000:04:00.0: irq 81 for MSI/MSI-X [ 69.197175] xhci_hcd 0000:04:00.0: irq 82 for MSI/MSI-X [ 69.198292] xhci_hcd 0000:04:00.0: irq 83 for MSI/MSI-X [ 69.199403] xhci_hcd 0000:04:00.0: irq 84 for MSI/MSI-X [ 69.200527] xhci_hcd 0000:04:00.0: irq 85 for MSI/MSI-X [ 69.201620] xhci_hcd 0000:04:00.0: irq 86 for MSI/MSI-X [ 69.202703] xhci_hcd 0000:04:00.0: irq 87 for MSI/MSI-X [ 69.203883] usb usb8: No SuperSpeed endpoint companion for config 1 interface 0 altsetting 0 ep 129: using minimum values [ 69.205038] usb usb8: New USB device found, idVendor=1d6b, idProduct=0003 [ 69.206166] usb usb8: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 69.207320] usb usb8: Product: xHCI Host Controller [ 69.208453] usb usb8: Manufacturer: Linux 2.6.37-rc6+ xhci_hcd [ 69.208458] usb usb8: SerialNumber: 0000:04:00.0 [ 69.208789] xHCI xhci_add_endpoint called for root hub [ 69.208791] xHCI xhci_check_bandwidth called for root hub [ 69.208919] hub 8-0:1.0: USB hub found [ 69.208929] hub 8-0:1.0: 4 ports detected and during shutdown (I believe the warnings are the same or analogous to the above). I tested with the attached patch from Andiry applied and I got the following BUG during resume: [ 91.703778] sd 0:0:0:0: [sda] Starting disk [ 91.704054] sd 2:0:0:0: [sdb] Starting disk [ 91.703680] xhci_hcd 0000:04:00.0: Host controller not halted, aborting reset. [ 91.703680] BUG: sleeping function called from invalid context at /home/rafael/src/linux-2.6/kernel/mutex.c:278 [ 91.703680] in_atomic(): 1, irqs_disabled(): 1, pid: 1234, name: kworker/u:6 [ 91.703680] INFO: lockdep is turned off. [ 91.703680] irq event stamp: 24060 [ 91.703680] hardirqs last enabled at (24059): [<ffffffff810aa071>] rcu_note_context_switch+0xa1/0x1c0 [ 91.703680] hardirqs last disabled at (24060): [<ffffffff81494e92>] _raw_spin_lock_irq+0x12/0x50 [ 91.703680] softirqs last enabled at (20026): [<ffffffff8105056e>] __do_softirq+0x11e/0x160 [ 91.703680] softirqs last disabled at (20011): [<ffffffff8100368c>] call_softirq+0x1c/0x30 [ 91.703680] Pid: 1234, comm: kworker/u:6 Tainted: G W 2.6.37-rc6+ #12 [ 91.703680] Call Trace: [ 91.703680] [<ffffffff81079290>] ? print_irqtrace_events+0xd0/0xe0 [ 91.703680] [<ffffffff81036783>] __might_sleep+0x103/0x130 [ 91.703680] [<ffffffff81492f73>] mutex_lock_nested+0x33/0x380 [ 91.703680] [<ffffffff81495727>] ? _raw_spin_unlock_irqrestore+0x67/0x70 [ 91.703680] [<ffffffff810a39de>] ? dynamic_irq_cleanup+0xde/0x100 [ 91.703680] [<ffffffff810a3a58>] irq_free_descs+0x58/0x90 [ 91.703680] [<ffffffff81022008>] destroy_irq+0x78/0x90 [ 91.703680] [<ffffffff810222c9>] native_teardown_msi_irq+0x9/0x10 [ 91.703680] [<ffffffff811ee0b0>] default_teardown_msi_irqs+0x70/0xa0 [ 91.703680] [<ffffffff811edb41>] free_msi_irqs+0xa1/0x110 [ 91.703680] [<ffffffff811eec1d>] pci_disable_msix+0x3d/0x50 [ 91.703680] [<ffffffffa03f0609>] xhci_cleanup_msix+0x39/0x80 [xhci_hcd] [ 91.703680] [<ffffffffa03f111c>] xhci_resume+0x1ac/0x250 [xhci_hcd] [ 91.703680] [<ffffffffa03f65c4>] xhci_pci_resume+0x14/0x20 [xhci_hcd] [ 91.703680] [<ffffffff8138996b>] resume_common+0xbb/0x140 [ 91.703680] [<ffffffff81389a5e>] hcd_pci_restore+0xe/0x10 [ 91.703680] [<ffffffff811e36f3>] pci_pm_restore+0x63/0xb0 [ 91.703680] [<ffffffff813334bd>] pm_op+0x19d/0x1c0 [ 91.703680] [<ffffffff81333be4>] device_resume+0x94/0x220 [ 91.703680] [<ffffffff81333d8c>] async_resume+0x1c/0x50 [ 91.703680] [<ffffffff8106e6e6>] async_run_entry_fn+0x86/0x160 [ 91.703680] [<ffffffff81060672>] process_one_work+0x1a2/0x450 [ 91.703680] [<ffffffff81060614>] ? process_one_work+0x144/0x450 [ 91.703680] [<ffffffff811d2704>] ? do_raw_spin_lock+0x104/0x170 [ 91.703680] [<ffffffff8106e660>] ? async_run_entry_fn+0x0/0x160 [ 91.703680] [<ffffffff81061e32>] worker_thread+0x162/0x340 [ 91.703680] [<ffffffff81061cd0>] ? worker_thread+0x0/0x340 [ 91.703680] [<ffffffff81066836>] kthread+0x96/0xa0 [ 91.703680] [<ffffffff81003594>] kernel_thread_helper+0x4/0x10 [ 91.703680] [<ffffffff81036fdb>] ? finish_task_switch+0x7b/0xe0 [ 91.703680] [<ffffffff81495d00>] ? restore_args+0x0/0x30 [ 91.703680] [<ffffffff810667a0>] ? kthread+0x0/0xa0 [ 91.703680] [<ffffffff81003590>] ? kernel_thread_helper+0x0/0x10 [ 91.706248] xhci_hcd 0000:04:00.0: irq 81 for MSI/MSI-X [ 91.706251] xhci_hcd 0000:04:00.0: irq 82 for MSI/MSI-X [ 91.706253] xhci_hcd 0000:04:00.0: irq 83 for MSI/MSI-X [ 91.706256] xhci_hcd 0000:04:00.0: irq 84 for MSI/MSI-X [ 91.706258] xhci_hcd 0000:04:00.0: irq 85 for MSI/MSI-X [ 91.706260] xhci_hcd 0000:04:00.0: irq 86 for MSI/MSI-X [ 91.706262] xhci_hcd 0000:04:00.0: irq 87 for MSI/MSI-X The issues appear to be 100% reproducible. Thanks, Rafael
Matthew, Can you help to test if this patch fix your xhci suspend and remove issue? Thanks. From: Andiry Xu <andiry.xu@xxxxxxx> Date: Mon, 6 Dec 2010 16:58:16 +0800 Subject: [PATCH] xHCI: synchronize interrupts in xhci_suspend() Matthew Garrett reports a interrupt double free in xHCI code when the host is suspended and then the card removed. Synchronize the interrupts instead of free them in xhci_suspned(). Reported-by: Matthew Garrett <mjg@xxxxxxxxxx> Signed-off-by: Andiry Xu <andiry.xu@xxxxxxx> --- drivers/usb/host/xhci.c | 37 +++++++++---------------------------- 1 file changed, 9 insertions(+), 28 deletions(-) Index: linux-2.6/drivers/usb/host/xhci.c =================================================================== --- linux-2.6.orig/drivers/usb/host/xhci.c +++ linux-2.6/drivers/usb/host/xhci.c @@ -646,7 +646,9 @@ int xhci_suspend(struct xhci_hcd *xhci) { int rc = 0; struct usb_hcd *hcd = xhci_to_hcd(xhci); + struct pci_dev *pdev = to_pci_dev(hcd->self.controller); u32 command; + int i; spin_lock_irq(&xhci->lock); clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); @@ -678,9 +680,14 @@ int xhci_suspend(struct xhci_hcd *xhci) return -ETIMEDOUT; } /* step 5: remove core well power */ - xhci_cleanup_msix(xhci); spin_unlock_irq(&xhci->lock); + if (xhci->msix_entries) { + for (i = 0; i < xhci->msix_count; i++) + synchronize_irq(xhci->msix_entries[i].vector); + } else if (pdev->irq >= 0) + synchronize_irq(pdev->irq); + return rc; } @@ -694,7 +701,6 @@ int xhci_resume(struct xhci_hcd *xhci, b { u32 command, temp = 0; struct usb_hcd *hcd = xhci_to_hcd(xhci); - struct pci_dev *pdev = to_pci_dev(hcd->self.controller); int old_state, retval; old_state = hcd->state; @@ -729,8 +735,7 @@ int xhci_resume(struct xhci_hcd *xhci, b xhci_dbg(xhci, "Stop HCD\n"); xhci_halt(xhci); xhci_reset(xhci); - if (hibernated) - xhci_cleanup_msix(xhci); + xhci_cleanup_msix(xhci); spin_unlock_irq(&xhci->lock); #ifdef CONFIG_USB_XHCI_HCD_DEBUGGING @@ -765,30 +770,6 @@ int xhci_resume(struct xhci_hcd *xhci, b return retval; } - spin_unlock_irq(&xhci->lock); - /* Re-setup MSI-X */ - if (hcd->irq) - free_irq(hcd->irq, hcd); - hcd->irq = -1; - - retval = xhci_setup_msix(xhci); - if (retval) - /* fall back to msi*/ - retval = xhci_setup_msi(xhci); - - if (retval) { - /* fall back to legacy interrupt*/ - retval = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, - hcd->irq_descr, hcd); - if (retval) { - xhci_err(xhci, "request interrupt %d failed\n", - pdev->irq); - return retval; - } - hcd->irq = pdev->irq; - } - - spin_lock_irq(&xhci->lock); /* step 4: set Run/Stop bit */ command = xhci_readl(xhci, &xhci->op_regs->command); command |= CMD_RUN;
_______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm