Hi Alan,
It seems the non-atomic sleep at ehci_bus_suspend during the system
suspend process will cause kernel dump(see below), any suggestions?
Peter
root@freescale ~$ echo mem > /sys/power/state
PM: Syncing filesystems ... done.
Freezing user space processes ... (elapsed 0.001 seconds) done.
Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done.
ci_hdrc ci_hdrc.0: high speed connection
=================================
[ INFO: inconsistent lock state ]
3.13.0+ #78 Not tainted
---------------------------------
inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
kworker/u8:0/6 [HC0[0]:SC0[0]:HE1:SE1] takes:
(&(&ehci->lock)->rlock){?.-...}, at: [<80400104>] ehci_bus_suspend+0x4c/0x49c
{IN-HARDIRQ-W} state was registered at:
[<80061880>] mark_lock+0x15c/0x6dc
[<800628e0>] __lock_acquire+0xae0/0x1cd0
[<80063fe8>] lock_acquire+0x68/0x7c
[<805eab7c>] _raw_spin_lock+0x34/0x44
[<80400574>] ehci_irq+0x20/0x324
[<803e9c98>] usb_hcd_irq+0x2c/0x40
[<8040b608>] host_irq+0x1c/0x20
[<80408124>] ci_irq+0x90/0x160
[<8006d9f0>] handle_irq_event_percpu+0x54/0x1a4
[<8006db84>] handle_irq_event+0x44/0x64
[<80070ce4>] handle_fasteoi_irq+0xc4/0x15c
[<8006d354>] generic_handle_irq+0x28/0x38
[<8000f1c8>] handle_IRQ+0x54/0xb4
[<80008644>] gic_handle_irq+0x30/0x64
[<80012fa4>] __irq_svc+0x44/0x5c
[<8014360c>] kernfs_remove_by_name_ns+0x38/0x8c
[<80141520>] sysfs_unmerge_group+0x48/0x60
[<80332344>] rpm_sysfs_remove+0x18/0x20
[<803366b8>] pm_runtime_no_callbacks+0x44/0x48
[<8040c298>] ci_hdrc_imx_probe+0x2a8/0x38c
[<8032ee8c>] platform_drv_probe+0x20/0x50
[<8032d2b8>] driver_probe_device+0x118/0x22c
[<8032d468>] __driver_attach+0x9c/0xa0
[<8032b9bc>] bus_for_each_dev+0x5c/0x90
[<8032cd8c>] driver_attach+0x20/0x28
[<8032c98c>] bus_add_driver+0xe0/0x1d8
[<8032db20>] driver_register+0x80/0xfc
[<8032e7d8>] __platform_driver_register+0x50/0x64
[<808006a8>] ci_hdrc_imx_driver_init+0x18/0x20
[<800088b4>] do_one_initcall+0x3c/0x168
[<807d2c74>] kernel_init_freeable+0x104/0x1d4
[<805df9ac>] kernel_init+0x10/0x118
[<8000e948>] ret_from_fork+0x14/0x2c
irq event stamp: 4422
hardirqs last enabled at (4421): [<805eb2ac>] _raw_spin_unlock_irq+0x2c/0x34
hardirqs last disabled at (4422): [<805eac90>] _raw_spin_lock_irq+0x20/0x58
softirqs last enabled at (3960): [<8002afe8>] __do_softirq+0x1c4/0x280
softirqs last disabled at (3949): [<8002b3b4>] irq_exit+0xb0/0x114
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(&(&ehci->lock)->rlock);
<Interrupt>
lock(&(&ehci->lock)->rlock);
*** DEADLOCK ***
4 locks held by kworker/u8:0/6:
#0: (events_unbound){.+.+.+}, at: [<8003ccc0>] process_one_work+0x130/0x438
#1: ((&entry->work)){+.+.+.}, at: [<8003ccc0>] process_one_work+0x130/0x438
#2: (&__lockdep_no_validate__){......}, at: [<803340b8>]
__device_suspend+0xb8/0x220
#3: (&(&ehci->lock)->rlock){?.-...}, at: [<80400104>]
ehci_bus_suspend+0x4c/0x49c
stack backtrace:
CPU: 0 PID: 6 Comm: kworker/u8:0 Not tainted 3.13.0+ #78
Workqueue: events_unbound async_run_entry_fn
Backtrace:
[<80012220>] (dump_backtrace+0x0/0x10c) from [<800123c0>] (show_stack+0x18/0x1c)
r6:bf87b3f8 r5:bf87af80 r4:00000000 r3:bf87af80
[<800123a8>] (show_stack+0x0/0x1c) from [<805e4708>] (dump_stack+0x78/0x94)
[<805e4690>] (dump_stack+0x0/0x94) from [<805e2590>]
(print_usage_bug+0x268/0x2d8)
r4:80927080 r3:bf87af80
[<805e2328>] (print_usage_bug+0x0/0x2d8) from [<80061cd8>]
(mark_lock+0x5b4/0x6dc)
[<80061724>] (mark_lock+0x0/0x6dc) from [<800647e8>]
(mark_held_locks+0xa0/0x138)
[<80064748>] (mark_held_locks+0x0/0x138) from [<80064930>]
(trace_hardirqs_on_caller+0xb0/0x1cc)
[<80064880>] (trace_hardirqs_on_caller+0x0/0x1cc) from [<80064a60>]
(trace_hardirqs_on+0x14/0x18)
r7:80829db0 r6:815e4b40 r5:bee2ae00 r4:815e4b40
[<80064a4c>] (trace_hardirqs_on+0x0/0x18) from [<805eb2ac>]
(_raw_spin_unlock_irq+0x2c/0x34)
[<805eb280>] (_raw_spin_unlock_irq+0x0/0x34) from [<8004bd04>]
(finish_task_switch+0x8c/0x13c)
r4:00000000 r3:bf87af80
[<8004bc78>] (finish_task_switch+0x0/0x13c) from [<805e697c>]
(__schedule+0x210/0x5d0)
[<805e676c>] (__schedule+0x0/0x5d0) from [<805e6e38>] (schedule+0x38/0x88)
[<805e6e00>] (schedule+0x0/0x88) from [<805e61e4>]
(schedule_timeout+0x10c/0x18c)
[<805e60d8>] (schedule_timeout+0x0/0x18c) from [<805e628c>]
(schedule_timeout_uninterruptible+0x28/0x2c)
[<805e6264>] (schedule_timeout_uninterruptible+0x0/0x2c) from [<80031584>]
(msleep+0x1c/0x28)
[<80031568>] (msleep+0x0/0x28) from [<804001f8>] (ehci_bus_suspend+0x140/0x49c)
[<804000b8>] (ehci_bus_suspend+0x0/0x49c) from [<803ec52c>]
(hcd_bus_suspend+0x60/0x100)
[<803ec4cc>] (hcd_bus_suspend+0x0/0x100) from [<803f8794>]
(generic_suspend+0x38/0x3c)
r7:00000000 r6:00000001 r5:ffffffff r4:bf0d4c00
[<803f875c>] (generic_suspend+0x0/0x3c) from [<803f081c>]
(usb_suspend_both+0x10c/0x1a4)
[<803f0710>] (usb_suspend_both+0x0/0x1a4) from [<803f10c8>]
(usb_suspend+0xf4/0x118)
[<803f0fd4>] (usb_suspend+0x0/0x118) from [<803e2920>]
(usb_dev_suspend+0x14/0x18)
[<803e290c>] (usb_dev_suspend+0x0/0x18) from [<80333bac>]
(dpm_run_callback.isra.12+0x34/0x6c)
[<80333b78>] (dpm_run_callback.isra.12+0x0/0x6c) from [<8033410c>]
(__device_suspend+0x10c/0x220)
r9:00000002 r8:00000000 r6:00000002 r5:80dac34c r4:bf0d4c68
[<80334000>] (__device_suspend+0x0/0x220) from [<80334240>]
(async_suspend+0x20/0x94)
r7:bf82f400 r6:8086cb60 r5:bf0d4c68 r4:80dac34c
[<80334220>] (async_suspend+0x0/0x94) from [<80049e9c>]
(async_run_entry_fn+0x48/0x190)
r6:8086cb60 r5:beef9900 r4:beef9910 r3:00000000
[<80049e54>] (async_run_entry_fn+0x0/0x190) from [<8003cd34>]
(process_one_work+0x1a4/0x438)
r9:00000002 r8:00000000 r7:bf82f400 r6:bf80dc00 r5:beef9910
r4:bf82d980
[<8003cb90>] (process_one_work+0x0/0x438) from [<8003da5c>]
(worker_thread+0x120/0x3e4)
[<8003d93c>] (worker_thread+0x0/0x3e4) from [<80044070>] (kthread+0xcc/0xe8)
[<80043fa4>] (kthread+0x0/0xe8) from [<8000e948>] (ret_from_fork+0x14/0x2c)
r7:00000000 r6:00000000 r5:80043fa4 r4:bf840680
PM: suspend of devices complete after 530.175 msecs
PM: suspend devices took 0.540 seconds
PM: late suspend of devices complete after 1.038 msecs
PM: noirq suspend of devices complete after 1.087 msecs
Disabling non-boot CPUs ...
CPU1: shutdown
CPU2: shutdown
CPU3: shutdown
--
Best Regards,
Peter Chen
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html