Scary warnings from xhci_hcd on rmmod and during shutdown/suspend/resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux ACPI]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [CPU Freq]     [Kernel Newbies]     [Fedora Kernel]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux