exynos-linux-stable/drivers/media/rc
Sean Young f348a1030e lirc: fix dead lock between open and wakeup_filter
[ Upstream commit db5b15b74ed9a5c04bb808d18ffa2c773f5c18c0 ]

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>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2017-12-14 09:28:17 +01:00
..
img-ir [media] rc: split nec protocol into its three variants 2016-09-22 11:46:49 -03:00
keymaps [media] Convert Wideview WT220 DVB USB driver to rc-core 2016-07-09 12:10:33 -03:00
ati_remote.c [media] ati_remote: avoid fragile snprintf use 2016-05-07 10:27:16 -03:00
ene_ir.c [media] rc: make s_tx_carrier consistent 2016-07-15 11:54:23 -03:00
ene_ir.h [media] ene_ir: don't use pr_debug after all 2013-07-29 11:49:45 -03:00
fintek-cir.c [media] media/fintek: drop pci_ids dependency 2015-05-12 13:44:41 -03:00
fintek-cir.h [media] rc: Fir warnings on m68k arch 2013-11-08 09:45:37 -02:00
gpio-ir-recv.c [media] rc: gpio-ir-recv: add timeout on idle 2015-11-19 07:46:33 -02:00
igorplugusb.c [media] rc: split nec protocol into its three variants 2016-09-22 11:46:49 -03:00
iguanair.c [media] rc: make s_tx_carrier consistent 2016-07-15 11:54:23 -03:00
imon.c media: imon: Fix null-ptr-deref in imon_probe 2017-11-21 09:23:21 +01:00
ir-hix5hd2.c [media] ir-hix5hd2: drop the use of IRQF_NO_SUSPEND 2015-10-22 15:48:24 -02:00
ir-jvc-decoder.c [media] media: rc: move check whether a protocol is enabled to the core 2015-11-19 11:39:17 -02:00
ir-lirc-codec.c media: rc: check for integer overflow 2017-11-30 08:39:09 +00:00
ir-mce_kbd-decoder.c [media] media: rc: move check whether a protocol is enabled to the core 2015-11-19 11:39:17 -02:00
ir-nec-decoder.c [media] rc: split nec protocol into its three variants 2016-09-22 11:46:49 -03:00
ir-rc5-decoder.c [media] Fix RC5 decoding with Fintek CIR chipset 2016-07-09 11:47:28 -03:00
ir-rc6-decoder.c [media] rc: rc6 decoder should report protocol correctly 2016-09-22 11:42:29 -03:00
ir-rx51.c ir-rx51: use hrtimer instead of dmtimer 2016-06-29 21:54:35 -07:00
ir-sanyo-decoder.c [media] media: rc: move check whether a protocol is enabled to the core 2015-11-19 11:39:17 -02:00
ir-sharp-decoder.c [media] media: rc: move check whether a protocol is enabled to the core 2015-11-19 11:39:17 -02:00
ir-sony-decoder.c [media] media: rc: move check whether a protocol is enabled to the core 2015-11-19 11:39:17 -02:00
ir-xmp-decoder.c [media] media: rc: move check whether a protocol is enabled to the core 2015-11-19 11:39:17 -02:00
ite-cir.c ite-cir: initialize use_demodulator before using it 2017-01-26 08:24:45 +01:00
ite-cir.h
Kconfig ir-rx51: Fix build after multiarch changes broke it 2016-06-29 21:46:31 -07:00
lirc_dev.c lirc: fix dead lock between open and wakeup_filter 2017-12-14 09:28:17 +01:00
Makefile [media] media: rc: add driver for Amlogic Meson IR remote receiver 2014-11-26 13:29:01 -02:00
mceusb.c mceusb: fix NULL-deref at probe 2017-05-25 15:44:39 +02:00
meson-ir.c media: rc: meson-ir: Add support for newer versions of the IR decoder 2016-08-29 12:24:40 -07:00
nuvoton-cir.c [media] media: rc: nuvoton: simplify nvt_get_rx_ir_data a little 2016-09-22 11:37:28 -03:00
nuvoton-cir.h [media] media: rc: nuvoton: remove two unused elements in struct nvt_dev 2016-07-08 17:19:35 -03:00
rc-core-priv.h [media] media: rc: raw: improve FIFO handling 2016-01-25 12:38:09 -02:00
rc-ir-raw.c [media] media: rc: fix deadlock when module ir_lirc_codec is removed 2016-09-22 11:23:13 -03:00
rc-loopback.c Revert "[media] rc: rc-loopback: Add loopback of filter scancodes" 2015-08-19 07:02:53 -03:00
rc-main.c rc: raw decoder for keymap protocol is not loaded on register 2017-03-18 19:14:34 +08:00
redrat3.c [media] redrat3: hardware-specific parameters 2016-09-22 12:46:12 -03:00
st_rc.c [media] media: st-rc: remove misuse of IRQF_NO_SUSPEND flag 2015-11-19 06:46:05 -02:00
streamzap.c [media] rc/streamzap: fix spelling mistake "sumbiting" -> "submitting" 2016-09-19 16:27:23 -03:00
sunxi-cir.c [media] rc: sunxi-cir: support module autoloading 2016-03-03 12:42:34 -03:00
ttusbir.c [media] rc-core: remove protocol arrays 2014-07-25 19:10:43 -03:00
winbond-cir.c [media] rc: make s_tx_mask consistent 2016-07-15 11:46:55 -03:00