Patch "usb: dwc3: omap: fix race of pm runtime with irq handler in probe" has been added to the 4.9-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
usb: dwc3: omap: fix race of pm runtime with irq handler in probe
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
usb-dwc3-omap-fix-race-of-pm-runtime-with-irq-handler-in-probe.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Aug 4 15:15:01 PDT 2017
From: Grygorii Strashko <[email protected]>
Date: Mon, 12 Dec 2016 13:37:52 -0600
Subject: usb: dwc3: omap: fix race of pm runtime with irq handler in probe
From: Grygorii Strashko <[email protected]>
[ Upstream commit 12a7f17fac5b370bec87259e4c718faf563ce900 ]
Now races can happen between interrupt handler execution and PM runtime in error handling code path in probe and in dwc3_omap_remove() which will lead to system crash:
in probe:
...
err1:
pm_runtime_put_sync(dev); ^^ PM runtime can race with IRQ handler when deferred probing happening due to extcon pm_runtime_disable(dev); return ret;
in dwc3_omap_remove:
...
dwc3_omap_disable_irqs(omap); ^^ IRQs are disabled in HW, but handler may still run of_platform_depopulate(omap->dev); pm_runtime_put_sync(&pdev->dev); ^^ PM runtime can race with IRQ handler pm_runtime_disable(&pdev->dev); return 0;
So, OMAP DWC3 IRQ need to be disabled before calling pm_runtime_put() in probe and in dwc3_omap_remove().
--- drivers/usb/dwc3/dwc3-omap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/dwc3/dwc3-omap.c +4 -2
@@ -19,6 +19,7 @@#include <linux/module.h> #include <linux/kernel.h> #include <linux/slab.h> +#include <linux/irq.h> #include <linux/interrupt.h> #include <linux/platform_device.h> #include <linux/platform_data/dwc3-omap.h>
@@ -511,7 +512,7 @@ static int dwc3_omap_probe(struct platfo/* check the DMA Status */ reg =dwc3_omap_readl (omap->base,USBOTGSS_SYSCONFIG ); - +irq_set_status_flags (omap->irq,IRQ_NOAUTOEN ); ret =devm_request_threaded_irq (dev, omap->irq, dwc3_omap_interrupt, dwc3_omap_interrupt_thread,IRQF_SHARED ,"dwc3-omap" , omap);
@@ -532,7 +533,7 @@ static int dwc3_omap_probe(struct platfo }dwc3_omap_enable_irqs (omap); - +enable_irq (omap->irq);return 0 ; err2:
@@ -553,6 +554,7 @@ static int dwc3_omap_remove(struct platfextcon_unregister_notifier (omap->edev,EXTCON_USB , &omap->vbus_nb);extcon_unregister_notifier (omap->edev,EXTCON_USB_HOST , &omap->id_nb);dwc3_omap_disable_irqs (omap); +disable_irq (omap->irq);of_platform_depopulate (omap->dev);pm_runtime_put_sync (&pdev->dev);pm_runtime_disable (&pdev->dev);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/usb-dwc3-omap-fix-race-of-pm-runtime-with-irq-handler-in-probe.patch queue-4.9/irqchip-keystone-fix-scheduling-while-atomic-on-rt.patch