On Thu, Jul 19, 2012 at 12:20:11AM +0200, Michael Grzeschik wrote:
> 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]>
> ---
> drivers/usb/gadget/composite.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
> index 3f72110..2cb1030 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;
> }
>
> --
> 1.7.10.4
ping?
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
--
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