net/mlx5e: Lower maximum allowed MTU in XSK to match XDP prerequisites
XSK redirecting XDP programs require linearity, hence applies restrictions on the MTU. For PAGE_SIZE=4K, MTU shouldn't exceed 3498. Features that contradict with XDP such HW-LRO and HW-GRO are enforced by the driver in advance, during XSK params validation, except for MTU, which was not enforced before this patch. This has been spotted during test scenario described below: Attaching xdpsock program (PAGE_SIZE=4K), with MTU < 3498, detaching XDP program, changing the MTU to arbitrary value in the range [3499, 3754], attaching XDP program again, which ended up with failure since MTU is > 3498. This commit lowers the XSK MTU limitation to be aligned with XDP MTU limitation, since XSK socket is meaningless without XDP program. Signed-off-by: Adham Faris <afaris@nvidia.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
Родитель
031a163f2c
Коммит
78dee7befd
|
@ -4169,13 +4169,17 @@ static bool mlx5e_xsk_validate_mtu(struct net_device *netdev,
|
||||||
struct xsk_buff_pool *xsk_pool =
|
struct xsk_buff_pool *xsk_pool =
|
||||||
mlx5e_xsk_get_pool(&chs->params, chs->params.xsk, ix);
|
mlx5e_xsk_get_pool(&chs->params, chs->params.xsk, ix);
|
||||||
struct mlx5e_xsk_param xsk;
|
struct mlx5e_xsk_param xsk;
|
||||||
|
int max_xdp_mtu;
|
||||||
|
|
||||||
if (!xsk_pool)
|
if (!xsk_pool)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mlx5e_build_xsk_param(xsk_pool, &xsk);
|
mlx5e_build_xsk_param(xsk_pool, &xsk);
|
||||||
|
max_xdp_mtu = mlx5e_xdp_max_mtu(new_params, &xsk);
|
||||||
|
|
||||||
if (!mlx5e_validate_xsk_param(new_params, &xsk, mdev)) {
|
/* Validate XSK params and XDP MTU in advance */
|
||||||
|
if (!mlx5e_validate_xsk_param(new_params, &xsk, mdev) ||
|
||||||
|
new_params->sw_mtu > max_xdp_mtu) {
|
||||||
u32 hr = mlx5e_get_linear_rq_headroom(new_params, &xsk);
|
u32 hr = mlx5e_get_linear_rq_headroom(new_params, &xsk);
|
||||||
int max_mtu_frame, max_mtu_page, max_mtu;
|
int max_mtu_frame, max_mtu_page, max_mtu;
|
||||||
|
|
||||||
|
@ -4185,9 +4189,9 @@ static bool mlx5e_xsk_validate_mtu(struct net_device *netdev,
|
||||||
*/
|
*/
|
||||||
max_mtu_frame = MLX5E_HW2SW_MTU(new_params, xsk.chunk_size - hr);
|
max_mtu_frame = MLX5E_HW2SW_MTU(new_params, xsk.chunk_size - hr);
|
||||||
max_mtu_page = MLX5E_HW2SW_MTU(new_params, SKB_MAX_HEAD(0));
|
max_mtu_page = MLX5E_HW2SW_MTU(new_params, SKB_MAX_HEAD(0));
|
||||||
max_mtu = min(max_mtu_frame, max_mtu_page);
|
max_mtu = min3(max_mtu_frame, max_mtu_page, max_xdp_mtu);
|
||||||
|
|
||||||
netdev_err(netdev, "MTU %d is too big for an XSK running on channel %u. Try MTU <= %d\n",
|
netdev_err(netdev, "MTU %d is too big for an XSK running on channel %u or its redirection XDP program. Try MTU <= %d\n",
|
||||||
new_params->sw_mtu, ix, max_mtu);
|
new_params->sw_mtu, ix, max_mtu);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче