Skip to contentSkip to conversation

Patch "mei: amthif: fix deadlock in initialization during a reset" has been added to the 4.7-stable tree

PATCH [email protected] 1 participant 1 message Oct 20, 2016

Subsystems (3)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

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 e728ae271f4cf71218ec06a6daf61b79466cb466 Mon 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_devi
 	struct 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