linux/drivers/leds/trigger
Baolin Wang 3a40cfe8ba leds: trigger: Fix sleeping function called from invalid context
We will meet below issue due to mutex_lock() is called in interrupt context.
The mutex lock is used to protect the pattern trigger data, but before changing
new pattern trigger data (pattern values or repeat value) by users, we always
cancel the timer firstly to clear previous patterns' performance. That means
there is no race in pattern_trig_timer_function(), so we can drop the mutex
lock in pattern_trig_timer_function() to avoid this issue.

Moreover we can move the timer cancelling into mutex protection, since there
is no deadlock risk if we remove the mutex lock in pattern_trig_timer_function().

BUG: sleeping function called from invalid context at kernel/locking/mutex.c:254
in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper/1
CPU: 1 PID: 0 Comm: swapper/1 Not tainted
4.20.0-rc1-koelsch-00841-ga338c8181013c1a9 #171
Hardware name: Generic R-Car Gen2 (Flattened Device Tree)
[<c020f19c>] (unwind_backtrace) from [<c020aecc>] (show_stack+0x10/0x14)
[<c020aecc>] (show_stack) from [<c07affb8>] (dump_stack+0x7c/0x9c)
[<c07affb8>] (dump_stack) from [<c02417d4>] (___might_sleep+0xf4/0x158)
[<c02417d4>] (___might_sleep) from [<c07c92c4>] (mutex_lock+0x18/0x60)
[<c07c92c4>] (mutex_lock) from [<c067b28c>] (pattern_trig_timer_function+0x1c/0x11c)
[<c067b28c>] (pattern_trig_timer_function) from [<c027f6fc>] (call_timer_fn+0x1c/0x90)
[<c027f6fc>] (call_timer_fn) from [<c027f944>] (expire_timers+0x94/0xa4)
[<c027f944>] (expire_timers) from [<c027fc98>] (run_timer_softirq+0x108/0x15c)
[<c027fc98>] (run_timer_softirq) from [<c02021cc>] (__do_softirq+0x1d4/0x258)
[<c02021cc>] (__do_softirq) from [<c0224d24>] (irq_exit+0x64/0xc4)
[<c0224d24>] (irq_exit) from [<c0268dd0>] (__handle_domain_irq+0x80/0xb4)
[<c0268dd0>] (__handle_domain_irq) from [<c045e1b0>] (gic_handle_irq+0x58/0x90)
[<c045e1b0>] (gic_handle_irq) from [<c02019f8>] (__irq_svc+0x58/0x74)
Exception stack(0xeb483f60 to 0xeb483fa8)
3f60: 00000000 00000000 eb9afaa0 c0217e80 00000000 ffffe000 00000000 c0e06408
3f80: 00000002 c0e0647c c0c6a5f0 00000000 c0e04900 eb483fb0 c0207ea8 c0207e98
3fa0: 60020013 ffffffff
[<c02019f8>] (__irq_svc) from [<c0207e98>] (arch_cpu_idle+0x1c/0x38)
[<c0207e98>] (arch_cpu_idle) from [<c0247ca8>] (do_idle+0x138/0x268)
[<c0247ca8>] (do_idle) from [<c0248050>] (cpu_startup_entry+0x18/0x1c)
[<c0248050>] (cpu_startup_entry) from [<402022ec>] (0x402022ec)

Fixes: 5fd752b6b3 ("leds: core: Introduce LED pattern trigger")
Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
Reported-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
2018-11-07 21:43:25 +01:00
..
Kconfig leds: core: Introduce LED pattern trigger 2018-10-11 21:55:58 +02:00
Makefile leds: core: Introduce LED pattern trigger 2018-10-11 21:55:58 +02:00
ledtrig-activity.c leds: activity trigger: simplifications from core changes 2018-07-05 23:21:14 +02:00
ledtrig-backlight.c leds: backlight trigger: simplifications from core changes 2018-07-05 23:21:14 +02:00
ledtrig-camera.c leds: triggers: make the MODULE_LICENSE string match the actual license 2018-07-05 22:59:36 +02:00
ledtrig-cpu.c leds/trigger/cpu: Add LED trigger for all CPUs aggregated 2017-03-06 22:06:47 +01:00
ledtrig-default-on.c leds: default-on trigger: make use of module_led_trigger() 2018-07-05 23:21:14 +02:00
ledtrig-disk.c leds: Extends disk trigger for reads and writes 2018-03-11 20:01:55 +01:00
ledtrig-gpio.c leds: gpio trigger: simplifications from core changes 2018-07-05 23:21:15 +02:00
ledtrig-heartbeat.c leds: heartbeat trigger: simplifications from core changes 2018-07-05 23:21:13 +02:00
ledtrig-mtd.c leds: trigger: Introduce a MTD (NAND/NOR) trigger 2016-04-13 10:23:14 +02:00
ledtrig-netdev.c leds: netdev trigger: simplifications from core changes 2018-07-05 23:21:12 +02:00
ledtrig-oneshot.c leds: oneshot trigger: simplifications from core changes 2018-07-05 23:21:13 +02:00
ledtrig-panic.c leds: triggers: Allow to switch the trigger to "panic" on a kernel panic 2016-05-06 10:22:09 +02:00
ledtrig-pattern.c leds: trigger: Fix sleeping function called from invalid context 2018-11-07 21:43:25 +01:00
ledtrig-timer.c leds: timer trigger: simplifications from core changes 2018-07-05 23:21:12 +02:00
ledtrig-transient.c leds: transient trigger: simplifications from core changes 2018-07-05 23:21:12 +02:00