projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
11c37c8
)
usb composite: fix locking in usb_function_activate
author
Michael Grzeschik
<
[email protected]
>
Wed, 18 Jul 2012 22:20:11 +0000
(
00:20
+0200)
committer
Felipe Balbi
<
[email protected]
>
Thu, 23 Aug 2012 08:04:17 +0000
(11:04 +0300)
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 <
[email protected]
>
Signed-off-by: Felipe Balbi <
[email protected]
>
drivers/usb/gadget/composite.c
patch
|
blob
|
history
diff --git
a/drivers/usb/gadget/composite.c
b/drivers/usb/gadget/composite.c
index 3f72110da1b0113fd4f1f28243c6315609638010..2cb1030203b5e5739a92b6095c57c11cc925473b 100644
(file)
--- 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;
}