diff options
author | Tomas Melin <tomas.melin@iki.fi> | 2014-09-30 10:32:08 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-10-30 16:57:43 -0200 |
commit | 37fa8716e2d4c4155205aa4a904835de09edbb88 (patch) | |
tree | bb1283d67250aca733e3e06ed4264554999d8d82 | |
parent | 2279948735609d0d17d7384e776b674619f792ef (diff) |
[media] rc-main: fix lockdep splash for rc-main
lockdep reports a potential circular dependecy deadlock when registering input device.
Unlock mutex rc_dev->lock prior to calling ir_raw_event_register to avoid the circular
dependency since that function also calls input_register_device and rc_open.
======================================================
[ INFO: possible circular locking dependency detected ]
3.17.0-rc7+ #24 Not tainted
-------------------------------------------------------
modprobe/647 is trying to acquire lock:
(input_mutex){+.+.+.}, at: [<ffffffff812ed81c>] input_register_device+0x2ba/0x381
but task is already holding lock:
(ir_raw_handler_lock){+.+.+.}, at: [<ffffffff813186ed>] ir_raw_event_register+0x102/0x190
which lock already depends on the new lock.
[cut text]
other info that might help us debug this:
Chain exists of:
input_mutex --> &dev->lock --> ir_raw_handler_lock
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(ir_raw_handler_lock);
lock(&dev->lock);
lock(ir_raw_handler_lock);
lock(input_mutex);
*** DEADLOCK ***
4 locks held by modprobe/647:
#0: (&dev->mutex){......}, at: [<ffffffff812d19f3>] device_lock+0xf/0x11
#1: (&dev->mutex){......}, at: [<ffffffff812d19f3>] device_lock+0xf/0x11
#2: (&dev->lock){+.+.+.}, at: [<ffffffff81317fff>] rc_register_device+0x55d/0x58a
#3: (ir_raw_handler_lock){+.+.+.}, at: [<ffffffff813186ed>] ir_raw_event_register+0x102/0x190
stack backtrace:
CPU: 0 PID: 647 Comm: modprobe Not tainted 3.17.0-rc7+ #24
Call Trace:
[<ffffffff81489d6a>] dump_stack+0x46/0x58
[<ffffffff81487699>] print_circular_bug+0x1f8/0x209
[<ffffffff81074353>] __lock_acquire+0xb54/0xeda
[<ffffffff81080f17>] ? console_unlock+0x34d/0x399
[<ffffffff81074c01>] lock_acquire+0xd9/0x111
[<ffffffff812ed81c>] ? input_register_device+0x2ba/0x381
[<ffffffff8148e650>] mutex_lock_interruptible_nested+0x57/0x381
[<ffffffff812ed81c>] ? input_register_device+0x2ba/0x381
[<ffffffff81124e03>] ? kfree+0x7c/0x96
[<ffffffff812ed81c>] ? input_register_device+0x2ba/0x381
[<ffffffff81072531>] ? trace_hardirqs_on+0xd/0xf
[<ffffffff812ed81c>] input_register_device+0x2ba/0x381
[<ffffffff8131a537>] ir_mce_kbd_register+0x109/0x139
[<ffffffff81318728>] ir_raw_event_register+0x13d/0x190
[<ffffffff81317e40>] rc_register_device+0x39e/0x58a
[<ffffffff81072531>] ? trace_hardirqs_on+0xd/0xf
[<ffffffffa00cf2e3>] nvt_probe+0x5ad/0xd52 [nuvoton_cir]
[<ffffffffa00ced36>] ? nvt_resume+0x80/0x80 [nuvoton_cir]
[<ffffffff81296003>] pnp_device_probe+0x8c/0xa9
[<ffffffff812d1b94>] ? driver_sysfs_add+0x6e/0x93
[<ffffffff812d203a>] driver_probe_device+0xa1/0x1e3
[<ffffffff812d217c>] ? driver_probe_device+0x1e3/0x1e3
[<ffffffff812d21ca>] __driver_attach+0x4e/0x6f
[<ffffffff812d075b>] bus_for_each_dev+0x5a/0x8c
[<ffffffff812d1b24>] driver_attach+0x19/0x1b
[<ffffffff812d1879>] bus_add_driver+0xf1/0x1d6
[<ffffffff812d2817>] driver_register+0x87/0xbe
[<ffffffffa0120000>] ? 0xffffffffa0120000
[<ffffffff81295da4>] pnp_register_driver+0x1c/0x1e
[<ffffffffa0120010>] nvt_init+0x10/0x1000 [nuvoton_cir]
[<ffffffff8100030e>] do_one_initcall+0xea/0x18c
[<ffffffff8111497f>] ? __vunmap+0x9d/0xc7
[<ffffffff810a3ca1>] load_module+0x1c21/0x1f2c
[<ffffffff810a0bce>] ? show_initstate+0x44/0x44
[<ffffffff810a404e>] SyS_init_module+0xa2/0xb1
[<ffffffff81490ed2>] system_call_fastpath+0x16/0x1b
Signed-off-by: Tomas Melin <tomas.melin@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/rc/rc-main.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c index a7991c7d010a..296de853a25d 100644 --- a/drivers/media/rc/rc-main.c +++ b/drivers/media/rc/rc-main.c @@ -1414,7 +1414,10 @@ int rc_register_device(struct rc_dev *dev) ir_raw_init(); raw_init = true; } + /* calls ir_register_device so unlock mutex here*/ + mutex_unlock(&dev->lock); rc = ir_raw_event_register(dev); + mutex_lock(&dev->lock); if (rc < 0) goto out_input; } |