All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Sean Anderson <sean.anderson@seco.com>
Cc: Landen.Chao@mediatek.com, UNGLinuxDriver@microchip.com,
	alexandre.belloni@bootlin.com, andrew@lunn.ch,
	angelogioacchino.delregno@collabora.com, arinc.unal@arinc9.com,
	claudiu.manoil@nxp.com, daniel@makrotopia.org,
	davem@davemloft.net, dqfext@gmail.com, edumazet@google.com,
	f.fainelli@gmail.com, hkallweit1@gmail.com, kuba@kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com,
	netdev@vger.kernel.org, olteanv@gmail.com, pabeni@redhat.com,
	sean.wang@mediatek.com
Subject: Re: [PATCH RFC net-next 03/14] net: phylink: add support for PCS link change notifications
Date: Tue, 23 Jan 2024 21:05:47 +0000	[thread overview]
Message-ID: <ZbAqK+RbuJZ6d4tK@shell.armlinux.org.uk> (raw)
In-Reply-To: <e3647618-b896-47a2-b9b9-c75b56813293@seco.com>

On Tue, Jan 23, 2024 at 03:33:57PM -0500, Sean Anderson wrote:
> On 1/23/24 15:07, Russell King (Oracle) wrote:
> > On Tue, Jan 23, 2024 at 02:46:15PM -0500, Sean Anderson wrote:
> >> Hi Russell,
> >> 
> >> Does there need to be any locking when calling phylink_pcs_change? I
> >> noticed that you call it from threaded IRQ context in [1]. Can that race
> >> with phylink_major_config?
> > 
> > What kind of scenario are you thinking may require locking?
> 
> Can't we at least get a spurious bounce? E.g.
> 
> pcs_major_config()
>   pcs_disable(old_pcs) /* masks IRQ */
>   old_pcs->phylink = NULL;
>   new_pcs->phylink = pl;
>   ...
>   pcs_enable(new_pcs) /* unmasks IRQ */
>   ...
> 
> pcs_handle_irq(new_pcs) /* Link up IRQ */
>   phylink_pcs_change(new_pcs, true)
>     phylink_run_resolve(pl)
> 
> phylink_resolve(pl)
>   /* Link up */

By this time, old_pcs->phylink has been set to NULL as you mentioned
above.

> pcs_handle_irq(old_pcs) /* Link down IRQ (pending from before pcs_disable) */
>   phylink_pcs_change(old_pcs, false)
>     phylink_run_resolve(pl) /* Doesn't see the NULL */

So here, phylink_pcs_change(old_pcs, ...) will read old_pcs->phylink and
find that it's NULL, and do nothing.

> > I guess the possibility would be if pcs->phylink changes and the
> > compiler reads it multiple times - READ_ONCE() should solve that.
> > 
> > However, in terms of the mechanics, there's no race.
> > 
> > During the initial bringup, the resolve worker isn't started until
> > after phylink_major_config() has completed (it's started at
> > phylink_enable_and_run_resolve().) So, if phylink_pcs_change()
> > gets called while in phylink_major_config() there, it'll see
> > that pl->phylink_disable_state is non-zero, and won't queue the
> > work.
> > 
> > The next one is within the worker itself - and there can only
> > be one instance of the worker running in totality. So, if
> > phylink_pcs_change() gets called while phylink_major_config() is
> > running from this path, the only thing it'll do is re-schedule
> > the resolve worker to run another iteration which is harmless
> > (whether or not the PCS is still current.)
> > 
> > The last case is phylink_ethtool_ksettings_set(). This runs under
> > the state_mutex, which locks out the resolve worker (since it also
> > takes that mutex).
> > 
> > So calling phylink_pcs_change() should be pretty harmless _unless_
> > the compiler re-reads pcs->phylink multiple times inside
> > phylink_pcs_change(), which I suppose with modern compilers is
> > possible. Hence my suggestion above about READ_ONCE() for that.
> > 
> > Have you encountered an OOPS because pcs->phylink has become NULL?
> > Or have you spotted another issue?
> 
> I was looking at extending this code, and I was wondering if I needed
> to e.g. take RTNL first. Thanks for the quick response.

