From: Tariq Toukan <tariqt@nvidia.com>
To: Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>
Cc: Saeed Mahameed <saeedm@nvidia.com>,
Leon Romanovsky <leon@kernel.org>,
Tariq Toukan <tariqt@nvidia.com>, Mark Bloch <mbloch@nvidia.com>,
"Moshe Shemesh" <moshe@nvidia.com>,
Akiva Goldberger <agoldberger@nvidia.com>,
<netdev@vger.kernel.org>, <linux-rdma@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, Gal Pressman <gal@nvidia.com>,
Dragos Tatulea <dtatulea@nvidia.com>
Subject: [PATCH net-next 7/8] net/mlx5: Use vport helper for IPsec eswitch set caps
Date: Sun, 10 May 2026 08:34:47 +0300 [thread overview]
Message-ID: <20260510053448.326823-8-tariqt@nvidia.com> (raw)
In-Reply-To: <20260510053448.326823-1-tariqt@nvidia.com>
From: Moshe Shemesh <moshe@nvidia.com>
Use mlx5_vport_set_other_func_cap() and
mlx5_vport_set_other_func_general_cap() in the IPsec eswitch functions
instead of open-coding the SET_HCA_CAP command. This removes redundant
buffer allocation and boilerplate, and also enables vhca_id based
addressing when supported.
Signed-off-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
---
.../ethernet/mellanox/mlx5/core/esw/ipsec.c | 81 ++++++-------------
1 file changed, 23 insertions(+), 58 deletions(-)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c
index b830ccd91e62..2b5765ab60d1 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/ipsec.c
@@ -81,38 +81,25 @@ int mlx5_esw_ipsec_vf_offload_get(struct mlx5_core_dev *dev, struct mlx5_vport *
static int esw_ipsec_vf_set_generic(struct mlx5_core_dev *dev, u16 vport_num, bool ipsec_ofld)
{
int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
- int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
- void *hca_cap, *query_cap, *cap;
+ void *query_cap, *hca_caps;
int ret;
if (!MLX5_CAP_GEN(dev, vhca_resource_manager))
return -EOPNOTSUPP;
query_cap = kvzalloc(query_sz, GFP_KERNEL);
- hca_cap = kvzalloc(set_sz, GFP_KERNEL);
- if (!hca_cap || !query_cap) {
- ret = -ENOMEM;
- goto free;
- }
+ if (!query_cap)
+ return -ENOMEM;
ret = mlx5_vport_get_other_func_general_cap(dev, vport_num, query_cap);
if (ret)
goto free;
- cap = MLX5_ADDR_OF(set_hca_cap_in, hca_cap, capability);
- memcpy(cap, MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability),
- MLX5_UN_SZ_BYTES(hca_cap_union));
- MLX5_SET(cmd_hca_cap, cap, ipsec_offload, ipsec_ofld);
+ hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability);
+ MLX5_SET(cmd_hca_cap, hca_caps, ipsec_offload, ipsec_ofld);
- MLX5_SET(set_hca_cap_in, hca_cap, opcode, MLX5_CMD_OP_SET_HCA_CAP);
- MLX5_SET(set_hca_cap_in, hca_cap, other_function, 1);
- MLX5_SET(set_hca_cap_in, hca_cap, function_id, vport_num);
-
- MLX5_SET(set_hca_cap_in, hca_cap, op_mod,
- MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE << 1);
- ret = mlx5_cmd_exec_in(dev, set_hca_cap, hca_cap);
+ ret = mlx5_vport_set_other_func_general_cap(dev, hca_caps, vport_num);
free:
- kvfree(hca_cap);
kvfree(query_cap);
return ret;
}
@@ -121,49 +108,37 @@ static int esw_ipsec_vf_set_bytype(struct mlx5_core_dev *dev, struct mlx5_vport
bool enable, enum esw_vport_ipsec_offload type)
{
int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
- int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
- void *hca_cap, *query_cap, *cap;
+ void *query_cap, *hca_caps;
int ret;
if (!MLX5_CAP_GEN(dev, vhca_resource_manager))
return -EOPNOTSUPP;
query_cap = kvzalloc(query_sz, GFP_KERNEL);
- hca_cap = kvzalloc(set_sz, GFP_KERNEL);
- if (!hca_cap || !query_cap) {
- ret = -ENOMEM;
- goto free;
- }
+ if (!query_cap)
+ return -ENOMEM;
ret = mlx5_vport_get_other_func_cap(dev, vport->vport, query_cap, MLX5_CAP_IPSEC);
if (ret)
goto free;
- cap = MLX5_ADDR_OF(set_hca_cap_in, hca_cap, capability);
- memcpy(cap, MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability),
- MLX5_UN_SZ_BYTES(hca_cap_union));
+ hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability);
switch (type) {
case MLX5_ESW_VPORT_IPSEC_CRYPTO_OFFLOAD:
- MLX5_SET(ipsec_cap, cap, ipsec_crypto_offload, enable);
+ MLX5_SET(ipsec_cap, hca_caps, ipsec_crypto_offload, enable);
break;
case MLX5_ESW_VPORT_IPSEC_PACKET_OFFLOAD:
- MLX5_SET(ipsec_cap, cap, ipsec_full_offload, enable);
+ MLX5_SET(ipsec_cap, hca_caps, ipsec_full_offload, enable);
break;
default:
ret = -EOPNOTSUPP;
goto free;
}
- MLX5_SET(set_hca_cap_in, hca_cap, opcode, MLX5_CMD_OP_SET_HCA_CAP);
- MLX5_SET(set_hca_cap_in, hca_cap, other_function, 1);
- MLX5_SET(set_hca_cap_in, hca_cap, function_id, vport->vport);
-
- MLX5_SET(set_hca_cap_in, hca_cap, op_mod,
- MLX5_SET_HCA_CAP_OP_MOD_IPSEC << 1);
- ret = mlx5_cmd_exec_in(dev, set_hca_cap, hca_cap);
+ ret = mlx5_vport_set_other_func_cap(dev, hca_caps, vport->vport,
+ MLX5_SET_HCA_CAP_OP_MOD_IPSEC);
free:
- kvfree(hca_cap);
kvfree(query_cap);
return ret;
}
@@ -171,34 +146,24 @@ static int esw_ipsec_vf_set_bytype(struct mlx5_core_dev *dev, struct mlx5_vport
static int esw_ipsec_vf_crypto_aux_caps_set(struct mlx5_core_dev *dev, u16 vport_num, bool enable)
{
int query_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
- int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
- struct mlx5_eswitch *esw = dev->priv.eswitch;
- void *hca_cap, *query_cap, *cap;
+ void *query_cap, *hca_caps;
int ret;
query_cap = kvzalloc(query_sz, GFP_KERNEL);
- hca_cap = kvzalloc(set_sz, GFP_KERNEL);
- if (!hca_cap || !query_cap) {
- ret = -ENOMEM;
- goto free;
- }
+ if (!query_cap)
+ return -ENOMEM;
ret = mlx5_vport_get_other_func_cap(dev, vport_num, query_cap, MLX5_CAP_ETHERNET_OFFLOADS);
if (ret)
goto free;
- cap = MLX5_ADDR_OF(set_hca_cap_in, hca_cap, capability);
- memcpy(cap, MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability),
- MLX5_UN_SZ_BYTES(hca_cap_union));
- MLX5_SET(per_protocol_networking_offload_caps, cap, insert_trailer, enable);
- MLX5_SET(set_hca_cap_in, hca_cap, opcode, MLX5_CMD_OP_SET_HCA_CAP);
- MLX5_SET(set_hca_cap_in, hca_cap, other_function, 1);
- MLX5_SET(set_hca_cap_in, hca_cap, function_id, vport_num);
- MLX5_SET(set_hca_cap_in, hca_cap, op_mod,
- MLX5_SET_HCA_CAP_OP_MOD_ETHERNET_OFFLOADS << 1);
- ret = mlx5_cmd_exec_in(esw->dev, set_hca_cap, hca_cap);
+ hca_caps = MLX5_ADDR_OF(query_hca_cap_out, query_cap, capability);
+ MLX5_SET(per_protocol_networking_offload_caps, hca_caps,
+ insert_trailer, enable);
+
+ ret = mlx5_vport_set_other_func_cap(dev, hca_caps, vport_num,
+ MLX5_SET_HCA_CAP_OP_MOD_ETHERNET_OFFLOADS);
free:
- kvfree(hca_cap);
kvfree(query_cap);
return ret;
}
--
2.44.0
next prev parent reply other threads:[~2026-05-10 5:36 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-10 5:34 [PATCH net-next 0/8] net/mlx5: Prepare eswitch infrastructure for satellite PF support Tariq Toukan
2026-05-10 5:34 ` [PATCH net-next 1/8] net/mlx5: Use helper to parse host PF info Tariq Toukan
2026-05-14 19:19 ` Simon Horman
2026-05-10 5:34 ` [PATCH net-next 2/8] net/mlx5: Use v1 response layout for query_esw_functions Tariq Toukan
2026-05-14 19:18 ` Simon Horman
2026-05-10 5:34 ` [PATCH net-next 3/8] net/mlx5: Use mlx5_eswitch_is_vf_vport() for IPsec VF checks Tariq Toukan
2026-05-10 5:34 ` [PATCH net-next 4/8] net/mlx5: Switch vport HCA cap helpers to kvzalloc Tariq Toukan
2026-05-10 5:34 ` [PATCH net-next 5/8] net/mlx5: Add mlx5_vport_set_other_func_general_cap macro Tariq Toukan
2026-05-10 5:34 ` [PATCH net-next 6/8] net/mlx5: Refactor mlx5_set_msix_vec_count() SET_HCA_CAP Tariq Toukan
2026-05-10 5:34 ` Tariq Toukan [this message]
2026-05-10 5:34 ` [PATCH net-next 8/8] net/mlx5: Generalize enable/disable HCA for any PF vport Tariq Toukan
2026-05-14 2:25 ` [PATCH net-next 0/8] net/mlx5: Prepare eswitch infrastructure for satellite PF support Jakub Kicinski
2026-05-14 7:56 ` Moshe Shemesh
2026-05-14 9:53 ` Paolo Abeni
2026-05-14 9:59 ` Paolo Abeni
2026-05-14 23:16 ` Jakub Kicinski
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=20260510053448.326823-8-tariqt@nvidia.com \
--to=tariqt@nvidia.com \
--cc=agoldberger@nvidia.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=dtatulea@nvidia.com \
--cc=edumazet@google.com \
--cc=gal@nvidia.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=mbloch@nvidia.com \
--cc=moshe@nvidia.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=saeedm@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.