[media] lirc: fix dead lock between open and wakeup_filter
The locking in lirc needs improvement, but for now just fix this potential
deadlock.
======================================================
[ INFO: possible circular locking dependency detected ]
4.10.0-rc1+ #1 Not tainted
-------------------------------------------------------
bash/2502 is trying to acquire lock:
(ir_raw_handler_lock){+.+.+.}, at: [<
ffffffffc06f6a5e>] ir_raw_encode_scancode+0x3e/0xb0 [rc_core]
but task is already holding lock:
(&dev->lock){+.+.+.}, at: [<
ffffffffc06f511f>] store_filter+0x9f/0x240 [rc_core]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&dev->lock){+.+.+.}:
[<
ffffffffa110adad>] lock_acquire+0xfd/0x200
[<
ffffffffa1921327>] mutex_lock_nested+0x77/0x6d0
[<
ffffffffc06f436a>] rc_open+0x2a/0x80 [rc_core]
[<
ffffffffc07114ca>] lirc_dev_fop_open+0xda/0x1e0 [lirc_dev]
[<
ffffffffa12975e0>] chrdev_open+0xb0/0x210
[<
ffffffffa128eb5a>] do_dentry_open+0x20a/0x2f0
[<
ffffffffa128ffcc>] vfs_open+0x4c/0x80
[<
ffffffffa12a35ec>] path_openat+0x5bc/0xc00
[<
ffffffffa12a5271>] do_filp_open+0x91/0x100
[<
ffffffffa12903f0>] do_sys_open+0x130/0x220
[<
ffffffffa12904fe>] SyS_open+0x1e/0x20
[<
ffffffffa19278c1>] entry_SYSCALL_64_fastpath+0x1f/0xc2
-> #1 (lirc_dev_lock){+.+.+.}:
[<
ffffffffa110adad>] lock_acquire+0xfd/0x200
[<
ffffffffa1921327>] mutex_lock_nested+0x77/0x6d0
[<
ffffffffc0711f47>] lirc_register_driver+0x67/0x59b [lirc_dev]
[<
ffffffffc06db7f4>] ir_lirc_register+0x1f4/0x260 [ir_lirc_codec]
[<
ffffffffc06f6cac>] ir_raw_handler_register+0x7c/0xb0 [rc_core]
[<
ffffffffc0398010>] 0xffffffffc0398010
[<
ffffffffa1002192>] do_one_initcall+0x52/0x1b0
[<
ffffffffa11ef5c8>] do_init_module+0x5f/0x1fa
[<
ffffffffa11566b5>] load_module+0x2675/0x2b00
[<
ffffffffa1156dcf>] SYSC_finit_module+0xdf/0x110
[<
ffffffffa1156e1e>] SyS_finit_module+0xe/0x10
[<
ffffffffa1003f5c>] do_syscall_64+0x6c/0x1f0
[<
ffffffffa1927989>] return_from_SYSCALL_64+0x0/0x7a
-> #0 (ir_raw_handler_lock){+.+.+.}:
[<
ffffffffa110a7b7>] __lock_acquire+0x10f7/0x1290
[<
ffffffffa110adad>] lock_acquire+0xfd/0x200
[<
ffffffffa1921327>] mutex_lock_nested+0x77/0x6d0
[<
ffffffffc06f6a5e>] ir_raw_encode_scancode+0x3e/0xb0 [rc_core]
[<
ffffffffc0b0f492>] loop_set_wakeup_filter+0x62/0xbd [rc_loopback]
[<
ffffffffc06f522a>] store_filter+0x1aa/0x240 [rc_core]
[<
ffffffffa15e46f8>] dev_attr_store+0x18/0x30
[<
ffffffffa13318e5>] sysfs_kf_write+0x45/0x60
[<
ffffffffa1330b55>] kernfs_fop_write+0x155/0x1e0
[<
ffffffffa1290797>] __vfs_write+0x37/0x160
[<
ffffffffa12921f8>] vfs_write+0xc8/0x1e0
[<
ffffffffa12936e8>] SyS_write+0x58/0xc0
[<
ffffffffa19278c1>] entry_SYSCALL_64_fastpath+0x1f/0xc2
other info that might help us debug this:
Chain exists of:
ir_raw_handler_lock --> lirc_dev_lock --> &dev->lock
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&dev->lock);
lock(lirc_dev_lock);
lock(&dev->lock);
lock(ir_raw_handler_lock);
*** DEADLOCK ***
4 locks held by bash/2502:
#0: (sb_writers#4){.+.+.+}, at: [<
ffffffffa12922c5>] vfs_write+0x195/0x1e0
#1: (&of->mutex){+.+.+.}, at: [<
ffffffffa1330b1f>] kernfs_fop_write+0x11f/0x1e0
#2: (s_active#215){.+.+.+}, at: [<
ffffffffa1330b28>] kernfs_fop_write+0x128/0x1e0
#3: (&dev->lock){+.+.+.}, at: [<
ffffffffc06f511f>] store_filter+0x9f/0x240 [rc_core]
stack backtrace:
CPU: 3 PID: 2502 Comm: bash Not tainted 4.10.0-rc1+ #1
Hardware name: /DG45ID, BIOS IDG4510H.86A.0135.2011.0225.1100 02/25/2011
Call Trace:
dump_stack+0x86/0xc3
print_circular_bug+0x1be/0x210
__lock_acquire+0x10f7/0x1290
lock_acquire+0xfd/0x200
? ir_raw_encode_scancode+0x3e/0xb0 [rc_core]
? ir_raw_encode_scancode+0x3e/0xb0 [rc_core]
mutex_lock_nested+0x77/0x6d0
? ir_raw_encode_scancode+0x3e/0xb0 [rc_core]
? loop_set_wakeup_filter+0x44/0xbd [rc_loopback]
ir_raw_encode_scancode+0x3e/0xb0 [rc_core]
loop_set_wakeup_filter+0x62/0xbd [rc_loopback]
? loop_set_tx_duty_cycle+0x70/0x70 [rc_loopback]
store_filter+0x1aa/0x240 [rc_core]
dev_attr_store+0x18/0x30
sysfs_kf_write+0x45/0x60
kernfs_fop_write+0x155/0x1e0
__vfs_write+0x37/0x160
? rcu_read_lock_sched_held+0x4a/0x80
? rcu_sync_lockdep_assert+0x2f/0x60
? __sb_start_write+0x10c/0x220
? vfs_write+0x195/0x1e0
? security_file_permission+0x3b/0xc0
vfs_write+0xc8/0x1e0
SyS_write+0x58/0xc0
entry_SYSCALL_64_fastpath+0x1f/0xc2
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>