Commit a733ded5 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman

mei: fix deadlock on mei reset

This patch fixes 'mei: synchronize irq before initiating a reset'
The patch had introduced a deadlock between irq thread and mei_reset()
as they are both holding the same device lock.

---> device_lock:
	mei_reset()
                        <---- interrupt thread
	                        device_lock
---> synchornize_irq()
       wait on interrupt thread == (dead lock)

The fix is to call synchronize_irq
prior to call locked mei_reset function.

Cc: <stable@vger.kernel.org> #4.10+
Fixes: f302bb0de6ac (mei: synchronize irq before initiating a reset)
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 603980ce
...@@ -124,8 +124,6 @@ int mei_reset(struct mei_device *dev) ...@@ -124,8 +124,6 @@ int mei_reset(struct mei_device *dev)
mei_clear_interrupts(dev); mei_clear_interrupts(dev);
mei_synchronize_irq(dev);
/* we're already in reset, cancel the init timer /* we're already in reset, cancel the init timer
* if the reset was called due the hbm protocol error * if the reset was called due the hbm protocol error
* we need to call it before hw start * we need to call it before hw start
...@@ -304,6 +302,9 @@ static void mei_reset_work(struct work_struct *work) ...@@ -304,6 +302,9 @@ static void mei_reset_work(struct work_struct *work)
container_of(work, struct mei_device, reset_work); container_of(work, struct mei_device, reset_work);
int ret; int ret;
mei_clear_interrupts(dev);
mei_synchronize_irq(dev);
mutex_lock(&dev->device_lock); mutex_lock(&dev->device_lock);
ret = mei_reset(dev); ret = mei_reset(dev);
...@@ -328,6 +329,9 @@ void mei_stop(struct mei_device *dev) ...@@ -328,6 +329,9 @@ void mei_stop(struct mei_device *dev)
mei_cancel_work(dev); mei_cancel_work(dev);
mei_clear_interrupts(dev);
mei_synchronize_irq(dev);
mutex_lock(&dev->device_lock); mutex_lock(&dev->device_lock);
dev->dev_state = MEI_DEV_POWER_DOWN; dev->dev_state = MEI_DEV_POWER_DOWN;
......
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