mirror of https://gitee.com/openkylin/linux.git
net/mlx5e: Add ethtool priv-flag for Striding RQ
Add a control private flag in ethtool to enable/disable Striding RQ feature. Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
2a0f561bf8
commit
2ccb0a7901
|
@ -205,12 +205,14 @@ static const char mlx5e_priv_flags[][ETH_GSTRING_LEN] = {
|
||||||
"rx_cqe_moder",
|
"rx_cqe_moder",
|
||||||
"tx_cqe_moder",
|
"tx_cqe_moder",
|
||||||
"rx_cqe_compress",
|
"rx_cqe_compress",
|
||||||
|
"rx_striding_rq",
|
||||||
};
|
};
|
||||||
|
|
||||||
enum mlx5e_priv_flag {
|
enum mlx5e_priv_flag {
|
||||||
MLX5E_PFLAG_RX_CQE_BASED_MODER = (1 << 0),
|
MLX5E_PFLAG_RX_CQE_BASED_MODER = (1 << 0),
|
||||||
MLX5E_PFLAG_TX_CQE_BASED_MODER = (1 << 1),
|
MLX5E_PFLAG_TX_CQE_BASED_MODER = (1 << 1),
|
||||||
MLX5E_PFLAG_RX_CQE_COMPRESS = (1 << 2),
|
MLX5E_PFLAG_RX_CQE_COMPRESS = (1 << 2),
|
||||||
|
MLX5E_PFLAG_RX_STRIDING_RQ = (1 << 3),
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MLX5E_SET_PFLAG(params, pflag, enable) \
|
#define MLX5E_SET_PFLAG(params, pflag, enable) \
|
||||||
|
@ -827,6 +829,10 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq);
|
||||||
void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq);
|
void mlx5e_free_txqsq_descs(struct mlx5e_txqsq *sq);
|
||||||
void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq);
|
void mlx5e_free_xdpsq_descs(struct mlx5e_xdpsq *sq);
|
||||||
|
|
||||||
|
bool mlx5e_check_fragmented_striding_rq_cap(struct mlx5_core_dev *mdev);
|
||||||
|
bool mlx5e_striding_rq_possible(struct mlx5_core_dev *mdev,
|
||||||
|
struct mlx5e_params *params);
|
||||||
|
|
||||||
void mlx5e_page_release(struct mlx5e_rq *rq, struct mlx5e_dma_info *dma_info,
|
void mlx5e_page_release(struct mlx5e_rq *rq, struct mlx5e_dma_info *dma_info,
|
||||||
bool recycle);
|
bool recycle);
|
||||||
void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
|
void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
|
||||||
|
@ -917,6 +923,7 @@ void mlx5e_set_tx_cq_mode_params(struct mlx5e_params *params,
|
||||||
u8 cq_period_mode);
|
u8 cq_period_mode);
|
||||||
void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params,
|
void mlx5e_set_rx_cq_mode_params(struct mlx5e_params *params,
|
||||||
u8 cq_period_mode);
|
u8 cq_period_mode);
|
||||||
|
void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params);
|
||||||
void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev,
|
void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev,
|
||||||
struct mlx5e_params *params);
|
struct mlx5e_params *params);
|
||||||
|
|
||||||
|
|
|
@ -1598,6 +1598,38 @@ static int set_pflag_rx_cqe_compress(struct net_device *netdev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
|
||||||
|
{
|
||||||
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||||
|
struct mlx5_core_dev *mdev = priv->mdev;
|
||||||
|
struct mlx5e_channels new_channels = {};
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (enable) {
|
||||||
|
if (!mlx5e_check_fragmented_striding_rq_cap(mdev))
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
if (!mlx5e_striding_rq_possible(mdev, &priv->channels.params))
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_channels.params = priv->channels.params;
|
||||||
|
|
||||||
|
MLX5E_SET_PFLAG(&new_channels.params, MLX5E_PFLAG_RX_STRIDING_RQ, enable);
|
||||||
|
mlx5e_set_rq_type(mdev, &new_channels.params);
|
||||||
|
|
||||||
|
if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
|
||||||
|
priv->channels.params = new_channels.params;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = mlx5e_open_channels(priv, &new_channels);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
mlx5e_switch_priv_channels(priv, &new_channels, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int mlx5e_handle_pflag(struct net_device *netdev,
|
static int mlx5e_handle_pflag(struct net_device *netdev,
|
||||||
u32 wanted_flags,
|
u32 wanted_flags,
|
||||||
enum mlx5e_priv_flag flag,
|
enum mlx5e_priv_flag flag,
|
||||||
|
@ -1643,6 +1675,12 @@ static int mlx5e_set_priv_flags(struct net_device *netdev, u32 pflags)
|
||||||
err = mlx5e_handle_pflag(netdev, pflags,
|
err = mlx5e_handle_pflag(netdev, pflags,
|
||||||
MLX5E_PFLAG_RX_CQE_COMPRESS,
|
MLX5E_PFLAG_RX_CQE_COMPRESS,
|
||||||
set_pflag_rx_cqe_compress);
|
set_pflag_rx_cqe_compress);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
err = mlx5e_handle_pflag(netdev, pflags,
|
||||||
|
MLX5E_PFLAG_RX_STRIDING_RQ,
|
||||||
|
set_pflag_rx_striding_rq);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&priv->state_lock);
|
mutex_unlock(&priv->state_lock);
|
||||||
|
|
|
@ -71,7 +71,7 @@ struct mlx5e_channel_param {
|
||||||
struct mlx5e_cq_param icosq_cq;
|
struct mlx5e_cq_param icosq_cq;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool mlx5e_check_fragmented_striding_rq_cap(struct mlx5_core_dev *mdev)
|
bool mlx5e_check_fragmented_striding_rq_cap(struct mlx5_core_dev *mdev)
|
||||||
{
|
{
|
||||||
return MLX5_CAP_GEN(mdev, striding_rq) &&
|
return MLX5_CAP_GEN(mdev, striding_rq) &&
|
||||||
MLX5_CAP_GEN(mdev, umr_ptr_rlky) &&
|
MLX5_CAP_GEN(mdev, umr_ptr_rlky) &&
|
||||||
|
@ -132,14 +132,17 @@ void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev,
|
||||||
MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS));
|
MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool slow_pci_heuristic(struct mlx5_core_dev *mdev);
|
bool mlx5e_striding_rq_possible(struct mlx5_core_dev *mdev,
|
||||||
|
struct mlx5e_params *params)
|
||||||
static void mlx5e_set_rq_type(struct mlx5_core_dev *mdev,
|
|
||||||
struct mlx5e_params *params)
|
|
||||||
{
|
{
|
||||||
params->rq_wq_type = mlx5e_check_fragmented_striding_rq_cap(mdev) &&
|
return mlx5e_check_fragmented_striding_rq_cap(mdev) &&
|
||||||
!slow_pci_heuristic(mdev) &&
|
!params->xdp_prog && !MLX5_IPSEC_DEV(mdev);
|
||||||
!params->xdp_prog && !MLX5_IPSEC_DEV(mdev) ?
|
}
|
||||||
|
|
||||||
|
void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params)
|
||||||
|
{
|
||||||
|
params->rq_wq_type = mlx5e_striding_rq_possible(mdev, params) &&
|
||||||
|
MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_STRIDING_RQ) ?
|
||||||
MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ :
|
MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ :
|
||||||
MLX5_WQ_TYPE_LINKED_LIST;
|
MLX5_WQ_TYPE_LINKED_LIST;
|
||||||
}
|
}
|
||||||
|
@ -4027,6 +4030,9 @@ void mlx5e_build_nic_params(struct mlx5_core_dev *mdev,
|
||||||
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS, params->rx_cqe_compress_def);
|
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS, params->rx_cqe_compress_def);
|
||||||
|
|
||||||
/* RQ */
|
/* RQ */
|
||||||
|
if (mlx5e_striding_rq_possible(mdev, params))
|
||||||
|
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_STRIDING_RQ,
|
||||||
|
!slow_pci_heuristic(mdev));
|
||||||
mlx5e_set_rq_type(mdev, params);
|
mlx5e_set_rq_type(mdev, params);
|
||||||
mlx5e_init_rq_type_params(mdev, params);
|
mlx5e_init_rq_type_params(mdev, params);
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,8 @@ static void mlx5i_build_nic_params(struct mlx5_core_dev *mdev,
|
||||||
struct mlx5e_params *params)
|
struct mlx5e_params *params)
|
||||||
{
|
{
|
||||||
/* Override RQ params as IPoIB supports only LINKED LIST RQ for now */
|
/* Override RQ params as IPoIB supports only LINKED LIST RQ for now */
|
||||||
params->rq_wq_type = MLX5_WQ_TYPE_LINKED_LIST;
|
MLX5E_SET_PFLAG(params, MLX5E_PFLAG_RX_STRIDING_RQ, false);
|
||||||
|
mlx5e_set_rq_type(mdev, params);
|
||||||
mlx5e_init_rq_type_params(mdev, params);
|
mlx5e_init_rq_type_params(mdev, params);
|
||||||
|
|
||||||
/* RQ size in ipoib by default is 512 */
|
/* RQ size in ipoib by default is 512 */
|
||||||
|
|
Loading…
Reference in New Issue