mirror of https://gitee.com/openkylin/linux.git
net/mlx5e: Fail safe cqe compressing/moderation mode setting
Use the new fail-safe channels switch mechanism to set new CQE compressing and CQE moderation mode settings. We also move RX CQE compression modify function out of en_rx file to a more appropriate place. Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
This commit is contained in:
parent
546f18ed3f
commit
be7e87f92b
|
@ -833,7 +833,7 @@ void mlx5e_pps_event_handler(struct mlx5e_priv *priv,
|
||||||
struct ptp_clock_event *event);
|
struct ptp_clock_event *event);
|
||||||
int mlx5e_hwstamp_set(struct net_device *dev, struct ifreq *ifr);
|
int mlx5e_hwstamp_set(struct net_device *dev, struct ifreq *ifr);
|
||||||
int mlx5e_hwstamp_get(struct net_device *dev, struct ifreq *ifr);
|
int mlx5e_hwstamp_get(struct net_device *dev, struct ifreq *ifr);
|
||||||
void mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool val);
|
int mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool val);
|
||||||
|
|
||||||
int mlx5e_vlan_rx_add_vid(struct net_device *dev, __always_unused __be16 proto,
|
int mlx5e_vlan_rx_add_vid(struct net_device *dev, __always_unused __be16 proto,
|
||||||
u16 vid);
|
u16 vid);
|
||||||
|
|
|
@ -90,6 +90,7 @@ int mlx5e_hwstamp_set(struct net_device *dev, struct ifreq *ifr)
|
||||||
{
|
{
|
||||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||||
struct hwtstamp_config config;
|
struct hwtstamp_config config;
|
||||||
|
int err;
|
||||||
|
|
||||||
if (!MLX5_CAP_GEN(priv->mdev, device_frequency_khz))
|
if (!MLX5_CAP_GEN(priv->mdev, device_frequency_khz))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
@ -129,7 +130,12 @@ int mlx5e_hwstamp_set(struct net_device *dev, struct ifreq *ifr)
|
||||||
case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
|
case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
|
||||||
/* Disable CQE compression */
|
/* Disable CQE compression */
|
||||||
netdev_warn(dev, "Disabling cqe compression");
|
netdev_warn(dev, "Disabling cqe compression");
|
||||||
mlx5e_modify_rx_cqe_compression_locked(priv, false);
|
err = mlx5e_modify_rx_cqe_compression_locked(priv, false);
|
||||||
|
if (err) {
|
||||||
|
netdev_err(dev, "Failed disabling cqe compression err=%d\n", err);
|
||||||
|
mutex_unlock(&priv->state_lock);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
config.rx_filter = HWTSTAMP_FILTER_ALL;
|
config.rx_filter = HWTSTAMP_FILTER_ALL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1474,10 +1474,10 @@ static int set_pflag_rx_cqe_based_moder(struct net_device *netdev, bool enable)
|
||||||
{
|
{
|
||||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||||
struct mlx5_core_dev *mdev = priv->mdev;
|
struct mlx5_core_dev *mdev = priv->mdev;
|
||||||
|
struct mlx5e_channels new_channels = {};
|
||||||
bool rx_mode_changed;
|
bool rx_mode_changed;
|
||||||
u8 rx_cq_period_mode;
|
u8 rx_cq_period_mode;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
bool reset;
|
|
||||||
|
|
||||||
rx_cq_period_mode = enable ?
|
rx_cq_period_mode = enable ?
|
||||||
MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
|
MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
|
||||||
|
@ -1491,16 +1491,51 @@ static int set_pflag_rx_cqe_based_moder(struct net_device *netdev, bool enable)
|
||||||
if (!rx_mode_changed)
|
if (!rx_mode_changed)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
reset = test_bit(MLX5E_STATE_OPENED, &priv->state);
|
new_channels.params = priv->channels.params;
|
||||||
if (reset)
|
mlx5e_set_rx_cq_mode_params(&new_channels.params, rx_cq_period_mode);
|
||||||
mlx5e_close_locked(netdev);
|
|
||||||
|
|
||||||
mlx5e_set_rx_cq_mode_params(&priv->channels.params, rx_cq_period_mode);
|
if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
|
||||||
|
priv->channels.params = new_channels.params;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (reset)
|
err = mlx5e_open_channels(priv, &new_channels);
|
||||||
err = mlx5e_open_locked(netdev);
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
return err;
|
mlx5e_switch_priv_channels(priv, &new_channels);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool new_val)
|
||||||
|
{
|
||||||
|
bool curr_val = MLX5E_GET_PFLAG(&priv->channels.params, MLX5E_PFLAG_RX_CQE_COMPRESS);
|
||||||
|
struct mlx5e_channels new_channels = {};
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
if (!MLX5_CAP_GEN(priv->mdev, cqe_compression))
|
||||||
|
return new_val ? -EOPNOTSUPP : 0;
|
||||||
|
|
||||||
|
if (curr_val == new_val)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
new_channels.params = priv->channels.params;
|
||||||
|
MLX5E_SET_PFLAG(&new_channels.params, MLX5E_PFLAG_RX_CQE_COMPRESS, new_val);
|
||||||
|
|
||||||
|
mlx5e_set_rq_type_params(priv->mdev, &new_channels.params,
|
||||||
|
new_channels.params.rq_wq_type);
|
||||||
|
|
||||||
|
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);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_pflag_rx_cqe_compress(struct net_device *netdev,
|
static int set_pflag_rx_cqe_compress(struct net_device *netdev,
|
||||||
|
@ -1519,8 +1554,6 @@ static int set_pflag_rx_cqe_compress(struct net_device *netdev,
|
||||||
|
|
||||||
mlx5e_modify_rx_cqe_compression_locked(priv, enable);
|
mlx5e_modify_rx_cqe_compression_locked(priv, enable);
|
||||||
priv->channels.params.rx_cqe_compress_def = enable;
|
priv->channels.params.rx_cqe_compress_def = enable;
|
||||||
mlx5e_set_rq_type_params(priv->mdev, &priv->channels.params,
|
|
||||||
priv->channels.params.rq_wq_type);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,28 +156,6 @@ static inline u32 mlx5e_decompress_cqes_start(struct mlx5e_rq *rq,
|
||||||
return mlx5e_decompress_cqes_cont(rq, cq, 1, budget_rem) - 1;
|
return mlx5e_decompress_cqes_cont(rq, cq, 1, budget_rem) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool val)
|
|
||||||
{
|
|
||||||
bool was_opened;
|
|
||||||
|
|
||||||
if (!MLX5_CAP_GEN(priv->mdev, cqe_compression))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (MLX5E_GET_PFLAG(&priv->channels.params, MLX5E_PFLAG_RX_CQE_COMPRESS) == val)
|
|
||||||
return;
|
|
||||||
|
|
||||||
was_opened = test_bit(MLX5E_STATE_OPENED, &priv->state);
|
|
||||||
if (was_opened)
|
|
||||||
mlx5e_close_locked(priv->netdev);
|
|
||||||
|
|
||||||
MLX5E_SET_PFLAG(&priv->channels.params, MLX5E_PFLAG_RX_CQE_COMPRESS, val);
|
|
||||||
mlx5e_set_rq_type_params(priv->mdev, &priv->channels.params,
|
|
||||||
priv->channels.params.rq_wq_type);
|
|
||||||
|
|
||||||
if (was_opened)
|
|
||||||
mlx5e_open_locked(priv->netdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RQ_PAGE_SIZE(rq) ((1 << rq->buff.page_order) << PAGE_SHIFT)
|
#define RQ_PAGE_SIZE(rq) ((1 << rq->buff.page_order) << PAGE_SHIFT)
|
||||||
|
|
||||||
static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq,
|
static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq,
|
||||||
|
|
Loading…
Reference in New Issue