From: Maxime Chevallier <maxime.chevallier@bootlin.com>
To: Vladimir Oltean <vladimir.oltean@nxp.com>
Cc: davem@davemloft.net, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com,
"Andrew Lunn" <andrew@lunn.ch>,
"Jakub Kicinski" <kuba@kernel.org>,
"Eric Dumazet" <edumazet@google.com>,
"Paolo Abeni" <pabeni@redhat.com>,
"Russell King" <linux@armlinux.org.uk>,
linux-arm-kernel@lists.infradead.org,
"Christophe Leroy" <christophe.leroy@csgroup.eu>,
"Herve Codina" <herve.codina@bootlin.com>,
"Florian Fainelli" <f.fainelli@gmail.com>,
"Heiner Kallweit" <hkallweit1@gmail.com>,
"Köry Maincent" <kory.maincent@bootlin.com>,
"Jesse Brandeburg" <jesse.brandeburg@intel.com>,
"Jonathan Corbet" <corbet@lwn.net>,
"Marek Behún" <kabel@kernel.org>,
"Piergiorgio Beruto" <piergiorgio.beruto@gmail.com>,
"Oleksij Rempel" <o.rempel@pengutronix.de>,
"Nicolò Veronese" <nicveronese@gmail.com>
Subject: Re: [PATCH net-next v4 01/13] net: phy: Introduce ethernet link topology representation
Date: Mon, 18 Dec 2023 10:11:31 +0100 [thread overview]
Message-ID: <20231218101131.04160623@device-28.home> (raw)
In-Reply-To: <20231215214523.ntk5kec32mb5vqjs@skbuf>
Hello Vlad, PHy maintainers,
On Fri, 15 Dec 2023 23:45:23 +0200
Vladimir Oltean <vladimir.oltean@nxp.com> wrote:
> On Fri, Dec 15, 2023 at 06:12:23PM +0100, Maxime Chevallier wrote:
> > diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
> > index d8e9335d415c..89daaccc9276 100644
> > --- a/drivers/net/phy/phy_device.c
> > +++ b/drivers/net/phy/phy_device.c
> > @@ -1491,6 +1500,11 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
> >
> > if (phydev->sfp_bus_attached)
> > dev->sfp_bus = phydev->sfp_bus;
> > +
> > + err = phy_link_topo_add_phy(&dev->link_topo, phydev,
> > + PHY_UPSTREAM_MAC, dev);
> > + if (err)
> > + goto error;
> > }
> >
> > /* Some Ethernet drivers try to connect to a PHY device before
> > @@ -1816,6 +1830,7 @@ void phy_detach(struct phy_device *phydev)
> > if (dev) {
> > phydev->attached_dev->phydev = NULL;
> > phydev->attached_dev = NULL;
> > + phy_link_topo_del_phy(&dev->link_topo, phydev);
> > }
> > phydev->phylink = NULL;
> >
> > diff --git a/drivers/net/phy/phy_link_topology.c b/drivers/net/phy/phy_link_topology.c
> > new file mode 100644
> > index 000000000000..22f6372d002c
> > --- /dev/null
> > +++ b/drivers/net/phy/phy_link_topology.c
> > +int phy_link_topo_add_phy(struct phy_link_topology *topo,
> > + struct phy_device *phy,
> > + enum phy_upstream upt, void *upstream)
> > +{
> > + struct phy_device_node *pdn;
> > + int ret;
> > +
> > + /* Protects phy and upstream */
> > + ASSERT_RTNL();
>
> Something to think for the PHY library maintainers. This is probably
> the first time when the rtnl_lock() requirement is asserted at
> phy_attach_direct() time.
>
> I haven't done too much with the patch set yet, so I don't understand
> exactly from the comment what this is protecting. But I get the
> following assertion failure with DSA:
>
> [ 4.157160] ------------[ cut here ]------------
> [ 4.161805] RTNL: assertion failed at drivers/net/phy/phy_link_topology.c (35)
> [ 4.169124] WARNING: CPU: 0 PID: 26 at drivers/net/phy/phy_link_topology.c:35 phy_link_topo_add_phy+0x128/0x130
> [ 4.179263] Modules linked in:
> [ 4.209232] pc : phy_link_topo_add_phy+0x128/0x130
> [ 4.214040] lr : phy_link_topo_add_phy+0x128/0x130
> [ 4.293822] Call trace:
> [ 4.296271] phy_link_topo_add_phy+0x128/0x130
> [ 4.300730] phy_attach_direct+0xbc/0x3c4
> [ 4.304752] phylink_fwnode_phy_connect+0xa8/0xf8
> [ 4.309473] phylink_of_phy_connect+0x1c/0x28
> [ 4.313844] dsa_user_create+0x318/0x5ac
> [ 4.317778] dsa_port_setup+0x100/0x144
> [ 4.321626] dsa_register_switch+0xe90/0x11f8
> [ 4.325997] sja1105_probe+0x2bc/0x2e4
> [ 4.329759] spi_probe+0xa4/0xc4
> [ 4.332995] really_probe+0x16c/0x3fc
> [ 4.336669] __driver_probe_device+0xa4/0x168
> [ 4.341041] driver_probe_device+0x3c/0x220
> [ 4.345238] __device_attach_driver+0x128/0x1cc
> [ 4.349784] bus_for_each_drv+0xf4/0x14c
> [ 4.353719] __device_attach+0xfc/0x1bc
> [ 4.357567] device_initial_probe+0x14/0x20
> [ 4.361764] bus_probe_device+0x94/0x100
> [ 4.385371] ---[ end trace 0000000000000000 ]---
>
> Someone please correct me if I'm wrong, but at least up until now, calling
> this unlocked has been quite harmless, because we call dsa_user_phy_setup()
> before register_netdevice(), and thus, the net_device is pretty much
> inaccessible to the world when we attach it to the PHY.
Ok so I'll give it more thought on that part, and analyze better the
access paths that ca be problematic. I'll update the doc accordingly,
as this is non-trivial. I haven't been able to test it on a DSA setup,
nor on a !phylink mac, so thanks a lot for testing :)
>
> And, while having the phydev->attached_dev pointer populated technically
> makes the net_device now accessible from the PHY, this is a moot point,
> because no user space command targets the PHY directly. They all target
> the netdev, and through that, netdev->phydev. The netdev is still
> unregistered, so it's ok to not have rtnl_lock().
>
> It is rather going to be something that concerns those drivers which call
> phy_attach_direct() after registering, for example from ndo_open().
In that case this is fine, right ? As ndo_open runs with rtnl held,
phy-targetting netlink commands (that indeed goes through the netdev)
will be also serialized ? I might be missing the point though :(
> Interestingly, phylink_disconnect_phy() has an ASSERT_RTNL() in it
> even though the phylink_attach_phy() derivatives do not. I'm unable
> to ascertain whether a previous unregister_netdevice() call makes this
> requirement redundant or not.
>
> > +
> > + pdn = kzalloc(sizeof(*pdn), GFP_KERNEL);
> > + if (!pdn)
> > + return -ENOMEM;
> > +
> > + pdn->phy = phy;
> > + switch (upt) {
> > + case PHY_UPSTREAM_MAC:
> > + pdn->upstream.netdev = (struct net_device *)upstream;
> > + if (phy_on_sfp(phy))
> > + pdn->parent_sfp_bus = pdn->upstream.netdev->sfp_bus;
> > + break;
> > + case PHY_UPSTREAM_PHY:
> > + pdn->upstream.phydev = (struct phy_device *)upstream;
> > + if (phy_on_sfp(phy))
> > + pdn->parent_sfp_bus = pdn->upstream.phydev->sfp_bus;
> > + break;
> > + default:
> > + ret = -EINVAL;
> > + goto err;
> > + }
> > + pdn->upstream_type = upt;
> > +
> > + ret = xa_alloc_cyclic(&topo->phys, &phy->phyindex, pdn, xa_limit_32b,
> > + &topo->next_phy_index, GFP_KERNEL);
> > + if (ret)
> > + goto err;
> > +
> > + return 0;
> > +
> > +err:
> > + kfree(pdn);
> > + return ret;
> > +}
> > +EXPORT_SYMBOL_GPL(phy_link_topo_add_phy);
next prev parent reply other threads:[~2023-12-18 9:11 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-15 17:12 [PATCH net-next v4 00/13] Introduce PHY listing and link_topology tracking Maxime Chevallier
2023-12-15 17:12 ` [PATCH net-next v4 01/13] net: phy: Introduce ethernet link topology representation Maxime Chevallier
2023-12-15 21:45 ` Vladimir Oltean
2023-12-17 16:57 ` Andrew Lunn
2023-12-18 8:49 ` Maxime Chevallier
2023-12-18 9:11 ` Maxime Chevallier [this message]
2023-12-18 6:04 ` kernel test robot
2023-12-18 8:10 ` kernel test robot
2023-12-15 17:12 ` [PATCH net-next v4 02/13] net: sfp: pass the phy_device when disconnecting an sfp module's PHY Maxime Chevallier
2023-12-15 17:12 ` [PATCH net-next v4 03/13] net: phy: add helpers to handle sfp phy connect/disconnect Maxime Chevallier
2023-12-15 17:12 ` [PATCH net-next v4 04/13] net: sfp: Add helper to return the SFP bus name Maxime Chevallier
2023-12-17 17:07 ` Andrew Lunn
2023-12-15 17:12 ` [PATCH net-next v4 05/13] net: ethtool: Allow passing a phy index for some commands Maxime Chevallier
2023-12-16 11:48 ` kernel test robot
2023-12-17 17:11 ` Andrew Lunn
2023-12-15 17:12 ` [PATCH net-next v4 06/13] netlink: specs: add phy-index as a header parameter Maxime Chevallier
2023-12-17 17:11 ` Andrew Lunn
2023-12-15 17:12 ` [PATCH net-next v4 07/13] net: ethtool: Introduce a command to list PHYs on an interface Maxime Chevallier
2023-12-19 8:55 ` Simon Horman
2023-12-15 17:12 ` [PATCH net-next v4 08/13] netlink: specs: add ethnl PHY_GET command set Maxime Chevallier
2023-12-15 17:12 ` [PATCH net-next v4 09/13] net: ethtool: plca: Target the command to the requested PHY Maxime Chevallier
2023-12-18 9:55 ` Andrew Lunn
2023-12-15 17:12 ` [PATCH net-next v4 10/13] net: ethtool: pse-pd: " Maxime Chevallier
2023-12-18 9:58 ` Andrew Lunn
2023-12-21 17:31 ` Maxime Chevallier
2023-12-15 17:12 ` [PATCH net-next v4 11/13] net: ethtool: cable-test: " Maxime Chevallier
2023-12-18 9:58 ` Andrew Lunn
2023-12-15 17:12 ` [PATCH net-next v4 12/13] net: ethtool: strset: Allow querying phy stats by index Maxime Chevallier
2023-12-18 10:00 ` Andrew Lunn
2023-12-15 17:12 ` [PATCH net-next v4 13/13] Documentation: networking: document phy_link_topology Maxime Chevallier
2023-12-18 10:10 ` Andrew Lunn
2023-12-19 8:58 ` Simon Horman
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=20231218101131.04160623@device-28.home \
--to=maxime.chevallier@bootlin.com \
--cc=andrew@lunn.ch \
--cc=christophe.leroy@csgroup.eu \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=herve.codina@bootlin.com \
--cc=hkallweit1@gmail.com \
--cc=jesse.brandeburg@intel.com \
--cc=kabel@kernel.org \
--cc=kory.maincent@bootlin.com \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=nicveronese@gmail.com \
--cc=o.rempel@pengutronix.de \
--cc=pabeni@redhat.com \
--cc=piergiorgio.beruto@gmail.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.oltean@nxp.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).