From nobody Tue Jun 16 01:36:50 2026 Received: from mail-ot1-f65.google.com (mail-ot1-f65.google.com [209.85.210.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CBF6926F293 for ; Tue, 14 Apr 2026 23:10:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776208239; cv=none; b=lKIEZN8Lf3INVvFgcQvqcqeUrjpeBS6Rv8cSFuWJqaNqec6y9M6nvK9himLeg6/YgJ5OdDrqYXA4C5hsHLcSCJcm7e933AEFkRtVLRDglhc0daSO4508oHiaRrM9dhhru88dCp4ukT40sQuv4IKUvsxHLJIRgjtU7wCqWFmCl1c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776208239; c=relaxed/simple; bh=4wvu9qOxTFhgIplgheLqN3J/RpDztRSNXawiCm/1EEc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=NmFya5LumVVrg83BDgTiuOzzia5n0MO1Jg0L08OLW4YA/0NK08T6DfoZ6izq3ESKqkypJCmW1jEs+SSyTUi4zhMYvR7dIhoZxe0EoDtu8Jcs30hWAcxSNL6cFHB2i4Oy6J/VATUvHevFlI1BI4MWwo93yBRM9QMG1AAdTeQF+I8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Gc6Czc27; arc=none smtp.client-ip=209.85.210.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Gc6Czc27" Received: by mail-ot1-f65.google.com with SMTP id 46e09a7af769-7dbe07d3ec3so2996560a34.0 for ; Tue, 14 Apr 2026 16:10:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776208237; x=1776813037; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=DDVYRZIW5YXcg0u/WJDBbjUu/JAxIWnmG1clJ8HBE1s=; b=Gc6Czc27SL1h3ZRnor3x3uz+omYxrklNuNXZq8LHkd6MD6WYYB5mzSupIXPJ2vDwoY oGDcAIsOwmBCJmz9o/X6HT/MEQIW6LLZjxAlRx1bOxAziCK0W6QC4RNORTD28LCcwPij RDCmjgFqlJrJiPRPOAiZ1Izj/9xWvDG8hCsSk8OnkEsv/RJjFKLWlIj0egRkmFHRjtoQ 0WAXyX7Qn6C8INf9LTAZz0Mkv7YjG0ISxwvbxwLZlXn6slHEjkvz21LU0/OZepiXVvM+ 0pAw6nOjtHeIyB0NyKR/vI2gbDmZMarX5ggbNMt+LeyONfSK+iTD9AyMz0wItq9awFUn GWEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776208237; x=1776813037; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=DDVYRZIW5YXcg0u/WJDBbjUu/JAxIWnmG1clJ8HBE1s=; b=IALfyrmjKjW/bqZXj99f66grKLEEMc5Uv/D0pevY0dB7URjNLOE4i09OqbYSkTSsfi ttX48AqMr0w24xil+NVd7uwsw4oDP+FTSnl01TRFVz5DmdCorIi40kl7Bt7eCTBIbeAW TgQdksH500N266Ny576n/uXKDccLmNNqP+xBo/pPjouJYp2b2Dx56n3KPArEwpKbqSTT CbOw1nRSba+Y+22U1y3sHMbgT3I0YR/6KZuBo26LyVm/73rlUMQfMu0k7mcRX9VWjHpy PyppR0e/59jDVsZ9QlEbwDNhMxGhMQnLSfAwWH9btPxyZxwFtpizZXvFp+8C6l/tdxyJ qITQ== X-Forwarded-Encrypted: i=1; AFNElJ9DvPFOR09F7gbuMUPf1flFobKSlpt2JMdPoNY/SqiLe+jAKbr/UIMWmMYYGOoGZnMjuO9R7XE3J1KeNqs=@vger.kernel.org X-Gm-Message-State: AOJu0YxarYDY4mAMlV0n0cVfnBFiH3ncG9vprDr66Clyf38KBNnPt3kg y1FAJJwIKae5l9GJTkeYtOyHnT0HaWJ0zpCZaTYma+fk4rz4Os5tKNSC X-Gm-Gg: AeBDietTgydVh84De4FtEUORRXGtCVI5Z7Xbm31XTpZPqU41zn4/MZV0hjuOO4ZiEOG wLWKQINyuqgWjKWAdL0VxnpZlkWRpNRuFTXjPcAa9yKjBIJ5xzhEw1z5X6ogdffgjwoNIdyc7Vz ONtsKlo21aFj9A51q/bFqqfQ3pt+4x21KPHYoFi0rXqDi/L1nXs0FxQpeeQ2AOSXfKu3WV4XujC c43WLYPtrBpmRdjrSPxIzu3HrQBcqHtDAeQtP5G5bZygOmkizZZXIZ3V36+xoglEGUDPPfkHIGn rRxUmGa1+eTxPW5JrWKWvHMah6r2E+5HI351lm58soOCRqwxFtYIT1yIInHE/qehp2862ZFsZMW rXdbo5EceMK9FNfUSyXKVe8Eg26So9gVCqaQwPhQpbBnDD7fXvYJg7gXpHkW+tXkVSpN466S714 FlbSPa+u+PNrxdVuWU X-Received: by 2002:a05:6830:4490:b0:7d9:b10c:c85b with SMTP id 46e09a7af769-7dc27cbe979mr10971694a34.11.1776208236772; Tue, 14 Apr 2026 16:10:36 -0700 (PDT) Received: from localhost ([2a03:2880:12ff:3::]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-7dc76a51845sm106310a34.12.2026.04.14.16.10.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2026 16:10:36 -0700 (PDT) From: Stanislav Fomichev X-Google-Original-From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, andrew@lunn.ch, olteanv@gmail.com, horms@kernel.org, sdf@fomichev.me, linux-kernel@vger.kernel.org, Maxime Chevallier Subject: [PATCH net] net: dsa: remove redundant netdev_lock_ops() from conduit ethtool ops Date: Tue, 14 Apr 2026 16:10:35 -0700 Message-ID: <20260414231035.1917035-1-sdf@fomichev.me> X-Mailer: git-send-email 2.52.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" DSA replaces the conduit (master) device's ethtool_ops with its own wrappers that aggregate stats from both the conduit and DSA switch ports. Taking the lock again inside the DSA wrappers causes a deadlock. Stumbled upon this when booting qemu with fbnic and CONFIG_NET_DSA_LOOP=3Dy (which looks like some kind of testing device that auto-populates the ports of eth0). `ethtool -i` is enough to deadlock. This means we have basically = zero coverage for DSA stuff with real ops locked devs. Remove the redundant netdev_lock_ops()/netdev_unlock_ops() calls from the DSA conduit ethtool wrappers. Cc: Maxime Chevallier Fixes: 2bcf4772e45a ("net: ethtool: try to protect all callback with netdev= instance lock") Signed-off-by: Stanislav Fomichev (cherry picked from commit 1538c00ab3212273240112bd53692d54d95f2dd5) Reviewed-by: Maxime Chevallier --- net/dsa/conduit.c | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/net/dsa/conduit.c b/net/dsa/conduit.c index a1b044467bd6..8398d72d7e4d 100644 --- a/net/dsa/conduit.c +++ b/net/dsa/conduit.c @@ -27,9 +27,7 @@ static int dsa_conduit_get_regs_len(struct net_device *de= v) int len; =20 if (ops && ops->get_regs_len) { - netdev_lock_ops(dev); len =3D ops->get_regs_len(dev); - netdev_unlock_ops(dev); if (len < 0) return len; ret +=3D len; @@ -60,15 +58,11 @@ static void dsa_conduit_get_regs(struct net_device *dev, int len; =20 if (ops && ops->get_regs_len && ops->get_regs) { - netdev_lock_ops(dev); len =3D ops->get_regs_len(dev); - if (len < 0) { - netdev_unlock_ops(dev); + if (len < 0) return; - } regs->len =3D len; ops->get_regs(dev, regs, data); - netdev_unlock_ops(dev); data +=3D regs->len; } =20 @@ -115,10 +109,8 @@ static void dsa_conduit_get_ethtool_stats(struct net_d= evice *dev, int count, mcount =3D 0; =20 if (ops && ops->get_sset_count && ops->get_ethtool_stats) { - netdev_lock_ops(dev); mcount =3D ops->get_sset_count(dev, ETH_SS_STATS); ops->get_ethtool_stats(dev, stats, data); - netdev_unlock_ops(dev); } =20 list_for_each_entry(dp, &dst->ports, list) { @@ -149,10 +141,8 @@ static void dsa_conduit_get_ethtool_phy_stats(struct n= et_device *dev, if (count >=3D 0) phy_ethtool_get_stats(dev->phydev, stats, data); } else if (ops && ops->get_sset_count && ops->get_ethtool_phy_stats) { - netdev_lock_ops(dev); count =3D ops->get_sset_count(dev, ETH_SS_PHY_STATS); ops->get_ethtool_phy_stats(dev, stats, data); - netdev_unlock_ops(dev); } =20 if (count < 0) @@ -176,13 +166,11 @@ static int dsa_conduit_get_sset_count(struct net_devi= ce *dev, int sset) struct dsa_switch_tree *dst =3D cpu_dp->dst; int count =3D 0; =20 - netdev_lock_ops(dev); if (sset =3D=3D ETH_SS_PHY_STATS && dev->phydev && (!ops || !ops->get_ethtool_phy_stats)) count =3D phy_ethtool_get_sset_count(dev->phydev); else if (ops && ops->get_sset_count) count =3D ops->get_sset_count(dev, sset); - netdev_unlock_ops(dev); =20 if (count < 0) count =3D 0; @@ -239,7 +227,6 @@ static void dsa_conduit_get_strings(struct net_device *= dev, u32 stringset, struct dsa_switch_tree *dst =3D cpu_dp->dst; int count, mcount =3D 0; =20 - netdev_lock_ops(dev); if (stringset =3D=3D ETH_SS_PHY_STATS && dev->phydev && !ops->get_ethtool_phy_stats) { mcount =3D phy_ethtool_get_sset_count(dev->phydev); @@ -253,7 +240,6 @@ static void dsa_conduit_get_strings(struct net_device *= dev, u32 stringset, mcount =3D 0; ops->get_strings(dev, stringset, data); } - netdev_unlock_ops(dev); =20 list_for_each_entry(dp, &dst->ports, list) { if (!dsa_port_is_dsa(dp) && !dsa_port_is_cpu(dp)) --=20 2.52.0