mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
IB/mlx4: Fix RSS hash fields restrictions
[ Upstream commit4d02ebd9bb] Mistakenly the driver didn't allow RSS hash fields combinations which involve both IPv4 and IPv6 protocols. This bug caused to failures for user's use cases for RSS. Consequently, this patch fixes this bug and allows any combination that the HW can support. Additionally, the patch fixes the driver to return an error in case the user provides an unsupported mask for RSS hash fields. Fixes:3078f5f1bd("IB/mlx4: Add support for RSS QP") Signed-off-by: Guy Levi <guyle@mellanox.com> Reviewed-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leon@kernel.org> Signed-off-by: Doug Ledford <dledford@redhat.com> Signed-off-by: Sasha Levin <alexander.levin@verizon.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8edeefab9e
commit
1840744a7f
@@ -666,6 +666,19 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,
|
||||
return (-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
if (ucmd->rx_hash_fields_mask & ~(MLX4_IB_RX_HASH_SRC_IPV4 |
|
||||
MLX4_IB_RX_HASH_DST_IPV4 |
|
||||
MLX4_IB_RX_HASH_SRC_IPV6 |
|
||||
MLX4_IB_RX_HASH_DST_IPV6 |
|
||||
MLX4_IB_RX_HASH_SRC_PORT_TCP |
|
||||
MLX4_IB_RX_HASH_DST_PORT_TCP |
|
||||
MLX4_IB_RX_HASH_SRC_PORT_UDP |
|
||||
MLX4_IB_RX_HASH_DST_PORT_UDP)) {
|
||||
pr_debug("RX Hash fields_mask has unsupported mask (0x%llx)\n",
|
||||
ucmd->rx_hash_fields_mask);
|
||||
return (-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
if ((ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_SRC_IPV4) &&
|
||||
(ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_DST_IPV4)) {
|
||||
rss_ctx->flags = MLX4_RSS_IPV4;
|
||||
@@ -691,11 +704,11 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,
|
||||
return (-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
if (rss_ctx->flags & MLX4_RSS_IPV4) {
|
||||
if (rss_ctx->flags & MLX4_RSS_IPV4)
|
||||
rss_ctx->flags |= MLX4_RSS_UDP_IPV4;
|
||||
} else if (rss_ctx->flags & MLX4_RSS_IPV6) {
|
||||
if (rss_ctx->flags & MLX4_RSS_IPV6)
|
||||
rss_ctx->flags |= MLX4_RSS_UDP_IPV6;
|
||||
} else {
|
||||
if (!(rss_ctx->flags & (MLX4_RSS_IPV6 | MLX4_RSS_IPV4))) {
|
||||
pr_debug("RX Hash fields_mask is not supported - UDP must be set with IPv4 or IPv6\n");
|
||||
return (-EOPNOTSUPP);
|
||||
}
|
||||
@@ -707,15 +720,14 @@ static int set_qp_rss(struct mlx4_ib_dev *dev, struct mlx4_ib_rss *rss_ctx,
|
||||
|
||||
if ((ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_SRC_PORT_TCP) &&
|
||||
(ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_DST_PORT_TCP)) {
|
||||
if (rss_ctx->flags & MLX4_RSS_IPV4) {
|
||||
if (rss_ctx->flags & MLX4_RSS_IPV4)
|
||||
rss_ctx->flags |= MLX4_RSS_TCP_IPV4;
|
||||
} else if (rss_ctx->flags & MLX4_RSS_IPV6) {
|
||||
if (rss_ctx->flags & MLX4_RSS_IPV6)
|
||||
rss_ctx->flags |= MLX4_RSS_TCP_IPV6;
|
||||
} else {
|
||||
if (!(rss_ctx->flags & (MLX4_RSS_IPV6 | MLX4_RSS_IPV4))) {
|
||||
pr_debug("RX Hash fields_mask is not supported - TCP must be set with IPv4 or IPv6\n");
|
||||
return (-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
} else if ((ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_SRC_PORT_TCP) ||
|
||||
(ucmd->rx_hash_fields_mask & MLX4_IB_RX_HASH_DST_PORT_TCP)) {
|
||||
pr_debug("RX Hash fields_mask is not supported - both TCP SRC and DST must be set\n");
|
||||
|
||||
Reference in New Issue
Block a user