Commit 8442c87d authored by Arjan van de Ven's avatar Arjan van de Ven Committed by Dmitry Torokhov

Input: replace spin_lock_bh with spin_lock_irqsave in ml_ff_playback

ml_ff_playback() uses spin_(un)lock_bh. However this function is
called with interrupts disabled from erase_effect() in
drivers/input/ff-core.c:196.

This is not permitted, and will result in a WARN_ON in the bottom
half handling code. This patch changes this function to just use
spin_lock_irqsave() instead, solving the problem and simplifying
the locking logic.

This was reported as entry #106559 in kerneloops.org

Reported-by: kerneloops.org
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent 5f4ba04f
...@@ -397,8 +397,9 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) ...@@ -397,8 +397,9 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
{ {
struct ml_device *ml = dev->ff->private; struct ml_device *ml = dev->ff->private;
struct ml_effect_state *state = &ml->states[effect_id]; struct ml_effect_state *state = &ml->states[effect_id];
unsigned long flags;
spin_lock_bh(&ml->timer_lock); spin_lock_irqsave(&ml->timer_lock, flags);
if (value > 0) { if (value > 0) {
debug("initiated play"); debug("initiated play");
...@@ -424,7 +425,7 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) ...@@ -424,7 +425,7 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
ml_play_effects(ml); ml_play_effects(ml);
} }
spin_unlock_bh(&ml->timer_lock); spin_unlock_irqrestore(&ml->timer_lock, flags);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment