Netdev List
 help / color / mirror / Atom feed
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
To: Jakub Kicinski <kuba@kernel.org>, davem@davemloft.net
Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com,
	andrew+netdev@lunn.ch, horms@kernel.org,
	michael.chan@broadcom.com, joshwash@google.com,
	tariqt@nvidia.com, haiyangz@microsoft.com, linux@armlinux.org.uk,
	willemb@google.com, ernis@linux.microsoft.com,
	sdf.kernel@gmail.com, kory.maincent@bootlin.com,
	danieller@nvidia.com, idosch@nvidia.com
Subject: Re: [PATCH net-next 04/14] net: ethtool: relax ethnl_req_get_phydev() locking assertion
Date: Fri, 29 May 2026 10:43:04 +0200	[thread overview]
Message-ID: <70c0a3dc-a522-4141-b98c-2ebc231b20ae@bootlin.com> (raw)
In-Reply-To: <20260528231637.251822-5-kuba@kernel.org>

Hi,

On 5/29/26 01:16, Jakub Kicinski wrote:
> phydev <> netdev linking and lifecycle depends on rtnl_lock.
> We want to switch to instance locks for most ethtool ops.
> Let's add an assert that ops locked devices don't use phydev
> today. If one does we can either opt the phy ops out of
> being purely ops locked, or do deeper surgery to make phy
> locking ops-compatible. I don't think there's any fundamental
> challenge to make that work.

Yeah untangling phylink/SFP/phylib from rtnl will be needed soon
indeed, quite the can of worms...

But for the topo part, this change should do the trick.

At some point we'll need to convert a more embeded-oriented MAC
driver to being ops-locked, to get a good idea of the amount of
work in front of us.

Most of the constraints come from the different lifetimes of
phy_device, sfp-bus and net_device, RTNL is the easy way to
guarantee that the netdev doesn't dissapear under our feet.

Andrew and Russell were careful to get people to annotate
the RTNL dependencies with assertions, this should make it easier
to tackle the conversion :)

For now,

Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>

