Patch "mei: amthif: fix deadlock in initialization during a reset" has been added to the 4.7-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
mei: amthif: fix deadlock in initialization during a reset
to the 4.7-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mei-amthif-fix-deadlock-in-initialization-during-a-reset.patch
and it can be found in the queue-4.7 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
e728ae271f4cf71218ec06a6daf61b79466cb466Mon Sep 17 00:00:00 2001
From: Alexander Usyskin <[email protected]>
Date: Tue, 26 Jul 2016 01:06:09 +0300
Subject: mei: amthif: fix deadlock in initialization during a reset
From: Alexander Usyskin <[email protected]>
commit e728ae271f4cf71218ec06a6daf61b79466cb466 upstream.
The device lock was unnecessary obtained in bus rescan work before the amthif client search. That causes incorrect lock ordering and task hang:
...
[88004.613213] INFO: task kworker/1:14:21832 blocked for more than 120 seconds. ... [88004.645934] Workqueue: events mei_cl_bus_rescan_work
...
The correct lock order is
cl_bus_lock
device_lock
me_clients_rwsem
Move device_lock into amthif init function that called after me_clients_rwsem is released.
This fixes regression introduced by commit:
commit 025fb792bac3 ("mei: split amthif client init from end of clients enumeration")
--- drivers/misc/mei/amthif.c | 12 +++++++++--- drivers/misc/mei/bus.c | 2 -- 2 files changed, 9 insertions(+), 5 deletions(-)
drivers/misc/mei/amthif.c +9 -3
@@ -67,8 +67,12 @@ int mei_amthif_host_init(struct mei_devistruct mei_cl *cl = &dev->iamthif_cl;int ret; -if (mei_cl_is_connected (cl)) -return 0 ; +mutex_lock (&dev->device_lock); + +if (mei_cl_is_connected (cl)) { + ret =0 ; + goto out; + } dev->iamthif_state =MEI_IAMTHIF_IDLE ;
@@ -77,11 +81,13 @@ int mei_amthif_host_init(struct mei_devi ret =mei_cl_link (cl);if (ret <0 ) {dev_err (dev->dev,"amthif: failed cl_link %d\n" , ret); -return ret; + goto out; } ret =mei_cl_connect (cl, me_cl,NULL ); +out: +mutex_unlock (&dev->device_lock);return ret; }
drivers/misc/mei/bus.c +0 -2
@@ -983,12 +983,10 @@ void mei_cl_bus_rescan_work(struct work_ container_of(work, struct mei_device, bus_rescan_work);struct mei_me_client *me_cl; -mutex_lock (&bus->device_lock); me_cl =mei_me_cl_by_uuid (bus, &mei_amthif_guid);if (me_cl)mei_amthif_host_init (bus, me_cl);mei_me_cl_put (me_cl); -mutex_unlock (&bus->device_lock);mei_cl_bus_rescan (bus); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.7/mei-amthif-fix-deadlock-in-initialization-during-a-reset.patch