From: Jakub Kicinski <kuba@kernel•org>
To: davem@davemloft•net
Cc: netdev@vger•kernel.org, edumazet@google•com, pabeni@redhat•com,
andrew+netdev@lunn•ch, horms@kernel•org, jakub@cloudflare•com,
maxime.chevallier@bootlin•com, nb@tipi-net•de, lee@kernel•org,
linux-leds@vger•kernel.org, pavel@kernel•org, jv@jvosburgh•net,
michael.chan@broadcom•com, jhs@mojatatu•com,
vinicius.gomes@intel•com, idosch@nvidia•com, razor@blackwall•org,
hare@suse•de, jhasan@marvell•com, danieller@nvidia•com,
Jakub Kicinski <kuba@kernel•org>
Subject: [PATCH net-next v2 10/11] scsi: fcoe: don't recurse on the netdev's ops lock
Date: Tue, 2 Jun 2026 18:28:39 -0700 [thread overview]
Message-ID: <20260603012840.2254293-11-kuba@kernel.org> (raw)
In-Reply-To: <20260603012840.2254293-1-kuba@kernel.org>
fcoe_link_speed_update() calls __ethtool_get_link_ksettings() on the
lport's netdev, which will soon take the dev's ops lock. Some notifier
callers already arrive with this lock held. Switch to
netif_get_link_ksettings() and adjust the explicit call sites to take
the netdev lock explicitly.
Within fcoe_device_notification() try to only query the link speed
from notifiers which announce link state change (UP / CHANGE),
DOWN / GOING_DOWN notifiers are slightly sketchy when it comes
to ops locking right now, and the code already special-cases
those by maintaining the local link_possible variable.
Also take the lock in bnx2fc_net_config(), even though I think
that bnx2fc call sites are largely irrelevant since it's not
an ops-locked driver.
Signed-off-by: Jakub Kicinski <kuba@kernel•org>
---
drivers/scsi/bnx2fc/bnx2fc_fcoe.c | 3 +++
drivers/scsi/fcoe/fcoe.c | 6 ++++--
drivers/scsi/fcoe/fcoe_transport.c | 4 +++-
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index 26e0ff380860..c95b084cad69 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -17,6 +17,7 @@
#include "bnx2fc.h"
#include <linux/ethtool.h>
+#include <net/netdev_lock.h>
static struct list_head adapter_list;
static struct list_head if_list;
@@ -815,7 +816,9 @@ static int bnx2fc_net_config(struct fc_lport *lport, struct net_device *netdev)
port->fcoe_pending_queue_active = 0;
timer_setup(&port->timer, fcoe_queue_timer, 0);
+ netdev_lock_ops(netdev);
fcoe_link_speed_update(lport);
+ netdev_unlock_ops(netdev);
if (!lport->vport) {
if (fcoe_get_wwn(netdev, &wwnn, NETDEV_FCOE_WWNN))
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 534596c6d76c..438ac7c3a9e3 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -25,6 +25,7 @@
#include <scsi/scsicam.h>
#include <scsi/scsi_transport.h>
#include <scsi/scsi_transport_fc.h>
+#include <net/netdev_lock.h>
#include <net/rtnetlink.h>
#include <scsi/fc/fc_encaps.h>
@@ -737,7 +738,9 @@ static int fcoe_netdev_config(struct fc_lport *lport, struct net_device *netdev)
port->fcoe_pending_queue_active = 0;
timer_setup(&port->timer, fcoe_queue_timer, 0);
+ netdev_lock_ops(netdev);
fcoe_link_speed_update(lport);
+ netdev_unlock_ops(netdev);
if (!lport->vport) {
if (fcoe_get_wwn(netdev, &wwnn, NETDEV_FCOE_WWNN))
@@ -1841,6 +1844,7 @@ static int fcoe_device_notification(struct notifier_block *notifier,
break;
case NETDEV_UP:
case NETDEV_CHANGE:
+ fcoe_link_speed_update(lport);
break;
case NETDEV_CHANGEMTU:
if (netdev->fcoe_mtu)
@@ -1871,8 +1875,6 @@ static int fcoe_device_notification(struct notifier_block *notifier,
"from netdev netlink\n", event);
}
- fcoe_link_speed_update(lport);
-
cdev = fcoe_ctlr_to_ctlr_dev(ctlr);
if (link_possible && !fcoe_link_ok(lport)) {
diff --git a/drivers/scsi/fcoe/fcoe_transport.c b/drivers/scsi/fcoe/fcoe_transport.c
index 88d85fc9a52a..2bbb9a38e61d 100644
--- a/drivers/scsi/fcoe/fcoe_transport.c
+++ b/drivers/scsi/fcoe/fcoe_transport.c
@@ -111,6 +111,8 @@ static inline u32 eth2fc_speed(u32 eth_port_speed)
* fcoe_link_speed_update() - Update the supported and actual link speeds
* @lport: The local port to update speeds for
*
+ * Caller must hold the netdev's ops lock.
+ *
* Returns: 0 if the ethtool query was successful
* -1 if the ethtool query failed
*/
@@ -119,7 +121,7 @@ int fcoe_link_speed_update(struct fc_lport *lport)
struct net_device *netdev = fcoe_get_netdev(lport);
struct ethtool_link_ksettings ecmd;
- if (!__ethtool_get_link_ksettings(netdev, &ecmd)) {
+ if (!netif_get_link_ksettings(netdev, &ecmd)) {
lport->link_supported_speeds &= ~(FC_PORTSPEED_1GBIT |
FC_PORTSPEED_10GBIT |
FC_PORTSPEED_20GBIT |
--
2.54.0
next prev parent reply other threads:[~2026-06-03 1:29 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-03 1:28 [PATCH net-next v2 00/11] net: ethtool: make sure __ethtool_get_link_ksettings() is ops-locked Jakub Kicinski
2026-06-03 1:28 ` [PATCH net-next v2 01/11] net: rename netdev_ops_assert_locked() Jakub Kicinski
2026-06-03 7:29 ` Nicolai Buchwitz
2026-06-03 11:15 ` Jakub Sitnicki
2026-06-03 17:05 ` Stanislav Fomichev
2026-06-03 1:28 ` [PATCH net-next v2 02/11] net: ethtool: cmis_cdb: hold instance lock for ops locked devices Jakub Kicinski
2026-06-03 17:06 ` Stanislav Fomichev
2026-06-03 1:28 ` [PATCH net-next v2 03/11] net: document NETDEV_CHANGENAME as ops locked Jakub Kicinski
2026-06-03 12:47 ` Jakub Sitnicki
2026-06-03 17:06 ` Stanislav Fomichev
2026-06-03 1:28 ` [PATCH net-next v2 04/11] net: ethtool: add netif_get_link_ksettings() for correct ops-locked use Jakub Kicinski
2026-06-03 6:40 ` Maxime Chevallier
2026-06-03 17:06 ` Stanislav Fomichev
2026-06-03 1:28 ` [PATCH net-next v2 05/11] net: bonding: don't recurse on the slave's netdev ops lock Jakub Kicinski
2026-06-03 7:20 ` Nicolai Buchwitz
2026-06-03 1:28 ` [PATCH net-next v2 06/11] net: team: don't recurse on the port's " Jakub Kicinski
2026-06-03 1:28 ` [PATCH net-next v2 07/11] net: bridge: " Jakub Kicinski
2026-06-03 7:16 ` Nicolai Buchwitz
2026-06-03 7:54 ` Nikolay Aleksandrov
2026-06-03 13:28 ` Ido Schimmel
2026-06-03 1:28 ` [PATCH net-next v2 08/11] net: sched: don't recurse on the netdev ops lock in qdiscs Jakub Kicinski
2026-06-04 23:38 ` Vinicius Costa Gomes
2026-06-03 1:28 ` [PATCH net-next v2 09/11] leds: trigger: netdev: don't recurse on the netdev ops lock Jakub Kicinski
2026-06-03 1:28 ` Jakub Kicinski [this message]
2026-06-03 1:28 ` [PATCH net-next v2 11/11] net: ethtool: make sure __ethtool_get_link_ksettings() is ops-locked Jakub Kicinski
2026-06-03 7:18 ` Nicolai Buchwitz
2026-06-03 17:06 ` Stanislav Fomichev
2026-06-04 21:30 ` [PATCH net-next v2 00/11] " patchwork-bot+netdevbpf
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=20260603012840.2254293-11-kuba@kernel.org \
--to=kuba@kernel$(echo .)org \
--cc=andrew+netdev@lunn$(echo .)ch \
--cc=danieller@nvidia$(echo .)com \
--cc=davem@davemloft$(echo .)net \
--cc=edumazet@google$(echo .)com \
--cc=hare@suse$(echo .)de \
--cc=horms@kernel$(echo .)org \
--cc=idosch@nvidia$(echo .)com \
--cc=jakub@cloudflare$(echo .)com \
--cc=jhasan@marvell$(echo .)com \
--cc=jhs@mojatatu$(echo .)com \
--cc=jv@jvosburgh$(echo .)net \
--cc=lee@kernel$(echo .)org \
--cc=linux-leds@vger$(echo .)kernel.org \
--cc=maxime.chevallier@bootlin$(echo .)com \
--cc=michael.chan@broadcom$(echo .)com \
--cc=nb@tipi-net$(echo .)de \
--cc=netdev@vger$(echo .)kernel.org \
--cc=pabeni@redhat$(echo .)com \
--cc=pavel@kernel$(echo .)org \
--cc=razor@blackwall$(echo .)org \
--cc=vinicius.gomes@intel$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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