Note that phylink_mac_change() gets called in irq context, so this
stuff can't take any mutexes or the rtnl. It is also intended that
phylink_pcs_change() is similarly callable in irq context.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!


WARNING: multiple messages have this Message-ID (diff)
From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Sean Anderson <sean.anderson@seco.com>
Cc: Landen.Chao@mediatek.com, UNGLinuxDriver@microchip.com,
	alexandre.belloni@bootlin.com, andrew@lunn.ch,
	angelogioacchino.delregno@collabora.com, arinc.unal@arinc9.com,
	claudiu.manoil@nxp.com, daniel@makrotopia.org,
	davem@davemloft.net, dqfext@gmail.com, edumazet@google.com,
	f.fainelli@gmail.com, hkallweit1@gmail.com, kuba@kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com,
	netdev@vger.kernel.org, olteanv@gmail.com, pabeni@redhat.com,
	sean.wang@mediatek.com
Subject: Re: [PATCH RFC net-next 03/14] net: phylink: add support for PCS link change notifications
Date: Tue, 23 Jan 2024 21:05:47 +0000	[thread overview]
Message-ID: <ZbAqK+RbuJZ6d4tK@shell.armlinux.org.uk> (raw)
In-Reply-To: <e3647618-b896-47a2-b9b9-c75b56813293@seco.com>

On Tue, Jan 23, 2024 at 03:33:57PM -0500, Sean Anderson wrote:
> On 1/23/24 15:07, Russell King (Oracle) wrote:
> > On Tue, Jan 23, 2024 at 02:46:15PM -0500, Sean Anderson wrote:
> >> Hi Russell,
> >> 
> >> Does there need to be any locking when calling phylink_pcs_change? I
> >> noticed that you call it from threaded IRQ context in [1]. Can that race
> >> with phylink_major_config?
> > 
> > What kind of scenario are you thinking may require locking?
> 
> Can't we at least get a spurious bounce? E.g.
> 
> pcs_major_config()
>   pcs_disable(old_pcs) /* masks IRQ */
>   old_pcs->phylink = NULL;
>   new_pcs->phylink = pl;
>   ...
>   pcs_enable(new_pcs) /* unmasks IRQ */
>   ...
> 
> pcs_handle_irq(new_pcs) /* Link up IRQ */
>   phylink_pcs_change(new_pcs, true)
>     phylink_run_resolve(pl)
> 
> phylink_resolve(pl)
>   /* Link up */

By this time, old_pcs->phylink has been set to NULL as you mentioned
above.

> pcs_handle_irq(old_pcs) /* Link down IRQ (pending from before pcs_disable) */
>   phylink_pcs_change(old_pcs, false)
>     phylink_run_resolve(pl) /* Doesn't see the NULL */

So here, phylink_pcs_change(old_pcs, ...) will read old_pcs->phylink and
find that it's NULL, and do nothing.

> > I guess the possibility would be if pcs->phylink changes and the
> > compiler reads it multiple times - READ_ONCE() should solve that.
> > 
> > However, in terms of the mechanics, there's no race.
> > 
> > During the initial bringup, the resolve worker isn't started until
> > after phylink_major_config() has completed (it's started at
> > phylink_enable_and_run_resolve().) So, if phylink_pcs_change()
> > gets called while in phylink_major_config() there, it'll see
> > that pl->phylink_disable_state is non-zero, and won't queue the
> > work.
> > 
> > The next one is within the worker itself - and there can only
> > be one instance of the worker running in totality. So, if
> > phylink_pcs_change() gets called while phylink_major_config() is
> > running from this path, the only thing it'll do is re-schedule
> > the resolve worker to run another iteration which is harmless
> > (whether or not the PCS is still current.)
> > 
> > The last case is phylink_ethtool_ksettings_set(). This runs under
> > the state_mutex, which locks out the resolve worker (since it also
> > takes that mutex).
> > 
> > So calling phylink_pcs_change() should be pretty harmless _unless_
> > the compiler re-reads pcs->phylink multiple times inside
> > phylink_pcs_change(), which I suppose with modern compilers is
> > possible. Hence my suggestion above about READ_ONCE() for that.
> > 
> > Have you encountered an OOPS because pcs->phylink has become NULL?
> > Or have you spotted another issue?
> 
> I was looking at extending this code, and I was wondering if I needed
> to e.g. take RTNL first. Thanks for the quick response.

