From: Lukas Wunner <lukas@wunner.de>
To: Andrew Lunn <andrew@lunn.ch>
Cc: Marek Szyprowski <m.szyprowski@samsung.com>,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Eric Dumazet <edumazet@google.com>,
netdev@vger.kernel.org, linux-usb@vger.kernel.org,
Steve Glendinning <steve.glendinning@shawell.net>,
UNGLinuxDriver@microchip.com, Oliver Neukum <oneukum@suse.com>,
Andre Edich <andre.edich@microchip.com>,
Oleksij Rempel <linux@rempel-privat.de>,
Martyn Welch <martyn.welch@collabora.com>,
Gabriel Hojda <ghojda@yo2urs.ro>,
Christoph Fritz <chf.fritz@googlemail.com>,
Lino Sanfilippo <LinoSanfilippo@gmx.de>,
Philipp Rosenberger <p.rosenberger@kunbus.com>,
Heiner Kallweit <hkallweit1@gmail.com>,
Russell King <linux@armlinux.org.uk>,
Ferry Toth <fntoth@gmail.com>,
Krzysztof Kozlowski <krzk@kernel.org>,
'Linux Samsung SOC' <linux-samsung-soc@vger.kernel.org>
Subject: Re: [PATCH net-next v3 5/7] usbnet: smsc95xx: Forward PHY interrupts to PHY driver to avoid polling
Date: Mon, 23 May 2022 15:47:09 +0200 [thread overview]
Message-ID: <20220523134709.GA25989@wunner.de> (raw)
In-Reply-To: <Yot/ad/Ch7iGYnGB@lunn.ch>
On Mon, May 23, 2022 at 02:34:49PM +0200, Andrew Lunn wrote:
> > --- a/drivers/net/phy/phy_device.c
> > +++ b/drivers/net/phy/phy_device.c
> > @@ -283,8 +283,11 @@ static __maybe_unused int mdio_bus_phy_suspend(struct device *dev)
> > * may call phy routines that try to grab the same lock, and that may
> > * lead to a deadlock.
> > */
> > - if (phydev->attached_dev && phydev->adjust_link)
> > + if (phydev->attached_dev && phydev->adjust_link) {
> > + if (phy_interrupt_is_valid(phydev))
> > + synchronize_irq(phydev->irq);
> > phy_stop_machine(phydev);
> > + }
>
> What is this hunk trying to achieve? As far as i know, interrupts have
> not been disabled. So as soon as the call to synchronize_irq()
> finishes, could well be another interrupt happens.
That other interrupt would bail out of phy_interrupt() because
the is_prepared flag is set on the PHY's struct device, see
first hunk of the patch.
The problem is that an interrupt may occur before the system
sleep transition commences. phy_interrupt() will notice that
is_prepared is not (yet) set, hence invokes drv->handle_interrupt().
Let's say the IRQ thread is preempted at that point, the system
sleep transition is started and mdio_bus_phy_suspend() is run.
It calls phy_stop_machine(), so the state machine is now stopped.
Now phy_interrupt() continues, and the PHY driver's ->handle_interrupt()
callback starts the state machine. Boom, that's not what we want.
So the synchronize_irq() ensures that any already running
phy_interrupt() runs to completion before phy_stop_machine()
is called. It doesn't matter if another interrupt occurs
because then is_prepared will have been set and therefore
phy_interrupt() won't call drv->handle_interrupt().
Let me know if I haven't explained it in sufficient clarity,
I'll be happy to try again. :)
I'm more concerned about the first hunk of the patch because I'm
not sure I got the wakeup stuff right...
Thanks,
Lukas
next prev parent reply other threads:[~2022-05-23 13:47 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-12 8:42 [PATCH net-next v3 0/7] Polling be gone on LAN95xx Lukas Wunner
2022-05-12 8:42 ` [PATCH net-next v3 1/7] usbnet: Run unregister_netdev() before unbind() again Lukas Wunner
2022-05-12 8:42 ` [PATCH net-next v3 2/7] usbnet: smsc95xx: Don't clear read-only PHY interrupt Lukas Wunner
2022-05-12 11:57 ` Lukas Wunner
2022-05-12 8:42 ` [PATCH net-next v3 3/7] usbnet: smsc95xx: Don't reset PHY behind PHY driver's back Lukas Wunner
2022-05-12 12:12 ` Lukas Wunner
2022-05-12 8:42 ` [PATCH net-next v3 4/7] usbnet: smsc95xx: Avoid link settings race on interrupt reception Lukas Wunner
2022-05-12 12:15 ` Lukas Wunner
2022-05-12 8:42 ` [PATCH net-next v3 5/7] usbnet: smsc95xx: Forward PHY interrupts to PHY driver to avoid polling Lukas Wunner
2022-05-17 10:18 ` Marek Szyprowski
2022-05-19 19:08 ` Lukas Wunner
2022-05-19 21:22 ` Marek Szyprowski
2022-05-23 9:43 ` Lukas Wunner
2022-05-23 11:38 ` Marek Szyprowski
2022-05-23 12:34 ` Andrew Lunn
2022-05-23 13:47 ` Lukas Wunner [this message]
2022-05-24 0:52 ` Andrew Lunn
2022-05-24 1:08 ` Andrew Lunn
2022-05-24 6:16 ` Marek Szyprowski
2022-05-24 12:03 ` Andrew Lunn
2022-05-26 13:55 ` Lukas Wunner
2022-05-24 12:13 ` Lukas Wunner
2022-06-06 1:28 ` Andrew Lunn
2022-08-26 6:51 ` Marek Szyprowski
2022-08-26 7:19 ` Lukas Wunner
2022-08-26 7:41 ` Marek Szyprowski
2022-08-26 7:53 ` Lukas Wunner
2022-08-26 8:29 ` Marek Szyprowski
2022-08-29 11:40 ` Marek Szyprowski
2022-09-18 19:13 ` Lukas Wunner
2022-09-18 20:41 ` Florian Fainelli
2022-09-18 20:55 ` Lukas Wunner
2022-09-18 22:11 ` Florian Fainelli
2022-09-23 4:20 ` Lukas Wunner
2022-09-22 13:21 ` Marek Szyprowski
2022-05-12 8:42 ` [PATCH net-next v3 6/7] net: phy: smsc: Cache interrupt mask Lukas Wunner
2022-05-12 12:17 ` Lukas Wunner
2022-05-12 8:42 ` [PATCH net-next v3 7/7] net: phy: smsc: Cope with hot-removal in interrupt handler Lukas Wunner
2022-05-12 12:19 ` Lukas Wunner
2022-05-13 10:40 ` [PATCH net-next v3 0/7] Polling be gone on LAN95xx patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220523134709.GA25989@wunner.de \
--to=lukas@wunner.de \
--cc=LinoSanfilippo@gmx.de \
--cc=UNGLinuxDriver@microchip.com \
--cc=andre.edich@microchip.com \
--cc=andrew@lunn.ch \
--cc=chf.fritz@googlemail.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=fntoth@gmail.com \
--cc=ghojda@yo2urs.ro \
--cc=hkallweit1@gmail.com \
--cc=krzk@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=linux@rempel-privat.de \
--cc=m.szyprowski@samsung.com \
--cc=martyn.welch@collabora.com \
--cc=netdev@vger.kernel.org \
--cc=oneukum@suse.com \
--cc=p.rosenberger@kunbus.com \
--cc=pabeni@redhat.com \
--cc=steve.glendinning@shawell.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.