diff options
author | Michael Grzeschik <m.grzeschik@pengutronix.de> | 2012-07-19 00:20:11 +0200 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2012-08-23 11:04:17 +0300 |
commit | 4fefe9f6de3d6e0b5e58b17cbab9c47c74f88cb6 (patch) | |
tree | 7afe9d0212268702fffea8a7a56bd6528353cf1e | |
parent | 11c37c8b64b9d9d4ab19d387e6028eee3ec188d3 (diff) | |
download | linux-3.10-4fefe9f6de3d6e0b5e58b17cbab9c47c74f88cb6.tar.gz linux-3.10-4fefe9f6de3d6e0b5e58b17cbab9c47c74f88cb6.tar.bz2 linux-3.10-4fefe9f6de3d6e0b5e58b17cbab9c47c74f88cb6.zip |
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>
-rw-r--r-- | drivers/usb/gadget/composite.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 3f72110da1b..2cb1030203b 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -300,9 +300,10 @@ int usb_function_deactivate(struct usb_function *function) int usb_function_activate(struct usb_function *function) { struct usb_composite_dev *cdev = function->config->cdev; + unsigned long flags; int status = 0; - spin_lock(&cdev->lock); + spin_lock_irqsave(&cdev->lock, flags); if (WARN_ON(cdev->deactivations == 0)) status = -EINVAL; @@ -312,7 +313,7 @@ int usb_function_activate(struct usb_function *function) status = usb_gadget_connect(cdev->gadget); } - spin_unlock(&cdev->lock); + spin_unlock_irqrestore(&cdev->lock, flags); return status; } |