net/mlx5e: Improve the MTU change shortcut
authorMaxim Mikityanskiy <maximmi@nvidia.com>
Tue, 27 Sep 2022 20:36:09 +0000 (13:36 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 29 Sep 2022 02:36:38 +0000 (19:36 -0700)
Normally, the MTU change requires reopening the channels, but it can be
skipped if the new MTU doesn't change any of the queue parameters and if
MTU is not used in the data path.

The shortcut is applicable to the non-linear mode of striding RQ,
because the only thing affected by MTU is the queue length. As ethtool
sets the queue length in packets, but striding RQ length is defined in
strides or bytes, we estimate the RQ length to be at least as big as the
requested number of MTU-sized packets, that's why it depends on MTU.

Improve the shortcut by actually checking whether the RQ length stayed
the same, instead of an intermediate step in the calculation.

As MTU also affects the SHAMPO parameters, skip the shortcut if SHAMPO
is in use.

Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en/params.c
drivers/net/ethernet/mellanox/mlx5/core/en/params.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index 5dd3567d02d87089aefa7d2eca9a2e0afb5b6cf0..9a58f8f978b1e18f21dd47e883a7b8b1eece4563 100644 (file)
@@ -57,8 +57,8 @@ static u32 mlx5e_rx_get_linear_stride_sz(struct mlx5e_params *params,
        return roundup_pow_of_two(mlx5e_rx_get_linear_sz_skb(params, false));
 }
 
-u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
-                               struct mlx5e_xsk_param *xsk)
+static u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
+                                      struct mlx5e_xsk_param *xsk)
 {
        u32 linear_stride_sz = mlx5e_rx_get_linear_stride_sz(params, xsk);
 
index 3e148a00fa732638d6e766573793afccee9e91d6..f2c1a23dca61632b113d3cb9a419d2bff9bb5584 100644 (file)
@@ -101,8 +101,6 @@ void mlx5e_init_rq_type_params(struct mlx5_core_dev *mdev, struct mlx5e_params *
 
 u16 mlx5e_get_linear_rq_headroom(struct mlx5e_params *params,
                                 struct mlx5e_xsk_param *xsk);
-u8 mlx5e_mpwqe_log_pkts_per_wqe(struct mlx5e_params *params,
-                               struct mlx5e_xsk_param *xsk);
 bool mlx5e_rx_is_linear_skb(struct mlx5e_params *params,
                            struct mlx5e_xsk_param *xsk);
 bool mlx5e_rx_mpwqe_is_linear_skb(struct mlx5_core_dev *mdev,
index 61f752e88389270c5a8b34c1227f129c105bd72b..0d9a9012e34f13d2bb7d29c7ade6c1bd9dd34b75 100644 (file)
@@ -4080,19 +4080,21 @@ int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
        if (params->packet_merge.type == MLX5E_PACKET_MERGE_LRO)
                reset = false;
 
-       if (params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) {
+       if (params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ &&
+           params->packet_merge.type != MLX5E_PACKET_MERGE_SHAMPO) {
                bool is_linear_old = mlx5e_rx_mpwqe_is_linear_skb(priv->mdev, params, NULL);
                bool is_linear_new = mlx5e_rx_mpwqe_is_linear_skb(priv->mdev,
                                                                  &new_params, NULL);
-               u8 ppw_old = mlx5e_mpwqe_log_pkts_per_wqe(params, NULL);
-               u8 ppw_new = mlx5e_mpwqe_log_pkts_per_wqe(&new_params, NULL);
+               u8 sz_old = mlx5e_mpwqe_get_log_rq_size(params, NULL);
+               u8 sz_new = mlx5e_mpwqe_get_log_rq_size(&new_params, NULL);
 
                /* Always reset in linear mode - hw_mtu is used in data path.
                 * Check that the mode was non-linear and didn't change.
                 * If XSK is active, XSK RQs are linear.
+                * Reset if the RQ size changed, even if it's non-linear.
                 */
                if (!is_linear_old && !is_linear_new && !priv->xsk.refcnt &&
-                   ppw_old == ppw_new)
+                   sz_old == sz_new)
                        reset = false;
        }