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>