diff mbox series

driver core: Add missing dev->bus->need_parent_lock checks

Message ID 7586985.G9YL5ver76@aspire.rjw.lan (mailing list archive)
State Not Applicable, archived
Headers show
Series driver core: Add missing dev->bus->need_parent_lock checks | expand

Commit Message

Rafael J. Wysocki Dec. 13, 2018, 6:27 p.m. UTC
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

__device_release_driver() has to check dev->bus->need_parent_lock
before dropping the parent lock and acquiring it again as it may
attempt to drop a lock that hasn't been acquired or lock a device
that shouldn't be locked and create a lock imbalance.

Fixes: 8c97a46af04b (driver core: hold dev's parent lock when needed)
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---

This should go into -stable for everything over 4.18 methinks.

---
 drivers/base/dd.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Greg Kroah-Hartman Dec. 13, 2018, 6:53 p.m. UTC | #1
On Thu, Dec 13, 2018 at 07:27:47PM +0100, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> 
> __device_release_driver() has to check dev->bus->need_parent_lock
> before dropping the parent lock and acquiring it again as it may
> attempt to drop a lock that hasn't been acquired or lock a device
> that shouldn't be locked and create a lock imbalance.
> 
> Fixes: 8c97a46af04b (driver core: hold dev's parent lock when needed)
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---
> 
> This should go into -stable for everything over 4.18 methinks.

Does this fix Daniel's lockdep splat?

thanks,

greg k-h
Daniel Vetter Dec. 13, 2018, 7:06 p.m. UTC | #2
On Thu, Dec 13, 2018 at 7:53 PM Greg Kroah-Hartman
<gregkh@linuxfoundation.org> wrote:
>
> On Thu, Dec 13, 2018 at 07:27:47PM +0100, Rafael J. Wysocki wrote:
> > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> >
> > __device_release_driver() has to check dev->bus->need_parent_lock
> > before dropping the parent lock and acquiring it again as it may
> > attempt to drop a lock that hasn't been acquired or lock a device
> > that shouldn't be locked and create a lock imbalance.
> >
> > Fixes: 8c97a46af04b (driver core: hold dev's parent lock when needed)
> > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> > ---
> >
> > This should go into -stable for everything over 4.18 methinks.
>
> Does this fix Daniel's lockdep splat?

Nah, separate issue. Afaiui bus->need_parent_lock is only set for usb,
I'm unbinding pci devices. I guess the combination of someone
unbinding an usb device through sysfs which also has some device links
attached doesn't happen.

Since I've dug around in this, for this patch here from Rafael:

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>

Cheers, Daniel

>
> thanks,
>
> greg k-h
diff mbox series

Patch

Index: linux-pm/drivers/base/dd.c
===================================================================
--- linux-pm.orig/drivers/base/dd.c
+++ linux-pm/drivers/base/dd.c
@@ -933,11 +933,11 @@  static void __device_release_driver(stru
 
 		while (device_links_busy(dev)) {
 			device_unlock(dev);
-			if (parent)
+			if (parent && dev->bus->need_parent_lock)
 				device_unlock(parent);
 
 			device_links_unbind_consumers(dev);
-			if (parent)
+			if (parent && dev->bus->need_parent_lock)
 				device_lock(parent);
 
 			device_lock(dev);