usb composite: fix locking in usb_function_activate
The lockdep hunter mentions a non consistent usage of spin_lock and
spin_lock_irqsafe in the composite_disconnect and usb_function_activate
function:
[ 15.700897] =================================
[ 15.705255] [ INFO: inconsistent lock state ]
[ 15.709617] 3.5.0-rc5+ #413 Not tainted
[ 15.713453] ---------------------------------
[ 15.717812] inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage.
[ 15.723822] uvc-gadget/116 [HC1[1]:SC0[0]:HE0:SE1] takes:
[ 15.729222] (&(&cdev->lock)->rlock){?.+...}, at: [<
7f0049e8>] composite_disconnect+0x2c/0x74 [g_webcam]
[ 15.738797] {HARDIRQ-ON-W} state was registered at:
[ 15.743677] [<
8006de3c>] mark_lock+0x148/0x688
[ 15.748325] [<
8006ecb0>] __lock_acquire+0x934/0x1b74
[ 15.753481] [<
8007047c>] lock_acquire+0x98/0x138
[ 15.758288] [<
804c776c>] _raw_spin_lock+0x4c/0x84
[ 15.763188] [<
7f006ae4>] usb_function_activate+0x28/0x94 [g_webcam]
[ 15.769652] [<
7f00820c>] usb_ep_autoconfig_reset+0x78/0x98 [g_webcam]
[ 15.776287] [<
7f0082a4>] uvc_v4l2_open+0x78/0x94 [g_webcam]
[ 15.782054] [<
80366a38>] v4l2_open+0x104/0x130
[ 15.786697] [<
800efd30>] chrdev_open+0xa0/0x170
[ 15.791423] [<
800e9718>] do_dentry_open.isra.13+0x1e8/0x264
[ 15.797186] [<
800ea5d4>] nameidata_to_filp+0x58/0x94
[ 15.802340] [<
800fa29c>] do_last.isra.31+0x2a0/0x808
[ 15.807497] [<
800faa40>] path_openat+0xc8/0x3e8
[ 15.812216] [<
800fae90>] do_filp_open+0x3c/0x90
[ 15.816936] [<
800ea6fc>] do_sys_open+0xec/0x184
[ 15.821655] [<
800ea7c4>] sys_open+0x30/0x34
[ 15.826027] [<
8000e5c0>] ret_fast_syscall+0x0/0x48
[ 15.831015] irq event stamp: 6048
[ 15.834330] hardirqs last enabled at (6047): [<
804c81b8>] _raw_spin_unlock_irqrestore+0x40/0x54
[ 15.843132] hardirqs last disabled at (6048): [<
8000e174>] __irq_svc+0x34/0x60
[ 15.850370] softirqs last enabled at (5940): [<
80028380>] __do_softirq+0x188/0x270
[ 15.858043] softirqs last disabled at (5935): [<
80028944>] irq_exit+0xa0/0xa8
[ 15.865195]
[ 15.865195] other info that might help us debug this:
[ 15.871724] Possible unsafe locking scenario:
[ 15.871724]
[ 15.877645] CPU0
[ 15.880091] ----
[ 15.882537] lock(&(&cdev->lock)->rlock);
[ 15.886659] <Interrupt>
[ 15.889278] lock(&(&cdev->lock)->rlock);
[ 15.893573]
[ 15.893573] *** DEADLOCK ***
[ 15.893573]
[ 15.899496] no locks held by uvc-gadget/116.
[ 15.903765]
[ 15.903765] stack backtrace:
[ 15.908125] Backtrace:
[ 15.910604] [<
80012038>] (dump_backtrace+0x0/0x114) from [<
804bf8a4>] (dump_stack+0x20/0x24)
[ 15.919043] r6:
dfb8e6f0 r5:
dfb8e400 r4:
809717ec r3:
60000193
[ 15.924766] [<
804bf884>] (dump_stack+0x0/0x24) from [<
804c0c0c>] (print_usage_bug+0x258/0x2c0)
[ 15.933388] [<
804c09b4>] (print_usage_bug+0x0/0x2c0) from [<
8006e240>] (mark_lock+0x54c/0x688)
[ 15.942006] [<
8006dcf4>] (mark_lock+0x0/0x688) from [<
8006edb8>] (__lock_acquire+0xa3c/0x1b74)
[ 15.950625] [<
8006e37c>] (__lock_acquire+0x0/0x1b74) from [<
8007047c>] (lock_acquire+0x98/0x138)
[ 15.959418] [<
800703e4>] (lock_acquire+0x0/0x138) from [<
804c78fc>] (_raw_spin_lock_irqsave+0x58/0x94)
[ 15.968736] [<
804c78a4>] (_raw_spin_lock_irqsave+0x0/0x94) from [<
7f0049e8>] (composite_disconnect+0x2c/0x74 [g_webcam])
[ 15.979605] r7:
00000012 r6:
df82b0c4 r5:
ded755bc r4:
ded75580
[ 15.985331] [<
7f0049bc>] (composite_disconnect+0x0/0x74 [g_webcam]) from [<
8033c170>] (_gadget_stop_activity+0xc4/0x120)
[ 15.996200] r6:
df82b0c4 r5:
df82b0c8 r4:
df82b0d0 r3:
7f0049bc
[ 16.001919] [<
8033c0ac>] (_gadget_stop_activity+0x0/0x120) from [<
8033e390>] (udc_irq+0x724/0xcb8)
[ 16.010877] r6:
df82b010 r5:
00000000 r4:
df82b010 r3:
00000000
[ 16.016595] [<
8033dc6c>] (udc_irq+0x0/0xcb8) from [<
8033baec>] (ci_irq+0x64/0xdc)
[ 16.024086] [<
8033ba88>] (ci_irq+0x0/0xdc) from [<
80086538>] (handle_irq_event_percpu+0x74/0x298)
[ 16.032958] r5:
807fd414 r4:
df38fdc0
[ 16.036566] [<
800864c4>] (handle_irq_event_percpu+0x0/0x298) from [<
800867a8>] (handle_irq_event+0x4c/0x6c)
[ 16.046315] [<
8008675c>] (handle_irq_event+0x0/0x6c) from [<
80089318>] (handle_level_irq+0xbc/0x11c)
[ 16.055447] r6:
def04000 r5:
807fd414 r4:
807fd3c0 r3:
00020000
[ 16.061166] [<
8008925c>] (handle_level_irq+0x0/0x11c) from [<
80085cc8>] (generic_handle_irq+0x38/0x4c)
[ 16.070472] r5:
807f7f64 r4:
8081e9f8
[ 16.074082] [<
80085c90>] (generic_handle_irq+0x0/0x4c) from [<
8000ef98>] (handle_IRQ+0x5c/0xbc)
[ 16.082788] [<
8000ef3c>] (handle_IRQ+0x0/0xbc) from [<
800085cc>] (tzic_handle_irq+0x6c/0x9c)
[ 16.091225] r8:
00000000 r7:
def059b0 r6:
00000001 r5:
00000000 r4:
00000000
r3:
00000012
[ 16.099141] [<
80008560>] (tzic_handle_irq+0x0/0x9c) from [<
8000e184>] (__irq_svc+0x44/0x60)
[ 16.107494] Exception stack(0xdef059b0 to 0xdef059f8)
[ 16.112550] 59a0:
00000001 00000001 00000000 dfb8e400
[ 16.120732] 59c0:
40000013 81a2e500 00000000 81a2e500 00000000 00000000 80862418 def05a0c
[ 16.128912] 59e0:
def059c8 def059f8 80070e24 804c81bc 20000013 ffffffff
[ 16.135542] [<
804c8178>] (_raw_spin_unlock_irqrestore+0x0/0x54) from [<
8003d0ec>] (__queue_work+0x108/0x470)
[ 16.145369] r5:
dfb1a30c r4:
81b93c00
[ 16.148978] [<
8003cfe4>] (__queue_work+0x0/0x470) from [<
8003d4e0>] (queue_work_on+0x4c/0x54)
[ 16.157511] [<
8003d494>] (queue_work_on+0x0/0x54) from [<
8003d544>] (queue_work+0x30/0x34)
[ 16.165774] r6:
df2e6900 r5:
80e0c2f8 r4:
dfb1a2c8 r3:
def04000
[ 16.171495] [<
8003d514>] (queue_work+0x0/0x34) from [<
80493284>] (rpc_make_runnable+0x9c/0xac)
[ 16.180113] [<
804931e8>] (rpc_make_runnable+0x0/0xac) from [<
80493c88>] (rpc_execute+0x40/0xa8)
[ 16.188811] r5:
def05ad4 r4:
dfb1a2c8
[ 16.192426] [<
80493c48>] (rpc_execute+0x0/0xa8) from [<
8048c734>] (rpc_run_task+0xa8/0xb4)
[ 16.200690] r8:
00000001 r7:
df74f520 r6:
ded75700 r5:
def05ad4 r4:
dfb1a2c8
r3:
00000002
[ 16.208618] [<
8048c68c>] (rpc_run_task+0x0/0xb4) from [<
801f1608>] (nfs_initiate_read+0xb4/0xd4)
[ 16.217403] r5:
df3e86c0 r4:
00000000
[ 16.221015] [<
801f1554>] (nfs_initiate_read+0x0/0xd4) from [<
801f1c64>] (nfs_generic_pg_readpages+0x9c/0x114)
[ 16.230937] [<
801f1bc8>] (nfs_generic_pg_readpages+0x0/0x114) from [<
801f0744>] (__nfs_pageio_add_request+0xe8/0x214)
[ 16.241545] r8:
000bf000 r7:
00000000 r6:
00000000 r5:
deef4640 r4:
def05c1c
r3:
801f1bc8
[ 16.249463] [<
801f065c>] (__nfs_pageio_add_request+0x0/0x214) from [<
801f0e3c>] (nfs_pageio_add_request+0x28/0x54)
[ 16.259818] [<
801f0e14>] (nfs_pageio_add_request+0x0/0x54) from [<
801f1394>] (readpage_async_filler+0x114/0x170)
[ 16.269992] r5:
def05c58 r4:
80fd7300
[ 16.273607] [<
801f1280>] (readpage_async_filler+0x0/0x170) from [<
800bb418>] (read_cache_pages+0xa0/0x108)
[ 16.283259] r8:
00200200 r7:
00100100 r6:
df74f654 r5:
def05cd0 r4:
80fd7300
[ 16.290034] [<
800bb378>] (read_cache_pages+0x0/0x108) from [<
801f218c>] (nfs_readpages+0xc4/0x168)
[ 16.298999] [<
801f20c8>] (nfs_readpages+0x0/0x168) from [<
800bb1d0>] (__do_page_cache_readahead+0x254/0x354)
[ 16.308833] [<
800baf7c>] (__do_page_cache_readahead+0x0/0x354) from [<
800bb5d0>] (ra_submit+0x38/0x40)
[ 16.318145] [<
800bb598>] (ra_submit+0x0/0x40) from [<
800bb6b0>] (ondemand_readahead+0xd8/0x3b0)
[ 16.326851] [<
800bb5d8>] (ondemand_readahead+0x0/0x3b0) from [<
800bba20>] (page_cache_async_readahead+0x98/0xa8)
[ 16.337043] [<
800bb988>] (page_cache_async_readahead+0x0/0xa8) from [<
800b2118>] (generic_file_aio_read+0x5b4/0x7c4)
[ 16.347565] r6:
00000000 r5:
df74f654 r4:
80fd70a0
[ 16.352231] [<
800b1b64>] (generic_file_aio_read+0x0/0x7c4) from [<
801e82c0>] (nfs_file_read+0x7c/0xcc)
[ 16.361544] [<
801e8244>] (nfs_file_read+0x0/0xcc) from [<
800eab80>] (do_sync_read+0xb4/0xf4)
[ 16.369981] r9:
00000000 r8:
def05f70 r7:
00000000 r6:
00000000 r5:
dec34900
r4:
fffffdee
[ 16.377896] [<
800eaacc>] (do_sync_read+0x0/0xf4) from [<
800eb548>] (vfs_read+0xb4/0x144)
[ 16.385987] r8:
00000000 r7:
def05f70 r6:
76a95008 r5:
003e3dd6 r4:
dec34900
[ 16.392761] [<
800eb494>] (vfs_read+0x0/0x144) from [<
800eb624>] (sys_read+0x4c/0x78)
[ 16.400504] r8:
00000000 r7:
00000003 r6:
003e3dd6 r5:
76a95008 r4:
dec34900
[ 16.407279] [<
800eb5d8>] (sys_read+0x0/0x78) from [<
8000e5c0>] (ret_fast_syscall+0x0/0x48)
[ 16.415543] r9:
def04000 r8:
8000e864 r6:
000086b4 r5:
00000000 r4:
00000000
[ 20.872729] gadget: high-speed config #1: Video
[ 20.877368] gadget: uvc_function_set_alt(0, 0)
[ 20.881908] gadget: uvc_function_set_alt(1, 0)
[ 20.891464] gadget: uvc_function_set_alt(1, 0)
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>