Maxime
> 
> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
> ---
>   include/linux/phy_link_topology.h   | 5 +++++
>   drivers/net/phy/phy_link_topology.c | 8 ++++++++
>   net/ethtool/netlink.c               | 6 ++++--
>   net/ethtool/phy.c                   | 1 -
>   4 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/phy_link_topology.h b/include/linux/phy_link_topology.h
> index 68a59e25821c..95575f68d5bc 100644
> --- a/include/linux/phy_link_topology.h
> +++ b/include/linux/phy_link_topology.h
> @@ -36,6 +36,11 @@ struct phy_device_node {
>   	struct phy_device *phy;
>   };
>   
> +static inline bool phy_link_topo_empty(struct net_device *dev)
> +{
> +	return !dev->link_topo;
> +}
> +
>   #if IS_ENABLED(CONFIG_PHYLIB)
>   int phy_link_topo_add_phy(struct net_device *dev,
>   			  struct phy_device *phy,
> diff --git a/drivers/net/phy/phy_link_topology.c b/drivers/net/phy/phy_link_topology.c
> index 1f1eb5d59b38..aed3b26c1674 100644
> --- a/drivers/net/phy/phy_link_topology.c
> +++ b/drivers/net/phy/phy_link_topology.c
> @@ -10,6 +10,7 @@
>   #include <linux/phy.h>
>   #include <linux/rtnetlink.h>
>   #include <linux/xarray.h>
> +#include <net/netdev_lock.h>
>   
>   static int netdev_alloc_phy_link_topology(struct net_device *dev)
>   {
> @@ -35,6 +36,13 @@ int phy_link_topo_add_phy(struct net_device *dev,
>   	struct phy_device_node *pdn;
>   	int ret;
>   
> +	/* ethtool ops may run without rtnl_lock, and rtnl_lock is what
> +	 * currently protects the PHY topology. No driver currently mixes
> +	 * the two, flag if someone tries. See also ethnl_req_get_phydev().
> +	 */
> +	if (WARN_ON_ONCE(netdev_need_ops_lock(dev)))
> +		return -EOPNOTSUPP;
> +
>   	if (!topo) {
>   		ret = netdev_alloc_phy_link_topology(dev);
>   		if (ret)
> diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
> index 902ff7d0a71d..a91cc4bc964f 100644
> --- a/net/ethtool/netlink.c
> +++ b/net/ethtool/netlink.c
> @@ -226,11 +226,13 @@ struct phy_device *ethnl_req_get_phydev(const struct ethnl_req_info *req_info,
>   {
>   	struct phy_device *phydev;
>   
> -	ASSERT_RTNL();
> -
>   	if (!req_info->dev)
>   		return NULL;
>   
> +	/* If there is no PHY in sight there's no need for assert locking */
> +	if (!phy_link_topo_empty(req_info->dev))
> +		ASSERT_RTNL();
> +
>   	if (!req_info->phy_index)
>   		return req_info->dev->phydev;
>   
> diff --git a/net/ethtool/phy.c b/net/ethtool/phy.c
> index ddc6eab701ed..018b0412be86 100644
> --- a/net/ethtool/phy.c
> +++ b/net/ethtool/phy.c
> @@ -78,7 +78,6 @@ static int phy_prepare_data(const struct ethnl_req_info *req_info,
>   	struct phy_device *phydev;
>   	int ret;
>   
> -	/* RTNL is held by the caller */
>   	phydev = ethnl_req_get_phydev(req_info, tb, ETHTOOL_A_PHY_HEADER,
>   				      info->extack);
>   	if (IS_ERR_OR_NULL(phydev))


  reply	other threads:[~2026-05-29  8:43 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-28 23:16 [PATCH net-next 00/14] net: ethtool: let ops locked drivers run without rtnl_lock Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 01/14] net: ethtool: cmis_cdb: hold instance lock for ops locked devices Jakub Kicinski
2026-05-29 11:25   ` Jakub Sitnicki
2026-05-28 23:16 ` [PATCH net-next 02/14] net: ethtool: make sure __ethtool_get_link_ksettings() is ops-locked Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 03/14] net: ethtool: serialize broadcast notification sequence allocation Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 04/14] net: ethtool: relax ethnl_req_get_phydev() locking assertion Jakub Kicinski
2026-05-29  8:43   ` Maxime Chevallier [this message]
2026-05-29 14:27     ` Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 05/14] net: ethtool: make dev->hwprov ops-protected Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 06/14] net: ethtool: optionally skip rtnl_lock on Netlink path for GET ops Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 07/14] net: ethtool: optionally skip rtnl_lock on Netlink path for SET ops Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 08/14] net: ethtool: optionally skip rtnl_lock in cable test handlers Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 09/14] net: ethtool: optionally skip rtnl_lock in ethnl_tsinfo_dumpit() Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 10/14] net: ethtool: optionally skip rtnl_lock in ethnl_act_module_fw_flash() Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 11/14] net: ethtool: optionally skip rtnl_lock in RSS context handlers Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 12/14] net: ethtool: ioctl: concentrate the locking Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 13/14] net: ethtool: optionally skip rtnl_lock on IOCTL path Jakub Kicinski
2026-05-28 23:16 ` [PATCH net-next 14/14] docs: net: ethtool: document ops-locked drivers and op_needs_rtnl Jakub Kicinski
2026-05-29  7:41 ` [syzbot ci] Re: net: ethtool: let ops locked drivers run without rtnl_lock syzbot ci

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=70c0a3dc-a522-4141-b98c-2ebc231b20ae@bootlin.com \
    --to=maxime.chevallier@bootlin.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=danieller@nvidia.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=ernis@linux.microsoft.com \
    --cc=haiyangz@microsoft.com \
    --cc=horms@kernel.org \
    --cc=idosch@nvidia.com \
    --cc=joshwash@google.com \
    --cc=kory.maincent@bootlin.com \
    --cc=kuba@kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=michael.chan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=sdf.kernel@gmail.com \
    --cc=tariqt@nvidia.com \
    --cc=willemb@google.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