* [PATCH] ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk
@ 2017-07-12 14:45 Geert Uytterhoeven
2017-07-27 19:53 ` Simon Horman
0 siblings, 1 reply; 3+ messages in thread
From: Geert Uytterhoeven @ 2017-07-12 14:45 UTC (permalink / raw)
To: linux-arm-kernel
Simon Horman reported that Koelsch and Lager hang during boot, and
bisected this to commit 1c3c5eab171590f8 ("sched/core: Enable
might_sleep() and smp_processor_id() checks early").
The da9063/da9210 regulator quirk for R-Car Gen2 boards uses a bus
notifier, and unregisters the notifier when it is no longer needed.
However, a notifier must not be unregistered from within the call chain.
This bug went unnoticed, as blocking_notifier_chain_unregister() didn't
take the semaphore during early boot. The aforementioned commit changed
that behavior, leading to a deadlock.
Fix this by removing the call to bus_unregister_notifier(), and keeping
local completion state instead.
Reported-by: Simon Horman <horms+renesas@verge.net.au>
Fixes: 663fbb52159cca6f ("ARM: shmobile: R-Car Gen2: Add da9063/da9210 regulator quirk")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
index 73e3adbc133096ec..44438f344dc80f9c 100644
--- a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
+++ b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
@@ -67,8 +67,12 @@ static int regulator_quirk_notify(struct notifier_block *nb,
{
struct device *dev = data;
struct i2c_client *client;
+ static bool done;
u32 mon;
+ if (done)
+ return 0;
+
mon = ioread32(irqc + IRQC_MONITOR);
dev_dbg(dev, "%s: %ld, IRQC_MONITOR = 0x%x\n", __func__, action, mon);
if (mon & REGULATOR_IRQ_MASK)
@@ -99,7 +103,7 @@ static int regulator_quirk_notify(struct notifier_block *nb,
remove:
dev_info(dev, "IRQ2 is not asserted, removing quirk\n");
- bus_unregister_notifier(&i2c_bus_type, nb);
+ done = true;
iounmap(irqc);
return 0;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH] ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk
2017-07-12 14:45 [PATCH] ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk Geert Uytterhoeven
@ 2017-07-27 19:53 ` Simon Horman
0 siblings, 0 replies; 3+ messages in thread
From: Simon Horman @ 2017-07-27 19:53 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 12, 2017 at 04:45:20PM +0200, Geert Uytterhoeven wrote:
> Simon Horman reported that Koelsch and Lager hang during boot, and
> bisected this to commit 1c3c5eab171590f8 ("sched/core: Enable
> might_sleep() and smp_processor_id() checks early").
>
> The da9063/da9210 regulator quirk for R-Car Gen2 boards uses a bus
> notifier, and unregisters the notifier when it is no longer needed.
> However, a notifier must not be unregistered from within the call chain.
>
> This bug went unnoticed, as blocking_notifier_chain_unregister() didn't
> take the semaphore during early boot. The aforementioned commit changed
> that behavior, leading to a deadlock.
>
> Fix this by removing the call to bus_unregister_notifier(), and keeping
> local completion state instead.
>
> Reported-by: Simon Horman <horms+renesas@verge.net.au>
> Fixes: 663fbb52159cca6f ("ARM: shmobile: R-Car Gen2: Add da9063/da9210 regulator quirk")
> Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Sorry for the delay, I have applied this as a fix for v4.13.
^ permalink raw reply [flat|nested] 3+ messages in thread
* [GIT PULL] Third Round of Renesas ARM Based SoC Fixes for v4.13
@ 2017-07-31 11:12 Simon Horman
2017-07-31 11:12 ` [PATCH] ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk Simon Horman
0 siblings, 1 reply; 3+ messages in thread
From: Simon Horman @ 2017-07-31 11:12 UTC (permalink / raw)
To: linux-arm-kernel
Hi Olof, Hi Kevin, Hi Arnd,
Please consider these third round of Renesas ARM based SoC fixes for v4.13.
This pull request is based on v4.12-rc1 rather than earlier fixes for v4.13
as it is unrelated to those fixes and their dependencies - arm64 DT updates
for R-Car Gen 3 SoCs.
This fix resolves a deadlock during boot on R-Car Gen 2 SoCs.
The bug has been present since v4.1-rc1 but does not manifest in
a deadlock until v4.13-rc1.
The following changes since commit 2ea659a9ef488125eb46da6eb571de5eae5c43f6:
Linux 4.12-rc1 (2017-05-13 13:19:49 -0700)
are available in the git repository at:
https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git tags/renesas-fixes3-for-v4.13
for you to fetch changes up to fce8dc5e50e44d8f644e0f7854e6d7d518fedb68:
ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk (2017-07-29 10:32:52 +0200)
----------------------------------------------------------------
Third Round of Renesas ARM Based SoC Fixes for v4.13
Fix deadlock in regulator quirk for R-Car Gen 2 SoCs
The da9063/da9210 regulator quirk for R-Car Gen2 boards uses a bus
notifier, and unregisters the notifier when it is no longer needed.
However, a notifier must not be unregistered from within the call chain.
This bug went unnoticed, as blocking_notifier_chain_unregister() didn't
take the semaphore during early boot. This is no longer the case as of
upstream commit 1c3c5eab171590f8 ("sched/core: Enable might_sleep() and
smp_processor_id() checks early") and a deadlock occurs.
----------------------------------------------------------------
Geert Uytterhoeven (1):
ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk
arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH] ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk
2017-07-31 11:12 [GIT PULL] Third Round of Renesas ARM Based SoC Fixes for v4.13 Simon Horman
@ 2017-07-31 11:12 ` Simon Horman
0 siblings, 0 replies; 3+ messages in thread
From: Simon Horman @ 2017-07-31 11:12 UTC (permalink / raw)
To: linux-arm-kernel
From: Geert Uytterhoeven <geert+renesas@glider.be>
Simon Horman reported that Koelsch and Lager hang during boot, and
bisected this to commit 1c3c5eab171590f8 ("sched/core: Enable
might_sleep() and smp_processor_id() checks early").
The da9063/da9210 regulator quirk for R-Car Gen2 boards uses a bus
notifier, and unregisters the notifier when it is no longer needed.
However, a notifier must not be unregistered from within the call chain.
This bug went unnoticed, as blocking_notifier_chain_unregister() didn't
take the semaphore during early boot. The aforementioned commit changed
that behavior, leading to a deadlock.
Fix this by removing the call to bus_unregister_notifier(), and keeping
local completion state instead.
Reported-by: Simon Horman <horms+renesas@verge.net.au>
Fixes: 663fbb52159cca6f ("ARM: shmobile: R-Car Gen2: Add da9063/da9210 regulator quirk")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
---
arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
index 73e3adbc1330..44438f344dc8 100644
--- a/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
+++ b/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c
@@ -67,8 +67,12 @@ static int regulator_quirk_notify(struct notifier_block *nb,
{
struct device *dev = data;
struct i2c_client *client;
+ static bool done;
u32 mon;
+ if (done)
+ return 0;
+
mon = ioread32(irqc + IRQC_MONITOR);
dev_dbg(dev, "%s: %ld, IRQC_MONITOR = 0x%x\n", __func__, action, mon);
if (mon & REGULATOR_IRQ_MASK)
@@ -99,7 +103,7 @@ static int regulator_quirk_notify(struct notifier_block *nb,
remove:
dev_info(dev, "IRQ2 is not asserted, removing quirk\n");
- bus_unregister_notifier(&i2c_bus_type, nb);
+ done = true;
iounmap(irqc);
return 0;
}
--
2.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-07-31 11:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-12 14:45 [PATCH] ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk Geert Uytterhoeven
2017-07-27 19:53 ` Simon Horman
-- strict thread matches above, loose matches on Subject: below --
2017-07-31 11:12 [GIT PULL] Third Round of Renesas ARM Based SoC Fixes for v4.13 Simon Horman
2017-07-31 11:12 ` [PATCH] ARM: shmobile: rcar-gen2: Fix deadlock in regulator quirk Simon Horman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).