Message ID | 1499870720-30390-1-git-send-email-geert+renesas@glider.be (mailing list archive) |
---|---|
State | Accepted |
Commit | fce8dc5e50e44d8f644e0f7854e6d7d518fedb68 |
Delegated to: | Simon Horman |
Headers | show |
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.
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; }
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(-)