net/mlx5e: xsk: Account for XSK RQ UMRs when calculating ICOSQ size
authorMaxim Mikityanskiy <maximmi@nvidia.com>
Mon, 30 May 2022 18:06:03 +0000 (21:06 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 28 Jul 2022 20:44:26 +0000 (13:44 -0700)
ICOSQ is used to post UMR WQEs for both regular RQ and XSK RQ. However,
space in ICOSQ is reserved only for the regular RQ, which may cause
ICOSQ overflows when using XSK (the most risk is on activating
channels).

This commit fixes the issue by reserving space for XSK UMR WQEs as well.
As XSK may be enabled without restarting the channel and recreating the
ICOSQ, this space is reserved unconditionally.

Fixes: db05815b36cb ("net/mlx5e: Add XSK zero-copy support")
Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en/params.c

index 3c1edfa..e025040 100644 (file)
@@ -790,8 +790,20 @@ static u8 mlx5e_build_icosq_log_wq_sz(struct mlx5_core_dev *mdev,
                return MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE;
 
        wqebbs = MLX5E_UMR_WQEBBS * BIT(mlx5e_get_rq_log_wq_sz(rqp->rqc));
+
+       /* If XDP program is attached, XSK may be turned on at any time without
+        * restarting the channel. ICOSQ must be big enough to fit UMR WQEs of
+        * both regular RQ and XSK RQ.
+        * Although mlx5e_mpwqe_get_log_rq_size accepts mlx5e_xsk_param, it
+        * doesn't affect its return value, as long as params->xdp_prog != NULL,
+        * so we can just multiply by 2.
+        */
+       if (params->xdp_prog)
+               wqebbs *= 2;
+
        if (params->packet_merge.type == MLX5E_PACKET_MERGE_SHAMPO)
                wqebbs += mlx5e_shampo_icosq_sz(mdev, params, rqp);
+
        return max_t(u8, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE, order_base_2(wqebbs));
 }