Note that phylink_mac_change() gets called in irq context, so this
stuff can't take any mutexes or the rtnl. It is also intended that
phylink_pcs_change() is similarly callable in irq context.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2024-01-23 21:06 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-23 14:15 [PATCH RFC net-next 00/14] dsa/88e6xxx/phylink changes after the next merge window Russell King (Oracle)
2023-06-23 14:15 ` Russell King (Oracle)
2023-06-23 14:16 ` [PATCH RFC net-next 01/14] net: phylink: add pcs_enable()/pcs_disable() methods Russell King (Oracle)
2023-06-23 14:16   ` Russell King (Oracle)
2023-06-23 14:16 ` [PATCH RFC net-next 02/14] net: phylink: add pcs_pre_config()/pcs_post_config() methods Russell King (Oracle)
2023-06-23 14:16   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 03/14] net: phylink: add support for PCS link change notifications Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2024-01-23 19:46   ` Sean Anderson
2024-01-23 19:46     ` Sean Anderson
2024-01-23 20:07     ` Russell King (Oracle)
2024-01-23 20:07       ` Russell King (Oracle)
2024-01-23 20:33       ` Sean Anderson
2024-01-23 20:33         ` Sean Anderson
2024-01-23 21:05         ` Russell King (Oracle) [this message]
2024-01-23 21:05           ` Russell King (Oracle)
2024-01-23 21:09           ` Sean Anderson
2024-01-23 21:09             ` Sean Anderson
2023-06-23 14:17 ` [PATCH RFC net-next 04/14] net: mdio: add unlocked mdiobus and mdiodev bus accessors Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 05/14] net: dsa: mv88e6xxx: remove handling for DSA and CPU ports Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 06/14] net: dsa: mv88e6xxx: add infrastructure for phylink_pcs Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 07/14] net: dsa: mv88e6xxx: export mv88e6xxx_pcs_decode_state() Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 08/14] net: dsa: mv88e6xxx: convert 88e6185 to phylink_pcs Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 09/14] net: dsa: mv88e6xxx: convert 88e6352 " Russell King
2023-06-23 14:17   ` Russell King
2023-06-23 14:17 ` [PATCH RFC net-next 10/14] net: dsa: mv88e6xxx: convert 88e639x " Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 11/14] net: dsa: mv88e6xxx: cleanup after phylink_pcs conversion Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 12/14] net: dsa: remove legacy_pre_march2020 detection Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:17 ` [PATCH RFC net-next 13/14] net: dsa: remove legacy_pre_march2020 from drivers Russell King (Oracle)
2023-06-23 14:17   ` Russell King (Oracle)
2023-06-23 14:18 ` [PATCH RFC net-next 14/14] net: phylink: remove legacy mac_an_restart() method Russell King (Oracle)
2023-06-23 14:18   ` Russell King (Oracle)

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=ZbAqK+RbuJZ6d4tK@shell.armlinux.org.uk \
    --to=linux@armlinux.org.uk \
    --cc=Landen.Chao@mediatek.com \
    --cc=UNGLinuxDriver@microchip.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=andrew@lunn.ch \
    --cc=angelogioacchino.delregno@collabora.com \
    --cc=arinc.unal@arinc9.com \
    --cc=claudiu.manoil@nxp.com \
    --cc=daniel@makrotopia.org \
    --cc=davem@davemloft.net \
    --cc=dqfext@gmail.com \
    --cc=edumazet@google.com \
    --cc=f.fainelli@gmail.com \
    --cc=hkallweit1@gmail.com \
    --cc=kuba@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=matthias.bgg@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=olteanv@gmail.com \
    --cc=pabeni@redhat.com \
    --cc=sean.anderson@seco.com \
    --cc=sean.wang@mediatek.com \
    /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.