net/mlx5e: Use query_special_contexts cmd only once per mdev
Don't query the firmware so many times (num rqs * num wqes * wqe frags)
because it slows down linearly the interface creation time when the
product is larger. Do it only once per mdev and store the result in
mlx5e_param.
Due to helper function being called from different files, move it to
an appropriate location. Rename the function with a proper prefix and
add a small cleanup.
This fix applies only for legacy rq.
Fixes: 1b1e486883
("net/mlx5e: Use query_special_contexts for mkeys")
Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Or Har-Toov <ohartoov@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
341a80de24
commit
1db1f21cae
|
@ -327,6 +327,7 @@ struct mlx5e_params {
|
|||
unsigned int sw_mtu;
|
||||
int hard_mtu;
|
||||
bool ptp_rx;
|
||||
__be32 terminate_lkey_be;
|
||||
};
|
||||
|
||||
static inline u8 mlx5e_get_dcb_num_tc(struct mlx5e_params *params)
|
||||
|
|
|
@ -727,26 +727,6 @@ static void mlx5e_rq_free_shampo(struct mlx5e_rq *rq)
|
|||
mlx5e_rq_shampo_hd_free(rq);
|
||||
}
|
||||
|
||||
static __be32 mlx5e_get_terminate_scatter_list_mkey(struct mlx5_core_dev *dev)
|
||||
{
|
||||
u32 out[MLX5_ST_SZ_DW(query_special_contexts_out)] = {};
|
||||
u32 in[MLX5_ST_SZ_DW(query_special_contexts_in)] = {};
|
||||
int res;
|
||||
|
||||
if (!MLX5_CAP_GEN(dev, terminate_scatter_list_mkey))
|
||||
return MLX5_TERMINATE_SCATTER_LIST_LKEY;
|
||||
|
||||
MLX5_SET(query_special_contexts_in, in, opcode,
|
||||
MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS);
|
||||
res = mlx5_cmd_exec_inout(dev, query_special_contexts, in, out);
|
||||
if (res)
|
||||
return MLX5_TERMINATE_SCATTER_LIST_LKEY;
|
||||
|
||||
res = MLX5_GET(query_special_contexts_out, out,
|
||||
terminate_scatter_list_mkey);
|
||||
return cpu_to_be32(res);
|
||||
}
|
||||
|
||||
static int mlx5e_alloc_rq(struct mlx5e_params *params,
|
||||
struct mlx5e_xsk_param *xsk,
|
||||
struct mlx5e_rq_param *rqp,
|
||||
|
@ -908,7 +888,7 @@ static int mlx5e_alloc_rq(struct mlx5e_params *params,
|
|||
/* check if num_frags is not a pow of two */
|
||||
if (rq->wqe.info.num_frags < (1 << rq->wqe.info.log_num_frags)) {
|
||||
wqe->data[f].byte_count = 0;
|
||||
wqe->data[f].lkey = mlx5e_get_terminate_scatter_list_mkey(mdev);
|
||||
wqe->data[f].lkey = params->terminate_lkey_be;
|
||||
wqe->data[f].addr = 0;
|
||||
}
|
||||
}
|
||||
|
@ -5007,6 +4987,8 @@ void mlx5e_build_nic_params(struct mlx5e_priv *priv, struct mlx5e_xsk *xsk, u16
|
|||
/* RQ */
|
||||
mlx5e_build_rq_params(mdev, params);
|
||||
|
||||
params->terminate_lkey_be = mlx5_core_get_terminate_scatter_list_mkey(mdev);
|
||||
|
||||
params->packet_merge.timeout = mlx5e_choose_lro_timeout(mdev, MLX5E_DEFAULT_LRO_TIMEOUT);
|
||||
|
||||
/* CQ moderation params */
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/mlx5/qp.h>
|
||||
#include "mlx5_core.h"
|
||||
|
||||
int mlx5_core_create_mkey(struct mlx5_core_dev *dev, u32 *mkey, u32 *in,
|
||||
|
@ -122,3 +123,23 @@ int mlx5_core_destroy_psv(struct mlx5_core_dev *dev, int psv_num)
|
|||
return mlx5_cmd_exec_in(dev, destroy_psv, in);
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_core_destroy_psv);
|
||||
|
||||
__be32 mlx5_core_get_terminate_scatter_list_mkey(struct mlx5_core_dev *dev)
|
||||
{
|
||||
u32 out[MLX5_ST_SZ_DW(query_special_contexts_out)] = {};
|
||||
u32 in[MLX5_ST_SZ_DW(query_special_contexts_in)] = {};
|
||||
u32 mkey;
|
||||
|
||||
if (!MLX5_CAP_GEN(dev, terminate_scatter_list_mkey))
|
||||
return MLX5_TERMINATE_SCATTER_LIST_LKEY;
|
||||
|
||||
MLX5_SET(query_special_contexts_in, in, opcode,
|
||||
MLX5_CMD_OP_QUERY_SPECIAL_CONTEXTS);
|
||||
if (mlx5_cmd_exec_inout(dev, query_special_contexts, in, out))
|
||||
return MLX5_TERMINATE_SCATTER_LIST_LKEY;
|
||||
|
||||
mkey = MLX5_GET(query_special_contexts_out, out,
|
||||
terminate_scatter_list_mkey);
|
||||
return cpu_to_be32(mkey);
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_core_get_terminate_scatter_list_mkey);
|
||||
|
|
|
@ -1093,6 +1093,7 @@ void mlx5_cmdif_debugfs_cleanup(struct mlx5_core_dev *dev);
|
|||
int mlx5_core_create_psv(struct mlx5_core_dev *dev, u32 pdn,
|
||||
int npsvs, u32 *sig_index);
|
||||
int mlx5_core_destroy_psv(struct mlx5_core_dev *dev, int psv_num);
|
||||
__be32 mlx5_core_get_terminate_scatter_list_mkey(struct mlx5_core_dev *dev);
|
||||
void mlx5_core_put_rsc(struct mlx5_core_rsc_common *common);
|
||||
int mlx5_query_odp_caps(struct mlx5_core_dev *dev,
|
||||
struct mlx5_odp_caps *odp_caps);
|
||||
|
|
Loading…
Reference in New Issue