]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Jun 2016 00:49:01 +0000 (17:49 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Jun 2016 00:49:01 +0000 (17:49 -0700)
added patches:
regulator-fix-deadlock-during-regulator-registration.patch

queue-4.6/regulator-fix-deadlock-during-regulator-registration.patch [new file with mode: 0644]
queue-4.6/series

diff --git a/queue-4.6/regulator-fix-deadlock-during-regulator-registration.patch b/queue-4.6/regulator-fix-deadlock-during-regulator-registration.patch
new file mode 100644 (file)
index 0000000..da7f73b
--- /dev/null
@@ -0,0 +1,67 @@
+From a2151374230820a3a6e654f2998b2a44dbfae4e1 Mon Sep 17 00:00:00 2001
+From: Jon Hunter <jonathanh@nvidia.com>
+Date: Wed, 30 Mar 2016 17:09:13 +0100
+Subject: regulator: Fix deadlock during regulator registration
+
+From: Jon Hunter <jonathanh@nvidia.com>
+
+commit a2151374230820a3a6e654f2998b2a44dbfae4e1 upstream.
+
+Commit 5e3ca2b349b1 ("regulator: Try to resolve regulators supplies on
+registration") added a call to regulator_resolve_supply() within
+regulator_register() where the regulator_list_mutex is held. This causes
+a deadlock to occur on the Tegra114 Dalmore board when the palmas PMIC
+is registered because regulator_register_resolve_supply() calls
+regulator_dev_lookup() which may try to acquire the regulator_list_mutex
+again.
+
+Fix this by releasing the mutex before calling
+regulator_register_resolve_supply() and update the error exit path to
+ensure the mutex is released on an error.
+
+[Made commit message more legible -- broonie]
+
+Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/regulator/core.c |   10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- a/drivers/regulator/core.c
++++ b/drivers/regulator/core.c
+@@ -3991,12 +3991,11 @@ regulator_register(const struct regulato
+       }
+       rdev_init_debugfs(rdev);
++      mutex_unlock(&regulator_list_mutex);
+       /* try to resolve regulators supply since a new one was registered */
+       class_for_each_device(&regulator_class, NULL, NULL,
+                             regulator_register_resolve_supply);
+-out:
+-      mutex_unlock(&regulator_list_mutex);
+       kfree(config);
+       return rdev;
+@@ -4007,15 +4006,16 @@ scrub:
+       regulator_ena_gpio_free(rdev);
+       device_unregister(&rdev->dev);
+       /* device core frees rdev */
+-      rdev = ERR_PTR(ret);
+       goto out;
+ wash:
+       regulator_ena_gpio_free(rdev);
+ clean:
+       kfree(rdev);
+-      rdev = ERR_PTR(ret);
+-      goto out;
++out:
++      mutex_unlock(&regulator_list_mutex);
++      kfree(config);
++      return ERR_PTR(ret);
+ }
+ EXPORT_SYMBOL_GPL(regulator_register);
index 5f8c9a8fa96cf8c414855ac39d3cfe0f2933250c..899d5ef97d607372df2643b6a0d4c10d5ec724c2 100644 (file)
@@ -119,3 +119,4 @@ xfs-fix-inode-validity-check-in-xfs_iflush_cluster.patch
 xfs-skip-stale-inodes-in-xfs_iflush_cluster.patch
 drm-msm-remove-unused-variable.patch
 ib-hfi1-fix-hard-lockup-due-to-not-using-save-restore-spin-lock.patch
+regulator-fix-deadlock-during-regulator-registration.patch