[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YmlMaE53+EhRz5it@rowland.harvard.edu>
Date: Wed, 27 Apr 2022 10:00:08 -0400
From: Alan Stern <stern@...land.harvard.edu>
To: Lukas Wunner <lukas@...ner.de>
Cc: Steve Glendinning <steve.glendinning@...well.net>,
UNGLinuxDriver@...rochip.com, Oliver Neukum <oneukum@...e.com>,
"David S. Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>, netdev@...r.kernel.org,
linux-usb@...r.kernel.org, Andre Edich <andre.edich@...rochip.com>,
Oleksij Rempel <o.rempel@...gutronix.de>,
Martyn Welch <martyn.welch@...labora.com>,
Gabriel Hojda <ghojda@...urs.ro>,
Christoph Fritz <chf.fritz@...glemail.com>,
Lino Sanfilippo <LinoSanfilippo@....de>,
Philipp Rosenberger <p.rosenberger@...bus.com>,
Heiner Kallweit <hkallweit1@...il.com>,
Andrew Lunn <andrew@...n.ch>,
Russell King <linux@...linux.org.uk>
Subject: Re: [PATCH net] usbnet: smsc95xx: Fix deadlock on runtime resume
On Wed, Apr 27, 2022 at 08:41:49AM +0200, Lukas Wunner wrote:
> Commit 05b35e7eb9a1 ("smsc95xx: add phylib support") amended
> smsc95xx_resume() to call phy_init_hw(). That function waits for the
> device to runtime resume even though it is placed in the runtime resume
> path, causing a deadlock.
>
> The problem is that phy_init_hw() calls down to smsc95xx_mdiobus_read(),
> which never uses the _nopm variant of usbnet_read_cmd(). Amend it to
> autosense that it's called from the runtime resume/suspend path and use
> the _nopm variant if so.
...
> diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
> index 4ef61f6b85df..82b8feaa5162 100644
> --- a/drivers/net/usb/smsc95xx.c
> +++ b/drivers/net/usb/smsc95xx.c
> @@ -285,11 +285,21 @@ static void smsc95xx_mdio_write_nopm(struct usbnet *dev, int idx, int regval)
> __smsc95xx_mdio_write(dev, pdata->phydev->mdio.addr, idx, regval, 1);
> }
>
> +static bool smsc95xx_in_pm(struct usbnet *dev)
> +{
> +#ifdef CONFIG_PM
> + return dev->udev->dev.power.runtime_status == RPM_RESUMING ||
> + dev->udev->dev.power.runtime_status == RPM_SUSPENDING;
> +#else
> + return false;
> +#endif
> +}
This does not do what you want. You want to know if this function is
being called in the resume pathway, but all it really tells you is
whether the function is being called while a resume is in progress (and
it doesn't even do that very precisely because the code does not use the
runtime-pm spinlock). The resume could be running in a different
thread, in which case you most definitely _would_ want to want for it to
complete.
Alan Stern
Powered by blists - more mailing lists