142 lines
5.2 KiB
Diff
142 lines
5.2 KiB
Diff
From ccdbf67ee58fe08fc65b7fa79731868afdf21c63 Mon Sep 17 00:00:00 2001
|
|
From: Kamal Heib <kheib@redhat.com>
|
|
Date: Wed, 22 Apr 2026 09:42:15 -0400
|
|
Subject: [PATCH] net/mlx5e: Support ethtool tcp-data-split settings
|
|
|
|
JIRA: https://redhat.atlassian.net/browse/RHEL-169055
|
|
Conflicts:
|
|
Add "#include <linux/ethtool_netlink.h>" to avoid build failure.
|
|
|
|
commit 46bcce5dfd330c233e59cd5efd7eb43f049b0a82
|
|
Author: Saeed Mahameed <saeedm@nvidia.com>
|
|
Date: Mon Jun 16 17:14:40 2025 +0300
|
|
|
|
net/mlx5e: Support ethtool tcp-data-split settings
|
|
|
|
In mlx5, tcp header-data split requires HW GRO to be on.
|
|
|
|
Enabling it fails when HW GRO is off.
|
|
mlx5e_fix_features now keeps HW GRO on when tcp data split is enabled.
|
|
Finally, when tcp data split is disabled, features are updated to maybe
|
|
remove the forced HW GRO.
|
|
|
|
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
|
|
Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
|
|
Reviewed-by: Dragos Tatulea <dtatulea@nvidia.com>
|
|
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
|
|
Signed-off-by: Mark Bloch <mbloch@nvidia.com>
|
|
Link: https://patch.msgid.link/20250616141441.1243044-12-mbloch@nvidia.com
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
|
|
Signed-off-by: Kamal Heib <kheib@redhat.com>
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
|
|
index e6c9338ddae8..ff0b9ab2daa0 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
|
|
@@ -32,6 +32,7 @@
|
|
|
|
#include <linux/dim.h>
|
|
#include <linux/ethtool_netlink.h>
|
|
+#include <net/netdev_queues.h>
|
|
|
|
#include "en.h"
|
|
#include "en/channels.h"
|
|
@@ -365,11 +366,6 @@ void mlx5e_ethtool_get_ringparam(struct mlx5e_priv *priv,
|
|
param->tx_max_pending = 1 << MLX5E_PARAMS_MAXIMUM_LOG_SQ_SIZE;
|
|
param->rx_pending = 1 << priv->channels.params.log_rq_mtu_frames;
|
|
param->tx_pending = 1 << priv->channels.params.log_sq_size;
|
|
-
|
|
- kernel_param->tcp_data_split =
|
|
- (priv->channels.params.packet_merge.type == MLX5E_PACKET_MERGE_SHAMPO) ?
|
|
- ETHTOOL_TCP_DATA_SPLIT_ENABLED :
|
|
- ETHTOOL_TCP_DATA_SPLIT_DISABLED;
|
|
}
|
|
|
|
static void mlx5e_get_ringparam(struct net_device *dev,
|
|
@@ -382,6 +378,27 @@ static void mlx5e_get_ringparam(struct net_device *dev,
|
|
mlx5e_ethtool_get_ringparam(priv, param, kernel_param);
|
|
}
|
|
|
|
+static bool mlx5e_ethtool_set_tcp_data_split(struct mlx5e_priv *priv,
|
|
+ u8 tcp_data_split,
|
|
+ struct netlink_ext_ack *extack)
|
|
+{
|
|
+ struct net_device *dev = priv->netdev;
|
|
+
|
|
+ if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED &&
|
|
+ !(dev->features & NETIF_F_GRO_HW)) {
|
|
+ NL_SET_ERR_MSG_MOD(extack,
|
|
+ "TCP-data-split is not supported when GRO HW is disabled");
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ /* Might need to disable HW-GRO if it was kept on due to hds. */
|
|
+ if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_DISABLED &&
|
|
+ dev->cfg->hds_config == ETHTOOL_TCP_DATA_SPLIT_ENABLED)
|
|
+ netdev_update_features(priv->netdev);
|
|
+
|
|
+ return true;
|
|
+}
|
|
+
|
|
int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
|
|
struct ethtool_ringparam *param,
|
|
struct netlink_ext_ack *extack)
|
|
@@ -440,6 +457,11 @@ static int mlx5e_set_ringparam(struct net_device *dev,
|
|
{
|
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
|
|
|
+ if (!mlx5e_ethtool_set_tcp_data_split(priv,
|
|
+ kernel_param->tcp_data_split,
|
|
+ extack))
|
|
+ return -EINVAL;
|
|
+
|
|
return mlx5e_ethtool_set_ringparam(priv, param, extack);
|
|
}
|
|
|
|
@@ -2645,6 +2667,7 @@ const struct ethtool_ops mlx5e_ethtool_ops = {
|
|
ETHTOOL_COALESCE_USE_ADAPTIVE |
|
|
ETHTOOL_COALESCE_USE_CQE,
|
|
.supported_input_xfrm = RXH_XFRM_SYM_OR_XOR,
|
|
+ .supported_ring_params = ETHTOOL_RING_USE_TCP_DATA_SPLIT,
|
|
.get_drvinfo = mlx5e_get_drvinfo,
|
|
.get_link = ethtool_op_get_link,
|
|
.get_link_ext_state = mlx5e_get_link_ext_state,
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
index 9330d90c1f03..4bbf10174fe8 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
@@ -39,6 +39,7 @@
|
|
#include <linux/debugfs.h>
|
|
#include <linux/if_bridge.h>
|
|
#include <linux/filter.h>
|
|
+#include <linux/ethtool_netlink.h>
|
|
#include <net/netdev_queues.h>
|
|
#include <net/netdev_rx_queue.h>
|
|
#include <net/page_pool/types.h>
|
|
@@ -4392,6 +4393,7 @@ static netdev_features_t mlx5e_fix_uplink_rep_features(struct net_device *netdev
|
|
static netdev_features_t mlx5e_fix_features(struct net_device *netdev,
|
|
netdev_features_t features)
|
|
{
|
|
+ struct netdev_config *cfg = netdev->cfg_pending;
|
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
struct mlx5e_vlan_table *vlan;
|
|
struct mlx5e_params *params;
|
|
@@ -4458,6 +4460,13 @@ static netdev_features_t mlx5e_fix_features(struct net_device *netdev,
|
|
}
|
|
}
|
|
|
|
+ /* The header-data split ring param requires HW GRO to stay enabled. */
|
|
+ if (cfg && cfg->hds_config == ETHTOOL_TCP_DATA_SPLIT_ENABLED &&
|
|
+ !(features & NETIF_F_GRO_HW)) {
|
|
+ netdev_warn(netdev, "Keeping HW-GRO enabled, TCP header-data split depends on it\n");
|
|
+ features |= NETIF_F_GRO_HW;
|
|
+ }
|
|
+
|
|
if (mlx5e_is_uplink_rep(priv)) {
|
|
features = mlx5e_fix_uplink_rep_features(netdev, features);
|
|
netdev->netns_immutable = true;
|
|
--
|
|
2.50.1 (Apple Git-155)
|
|
|