aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2026-06-04 17:29:02 -0700
committerJakub Kicinski <kuba@kernel.org>2026-06-09 10:13:04 -0700
commitded86da4bbb78cad74cecc368fee3ae3a296e2ca (patch)
tree5881ec9b5c0f2a3b4adc1705f6562877a7a1f1b7 /drivers
parent8845484367dade6811bbc3c0c1d66a2a0721c3c0 (diff)
net: ethtool: relax ethnl_req_get_phydev() locking assertion
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. Reviewed-by: Nicolai Buchwitz <nb@tipi-net.de> Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Acked-by: Stanislav Fomichev <sdf@fomichev.me> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Link: https://patch.msgid.link/20260605002912.3456868-3-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/phy/phy_link_topology.c8
1 files changed, 8 insertions, 0 deletions
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)