patch "mei: amthif: fix deadlock in initialization during a reset" added to char-misc-testing
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 my char-misc git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
in the char-misc-testing branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will be merged to the char-misc-next branch sometime soon, after it passes testing, and the merge window is open.
If you have any questions about this process, please let me know.
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
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
@@ -66,8 +66,12 @@ int mei_amthif_host_init(struct mei_device *dev, struct mei_me_client *me_cl)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 ;
@@ -76,11 +80,13 @@ int mei_amthif_host_init(struct mei_device *dev, struct mei_me_client *me_cl) 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
@@ -984,12 +984,10 @@ void mei_cl_bus_rescan_work(struct 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); }
Signature · 1 line
2.9.3