Revision 1758bde2e4aa5ff188d53e7d9d388bbb7e12eebb authored by Lukas Wunner on 28 June 2022, 10:15:08 UTC, committed by Jakub Kicinski on 30 June 2022, 03:38:52 UTC
Upon system sleep, mdio_bus_phy_suspend() stops the phy_state_machine(),
but subsequent interrupts may retrigger it:

They may have been left enabled to facilitate wakeup and are not
quiesced until the ->suspend_noirq() phase.  Unwanted interrupts may
hence occur between mdio_bus_phy_suspend() and dpm_suspend_noirq(),
as well as between dpm_resume_noirq() and mdio_bus_phy_resume().

Retriggering the phy_state_machine() through an interrupt is not only
undesirable for the reason given in mdio_bus_phy_suspend() (freezing it
midway with phydev->lock held), but also because the PHY may be
inaccessible after it's suspended:  Accesses to USB-attached PHYs are
blocked once usb_suspend_both() clears the can_submit flag and PHYs on
PCI network cards may become inaccessible upon suspend as well.

Amend phy_interrupt() to avoid triggering the state machine if the PHY
is suspended.  Signal wakeup instead if the attached net_device or its
parent has been configured as a wakeup source.  (Those conditions are
identical to mdio_bus_phy_may_suspend().)  Postpone handling of the
interrupt until the PHY has resumed.

Before stopping the phy_state_machine() in mdio_bus_phy_suspend(),
wait for a concurrent phy_interrupt() to run to completion.  That is
necessary because phy_interrupt() may have checked the PHY's suspend
status before the system sleep transition commenced and it may thus
retrigger the state machine after it was stopped.

Likewise, after re-enabling interrupt handling in mdio_bus_phy_resume(),
wait for a concurrent phy_interrupt() to complete to ensure that
interrupts which it postponed are properly rerun.

The issue was exposed by commit 1ce8b37241ed ("usbnet: smsc95xx: Forward
PHY interrupts to PHY driver to avoid polling"), but has existed since
forever.

Fixes: 541cd3ee00a4 ("phylib: Fix deadlock on resume")
Link: https://lore.kernel.org/netdev/a5315a8a-32c2-962f-f696-de9a26d30091@samsung.com/
Reported-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: stable@vger.kernel.org # v2.6.33+
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://lore.kernel.org/r/b7f386d04e9b5b0e2738f0125743e30676f309ef.1656410895.git.lukas@wunner.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent e65af54
History
File Mode Size
Kconfig -rw-r--r-- 14.2 KB
Makefile -rw-r--r-- 5.5 KB
alphascale_asm9260-icoll.h -rw-r--r-- 3.5 KB
exynos-combiner.c -rw-r--r-- 6.6 KB
irq-al-fic.c -rw-r--r-- 7.0 KB
irq-alpine-msi.c -rw-r--r-- 7.0 KB
irq-apple-aic.c -rw-r--r-- 31.2 KB
irq-armada-370-xp.c -rw-r--r-- 22.3 KB
irq-aspeed-i2c-ic.c -rw-r--r-- 2.7 KB
irq-aspeed-scu-ic.c -rw-r--r-- 6.5 KB
irq-aspeed-vic.c -rw-r--r-- 5.7 KB
irq-ath79-cpu.c -rw-r--r-- 2.3 KB
irq-ath79-misc.c -rw-r--r-- 5.0 KB
irq-atmel-aic-common.c -rw-r--r-- 6.0 KB
irq-atmel-aic-common.h -rw-r--r-- 1.2 KB
irq-atmel-aic.c -rw-r--r-- 7.1 KB
irq-atmel-aic5.c -rw-r--r-- 10.6 KB
irq-bcm2835.c -rw-r--r-- 7.3 KB
irq-bcm2836.c -rw-r--r-- 8.2 KB
irq-bcm6345-l1.c -rw-r--r-- 9.2 KB
irq-bcm7038-l1.c -rw-r--r-- 11.6 KB
irq-bcm7120-l2.c -rw-r--r-- 9.3 KB
irq-brcmstb-l2.c -rw-r--r-- 8.0 KB
irq-clps711x.c -rw-r--r-- 6.0 KB
irq-crossbar.c -rw-r--r-- 8.3 KB
irq-csky-apb-intc.c -rw-r--r-- 6.6 KB
irq-csky-mpintc.c -rw-r--r-- 6.4 KB
irq-davinci-aintc.c -rw-r--r-- 4.7 KB
irq-davinci-cp-intc.c -rw-r--r-- 7.3 KB
irq-digicolor.c -rw-r--r-- 3.2 KB
irq-dw-apb-ictl.c -rw-r--r-- 5.8 KB
irq-ftintc010.c -rw-r--r-- 5.4 KB
irq-gic-common.c -rw-r--r-- 3.6 KB
irq-gic-common.h -rw-r--r-- 885 bytes
irq-gic-pm.c -rw-r--r-- 3.5 KB
irq-gic-realview.c -rw-r--r-- 2.2 KB
irq-gic-v2m.c -rw-r--r-- 14.3 KB
irq-gic-v3-its-fsl-mc-msi.c -rw-r--r-- 4.2 KB
irq-gic-v3-its-pci-msi.c -rw-r--r-- 4.9 KB
irq-gic-v3-its-platform-msi.c -rw-r--r-- 3.8 KB
irq-gic-v3-its.c -rw-r--r-- 137.7 KB
irq-gic-v3-mbi.c -rw-r--r-- 8.0 KB
irq-gic-v3.c -rw-r--r-- 60.7 KB
irq-gic-v4.c -rw-r--r-- 9.4 KB
irq-gic.c -rw-r--r-- 43.4 KB
irq-goldfish-pic.c -rw-r--r-- 3.2 KB
irq-hip04.c -rw-r--r-- 10.2 KB
irq-i8259.c -rw-r--r-- 9.8 KB
irq-idt3243x.c -rw-r--r-- 2.8 KB
irq-imgpdc.c -rw-r--r-- 13.1 KB
irq-imx-gpcv2.c -rw-r--r-- 6.7 KB
irq-imx-intmux.c -rw-r--r-- 9.8 KB
irq-imx-irqsteer.c -rw-r--r-- 7.7 KB
irq-ingenic-tcu.c -rw-r--r-- 5.0 KB
irq-ingenic.c -rw-r--r-- 3.9 KB
irq-ixp4xx.c -rw-r--r-- 7.5 KB
irq-jcore-aic.c -rw-r--r-- 3.0 KB
irq-keystone.c -rw-r--r-- 5.9 KB
irq-loongson-htpic.c -rw-r--r-- 3.0 KB
irq-loongson-htvec.c -rw-r--r-- 4.9 KB
irq-loongson-liointc.c -rw-r--r-- 8.2 KB
irq-loongson-pch-msi.c -rw-r--r-- 5.9 KB
irq-loongson-pch-pic.c -rw-r--r-- 6.3 KB
irq-lpc32xx.c -rw-r--r-- 5.8 KB
irq-ls-extirq.c -rw-r--r-- 4.4 KB
irq-ls-scfg-msi.c -rw-r--r-- 10.7 KB
irq-ls1x.c -rw-r--r-- 4.7 KB
irq-madera.c -rw-r--r-- 7.2 KB
irq-mbigen.c -rw-r--r-- 9.3 KB
irq-mchp-eic.c -rw-r--r-- 6.4 KB
irq-meson-gpio.c -rw-r--r-- 16.2 KB
irq-mips-cpu.c -rw-r--r-- 6.9 KB
irq-mips-gic.c -rw-r--r-- 20.3 KB
irq-mmp.c -rw-r--r-- 14.8 KB
irq-mscc-ocelot.c -rw-r--r-- 5.5 KB
irq-mst-intc.c -rw-r--r-- 7.1 KB
irq-mtk-cirq.c -rw-r--r-- 7.4 KB
irq-mtk-sysirq.c -rw-r--r-- 5.8 KB
irq-mvebu-gicp.c -rw-r--r-- 6.4 KB
irq-mvebu-icu.c -rw-r--r-- 11.2 KB
irq-mvebu-odmi.c -rw-r--r-- 5.7 KB
irq-mvebu-pic.c -rw-r--r-- 4.8 KB
irq-mvebu-sei.c -rw-r--r-- 12.7 KB
irq-mxs.c -rw-r--r-- 6.0 KB
irq-nvic.c -rw-r--r-- 3.5 KB
irq-omap-intc.c -rw-r--r-- 9.5 KB
irq-ompic.c -rw-r--r-- 5.5 KB
irq-or1k-pic.c -rw-r--r-- 4.3 KB
irq-orion.c -rw-r--r-- 5.7 KB
irq-owl-sirq.c -rw-r--r-- 8.8 KB
irq-partition-percpu.c -rw-r--r-- 6.2 KB
irq-pic32-evic.c -rw-r--r-- 8.1 KB
irq-pruss-intc.c -rw-r--r-- 17.3 KB
irq-qcom-mpm.c -rw-r--r-- 12.0 KB
irq-rda-intc.c -rw-r--r-- 2.5 KB
irq-realtek-rtl.c -rw-r--r-- 4.5 KB
irq-renesas-intc-irqpin.c -rw-r--r-- 16.0 KB
irq-renesas-irqc.c -rw-r--r-- 6.9 KB
irq-renesas-rza1.c -rw-r--r-- 6.6 KB
irq-riscv-intc.c -rw-r--r-- 3.3 KB
irq-sa11x0.c -rw-r--r-- 3.8 KB
irq-sifive-plic.c -rw-r--r-- 10.7 KB
irq-sl28cpld.c -rw-r--r-- 2.3 KB
irq-sni-exiu.c -rw-r--r-- 7.8 KB
irq-st.c -rw-r--r-- 5.1 KB
irq-stm32-exti.c -rw-r--r-- 28.4 KB
irq-sun4i.c -rw-r--r-- 5.9 KB
irq-sun6i-r.c -rw-r--r-- 11.6 KB
irq-sunxi-nmi.c -rw-r--r-- 6.5 KB
irq-tb10x.c -rw-r--r-- 4.9 KB
irq-tegra.c -rw-r--r-- 8.4 KB
irq-ti-sci-inta.c -rw-r--r-- 21.6 KB
irq-ti-sci-intr.c -rw-r--r-- 8.3 KB
irq-ts4800.c -rw-r--r-- 4.0 KB
irq-uniphier-aidet.c -rw-r--r-- 6.2 KB
irq-versatile-fpga.c -rw-r--r-- 6.1 KB
irq-vf610-mscm-ir.c -rw-r--r-- 6.2 KB
irq-vic.c -rw-r--r-- 13.2 KB
irq-vt8500.c -rw-r--r-- 5.8 KB
irq-wpcm450-aic.c -rw-r--r-- 4.3 KB
irq-xilinx-intc.c -rw-r--r-- 6.3 KB
irq-xtensa-mx.c -rw-r--r-- 4.7 KB
irq-xtensa-pic.c -rw-r--r-- 2.7 KB
irq-zevio.c -rw-r--r-- 3.1 KB
irqchip.c -rw-r--r-- 1.8 KB
qcom-irq-combiner.c -rw-r--r-- 6.9 KB
qcom-pdc.c -rw-r--r-- 8.6 KB
spear-shirq.c -rw-r--r-- 7.3 KB

back to top