From: Dariusz Sosnowski <dsosnowski@nvidia.com>
To: Thomas Monjalon <thomas@monjalon.net>,
Viacheslav Ovsiienko <viacheslavo@nvidia.com>,
Bing Zhao <bingz@nvidia.com>, Ori Kam <orika@nvidia.com>,
Suanming Mou <suanmingm@nvidia.com>,
Matan Azrad <matan@nvidia.com>,
Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Cc: <dev@dpdk.org>, Stephen Hemminger <stephen@networkplumber.org>,
<stable@dpdk.org>, Cosmin Ratiu <cratiu@nvidia.com>
Subject: [PATCH v2 1/2] net/mlx5: fix link status query
Date: Fri, 30 Oct 2026 18:28:42 +0100 [thread overview]
Message-ID: <20261030172843.2304296-2-dsosnowski@nvidia.com> (raw)
In-Reply-To: <20261030172843.2304296-1-dsosnowski@nvidia.com>
Querying link parameters in mlx5 driver is implemented using
either ETHTOOL_GLINKSETTINGS or ETHTOOL_GSET ioctl commands.
Link status reported by the above can be stale, due to a delay
introduced by Linux kernel's linkwatch mechanism.
This patch fixes that by reading link carrier status through
ETHTOOL_GLINK command. This ethtool command,
implemented by mlx5 since kernel 4.14, will always get
the current link status. It also flushes the pending link watch
events, so following ETHTOOL_GLINKSETTINGS/ETHTOOL_GSET will
return actual link carrier status.
Fixes: 17f95513adca ("net/mlx5: fix link status change detection")
Cc: dmitry.kozliuk@gmail.com
Cc: stable@dpdk.org
Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
Signed-off-by: Dariusz Sosnowski <dsosnowski@nvidia.com>
---
.mailmap | 1 +
drivers/net/mlx5/linux/mlx5_ethdev_os.c | 46 ++++++++++++++++++++++---
drivers/net/mlx5/mlx5.h | 1 +
3 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/.mailmap b/.mailmap
index c350b8f2b5..1723ef8fa7 100644
--- a/.mailmap
+++ b/.mailmap
@@ -316,6 +316,7 @@ Congjie Zhou <zcjie0802@qq.com>
Congwen Zhang <zhang.congwen@zte.com.cn>
Conor Fogarty <conor.fogarty@intel.com>
Conor Walsh <conor.walsh@intel.com>
+Cosmin Ratiu <cratiu@nvidia.com>
Cristian Bidea <cristian.bidea@keysight.com>
Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Cristian Sovaiala <cristian.sovaiala@nxp.com>
diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
index f6394ebd19..f30fb6da5c 100644
--- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c
+++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c
@@ -317,6 +317,40 @@ mlx5_find_master_dev(struct rte_eth_dev *dev)
return NULL;
}
+/**
+ * Retrieve the carrier state of a device.
+ *
+ * The IFF_RUNNING flag reported by SIOCGIFFLAGS reflects the RFC 2863
+ * operational state, which the kernel only refreshes from its link watch
+ * work queue and which may therefore lag the actual carrier by up to a
+ * second. ETHTOOL_GLINK reports the carrier directly, and additionally
+ * flushes any link watch event still pending for the device.
+ *
+ * @param dev
+ * Pointer to Ethernet device structure.
+ *
+ * @return
+ * 1 if the carrier is up, 0 otherwise.
+ * Negative errno value is returned on error.
+ */
+int
+mlx5_link_carrier_get(struct rte_eth_dev *dev)
+{
+ struct ethtool_value ecmd = {
+ .cmd = ETHTOOL_GLINK,
+ };
+ struct ifreq ifr = {
+ .ifr_data = (void *)&ecmd,
+ };
+ int ret;
+
+ ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+ if (ret != 0)
+ return ret;
+
+ return !!ecmd.data;
+}
+
/**
* DPDK callback to retrieve physical link information.
*
@@ -347,9 +381,11 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev,
dev->data->port_id, strerror(rte_errno));
return ret;
}
+ ret = mlx5_link_carrier_get(dev);
+ if (ret < 0)
+ return ret;
dev_link = (struct rte_eth_link) {
- .link_status = ((ifr.ifr_flags & IFF_UP) &&
- (ifr.ifr_flags & IFF_RUNNING)),
+ .link_status = ((ifr.ifr_flags & IFF_UP) && ret),
};
ifr = (struct ifreq) {
.ifr_data = (void *)&edata,
@@ -428,9 +464,11 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev,
dev->data->port_id, strerror(rte_errno));
return ret;
}
+ ret = mlx5_link_carrier_get(dev);
+ if (ret < 0)
+ return ret;
dev_link = (struct rte_eth_link) {
- .link_status = ((ifr.ifr_flags & IFF_UP) &&
- (ifr.ifr_flags & IFF_RUNNING)),
+ .link_status = ((ifr.ifr_flags & IFF_UP) && ret),
};
ifr = (struct ifreq) {
.ifr_data = (void *)&gcmd,
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 7923125c5c..5ea49ca807 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -2391,6 +2391,7 @@ int mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu);
int mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu);
int mlx5_read_clock(struct rte_eth_dev *dev, uint64_t *clock);
int mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete);
+int mlx5_link_carrier_get(struct rte_eth_dev *dev);
int mlx5_dev_get_flow_ctrl(struct rte_eth_dev *dev,
struct rte_eth_fc_conf *fc_conf);
int mlx5_dev_set_flow_ctrl(struct rte_eth_dev *dev,
--
2.43.0
next prev parent reply other threads:[~2026-10-30 17:29 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 16:04 [PATCH] net/mlx5: move to polling for LSC interrupts Dariusz Sosnowski
2026-10-26 17:03 ` Stephen Hemminger
2026-10-29 17:21 ` Dariusz Sosnowski
2026-10-26 17:13 ` Stephen Hemminger
2026-10-29 17:19 ` Dariusz Sosnowski
2026-10-30 17:28 ` [PATCH v2 0/2] net/mlx5: improvements to link status handling Dariusz Sosnowski
2026-10-30 17:28 ` Dariusz Sosnowski [this message]
2026-11-05 7:37 ` [PATCH v2 1/2] net/mlx5: fix link status query Raslan Darawsheh
2026-10-30 17:28 ` [PATCH v2 2/2] net/mlx5: move to polling for LSC interrupts Dariusz Sosnowski
2026-11-05 7:37 ` Raslan Darawsheh
2026-11-02 8:07 ` [PATCH v2 0/2] net/mlx5: improvements to link status handling Stephen Hemminger
2026-11-03 11:04 ` Dariusz Sosnowski
2026-11-04 7:29 ` Stephen Hemminger
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=20261030172843.2304296-2-dsosnowski@nvidia.com \
--to=dsosnowski@nvidia.com \
--cc=bingz@nvidia.com \
--cc=cratiu@nvidia.com \
--cc=dev@dpdk.org \
--cc=dmitry.kozliuk@gmail.com \
--cc=matan@nvidia.com \
--cc=orika@nvidia.com \
--cc=stable@dpdk.org \
--cc=stephen@networkplumber.org \
--cc=suanmingm@nvidia.com \
--cc=thomas@monjalon.net \
--cc=viacheslavo@nvidia.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.