mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
mei: nfc: fix deadlock on shutdown/suspend path
In function mei_nfc_host_exit mei_cl_remove_device cannot be called
under the device mutex as device removing flow invokes the device driver
remove handler that calls in turn to mei_cl_disable_device which
naturally acquires the device mutex.
Also remove mei_cl_bus_remove_devices which has the same issue, but is
never executed as currently the only device on the mei client bus is NFC
and a new device cannot be easily added till the bus revamp is
completed.
This fixes regression caused by commit be9b720a0c ("mei_phy: move all
nfc logic from mei driver to nfc")
Prior to this change the nfc driver remove handler called to no-op
disable function while actual nfc device was disabled directly from the
mei driver.
Reported-by: Linus Torvalds <[email protected]>
Acked-by: Greg Kroah-Hartman <[email protected]>
Cc: Samuel Ortiz <[email protected]>
Signed-off-by: Tomas Winkler <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
c7e9ad7da2
commit
4f273959b8
3 changed files with 2 additions and 19 deletions
|
|
@ -552,22 +552,6 @@ void mei_cl_bus_rx_event(struct mei_cl *cl)
|
|||
schedule_work(&device->event_work);
|
||||
}
|
||||
|
||||
void mei_cl_bus_remove_devices(struct mei_device *dev)
|
||||
{
|
||||
struct mei_cl *cl, *next;
|
||||
|
||||
mutex_lock(&dev->device_lock);
|
||||
list_for_each_entry_safe(cl, next, &dev->device_list, device_link) {
|
||||
if (cl->device)
|
||||
mei_cl_remove_device(cl->device);
|
||||
|
||||
list_del(&cl->device_link);
|
||||
mei_cl_unlink(cl);
|
||||
kfree(cl);
|
||||
}
|
||||
mutex_unlock(&dev->device_lock);
|
||||
}
|
||||
|
||||
int __init mei_cl_bus_init(void)
|
||||
{
|
||||
return bus_register(&mei_cl_bus_type);
|
||||
|
|
|
|||
|
|
@ -333,8 +333,6 @@ void mei_stop(struct mei_device *dev)
|
|||
|
||||
mei_nfc_host_exit(dev);
|
||||
|
||||
mei_cl_bus_remove_devices(dev);
|
||||
|
||||
mutex_lock(&dev->device_lock);
|
||||
|
||||
mei_wd_stop(dev);
|
||||
|
|
|
|||
|
|
@ -402,11 +402,12 @@ void mei_nfc_host_exit(struct mei_device *dev)
|
|||
|
||||
cldev->priv_data = NULL;
|
||||
|
||||
mutex_lock(&dev->device_lock);
|
||||
/* Need to remove the device here
|
||||
* since mei_nfc_free will unlink the clients
|
||||
*/
|
||||
mei_cl_remove_device(cldev);
|
||||
|
||||
mutex_lock(&dev->device_lock);
|
||||
mei_nfc_free(ndev);
|
||||
mutex_unlock(&dev->device_lock);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue