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: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
02d0e6753d
commit
211f05a034
|
@ -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_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) {
|
||||
debug("initiated play");
|
||||
|
@ -424,7 +425,7 @@ static int ml_ff_playback(struct input_dev *dev, int effect_id, int value)
|
|||
ml_play_effects(ml);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&ml->timer_lock);
|
||||
spin_unlock_irqrestore(&ml->timer_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue