lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Sat, 24 Oct 2020 15:14:09 +0300
From:   Ioana Ciornei <>
To:     Andrew Lunn <>,
        Heiner Kallweit <>,
        Russell King <>,
        Jakub Kicinski <>,,
Cc:     Ioana Ciornei <>,
        Alexandru Ardelean <>,
        Andre Edich <>,
        Antoine Tenart <>,
        Baruch Siach <>,
        Christophe Leroy <>,
        Dan Murphy <>,
        Divya Koppera <>,
        Florian Fainelli <>,
        Hauke Mehrtens <>,
        Jerome Brunet <>,
        Kavya Sree Kotagiri <>,
        Linus Walleij <>,
        Marco Felsch <>,
        Marek Vasut <>,
        Martin Blumenstingl <>,
        Mathias Kresin <>,
        Maxim Kochetkov <>,
        Michael Walle <>,
        Neil Armstrong <>,
        Nisar Sayed <>,
        Oleksij Rempel <>,
        Philippe Schenker <>,
        Willy Liu <>,
        Yuiko Oshino <>
Subject: [RFC net-next 2/5] net: phy: add a shutdown procedure

In case of a board which uses a shared IRQ we can easily end up with an
IRQ storm after a forced reboot.

For example, a 'reboot -f' will trigger a call to the .shutdown()
callbacks of all devices. Because phylib does not implement that hook,
the PHY is not quiesced, thus it can very well leave its IRQ enabled.

At the next boot, if that IRQ line is found asserted by the first PHY
driver that uses it, but _before_ the driver that is _actually_ keeping
the shared IRQ asserted is probed, the IRQ is not going to be
acknowledged, thus it will keep being fired preventing the boot process
of the kernel to continue. This is even worse when the second PHY driver
is a module.

To fix this, implement the .shutdown() callback and disable the
interrupts if these are used.

Note that we are still susceptible to IRQ storms if the previous kernel
exited with a panic or if the bootloader left the shared IRQ active, but
there is absolutely nothing we can do about these cases.

Cc: Alexandru Ardelean <>
Cc: Andre Edich <>
Cc: Antoine Tenart <>
Cc: Baruch Siach <>
Cc: Christophe Leroy <>
Cc: Dan Murphy <>
Cc: Divya Koppera <>
Cc: Florian Fainelli <>
Cc: Hauke Mehrtens <>
Cc: Heiner Kallweit <>
Cc: Jerome Brunet <>
Cc: Kavya Sree Kotagiri <>
Cc: Linus Walleij <>
Cc: Marco Felsch <>
Cc: Marek Vasut <>
Cc: Martin Blumenstingl <>
Cc: Mathias Kresin <>
Cc: Maxim Kochetkov <>
Cc: Michael Walle <>
Cc: Neil Armstrong <>
Cc: Nisar Sayed <>
Cc: Oleksij Rempel <>
Cc: Philippe Schenker <>
Cc: Willy Liu <>
Cc: Yuiko Oshino <>
Signed-off-by: Ioana Ciornei <>
 drivers/net/phy/phy_device.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 5dab6be6fc38..413a0a2c5d51 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -2947,6 +2947,13 @@ static int phy_remove(struct device *dev)
 	return 0;
+static void phy_shutdown(struct device *dev)
+	struct phy_device *phydev = to_phy_device(dev);
+	phy_disable_interrupts(phydev);
  * phy_driver_register - register a phy_driver with the PHY layer
  * @new_driver: new phy_driver to register
@@ -2970,6 +2977,7 @@ int phy_driver_register(struct phy_driver *new_driver, struct module *owner)
 	new_driver->mdiodrv.driver.bus = &mdio_bus_type;
 	new_driver->mdiodrv.driver.probe = phy_probe;
 	new_driver->mdiodrv.driver.remove = phy_remove;
+	new_driver->mdiodrv.driver.shutdown = phy_shutdown;
 	new_driver->mdiodrv.driver.owner = owner;
 	new_driver->mdiodrv.driver.probe_type = PROBE_FORCE_SYNCHRONOUS;

Powered by blists - more mailing lists