From 0ca19b9fdcb0087c79d8b21c5a224d6b5cd6fe73 Mon Sep 17 00:00:00 2001 From: Yevgeny Kliteynik Date: Tue, 15 Sep 2026 14:19:07 +0300 Subject: [PATCH 1/6] net/mlx5: HWS, Return meaningful error code in hws_send_wqe_fw Returning '-1' is non-idiomatic in kernel code. Use a meaningful error code instead. Signed-off-by: Yevgeny Kliteynik Reviewed-by: Erez Shitrit Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260915111912.3926585-2-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c index df3b93499eeb..ae3ff232c63b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c @@ -1305,7 +1305,7 @@ hws_send_wqe_fw(struct mlx5_core_dev *mdev, goto send_wqe; } - return -1; + return -EIO; } void mlx5hws_send_stes_fw(struct mlx5hws_context *ctx, From 59da9e5163e93b0fb573ff5d64c9bdb74de26ef4 Mon Sep 17 00:00:00 2001 From: Yevgeny Kliteynik Date: Tue, 15 Sep 2026 14:19:08 +0300 Subject: [PATCH 2/6] net/mlx5: HWS, Fix error message in mlx5hws_cmd_generate_wqe Kernel log messages should end with '\n' for proper formatting. Signed-off-by: Yevgeny Kliteynik Reviewed-by: Erez Shitrit Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260915111912.3926585-3-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c index ae3ff232c63b..80cfd0ddba08 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c @@ -1287,7 +1287,7 @@ hws_send_wqe_fw(struct mlx5_core_dev *mdev, send_wqe: ret = mlx5hws_cmd_generate_wqe(mdev, &attr, &cqe); if (ret) { - mlx5_core_err(mdev, "Failed to write WQE using command"); + mlx5_core_err(mdev, "Failed to write WQE using command\n"); return ret; } From 23aacde37804d18c7f6e5d88f40b0e5f6cf46249 Mon Sep 17 00:00:00 2001 From: Yevgeny Kliteynik Date: Tue, 15 Sep 2026 14:19:09 +0300 Subject: [PATCH 3/6] net/mlx5: HWS, Replace kzalloc with kzalloc_obj Replace kzalloc with the newer kzalloc_obj allocation function. Signed-off-by: Yevgeny Kliteynik Reviewed-by: Erez Shitrit Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260915111912.3926585-4-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c index 80cfd0ddba08..49dee44d0bef 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c @@ -732,7 +732,7 @@ static int hws_send_ring_alloc_sq(struct mlx5_core_dev *mdev, goto destroy_wq_cyc; } - sq->wr_priv = kzalloc(sizeof(*sq->wr_priv) * buf_sz, GFP_KERNEL); + sq->wr_priv = kzalloc_objs(*sq->wr_priv, buf_sz); if (!sq->wr_priv) { err = -ENOMEM; goto free_dep_wqe; From 7bf7c4367db690087a144c0e54efed8d2df5b11b Mon Sep 17 00:00:00 2001 From: Yevgeny Kliteynik Date: Tue, 15 Sep 2026 14:19:10 +0300 Subject: [PATCH 4/6] net/mlx5: HWS, Add timeout mechanism to draining send queues HWS has a timeout mechanism for usual polling for completion, but it was missing such a mechanism for draining the send queues. Signed-off-by: Yevgeny Kliteynik Reviewed-by: Erez Shitrit Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260915111912.3926585-5-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- .../ethernet/mellanox/mlx5/core/steering/hws/bwc.c | 4 +++- .../ethernet/mellanox/mlx5/core/steering/hws/send.c | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc.c index 3bcf412a08c4..14a2bb9167a4 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/bwc.c @@ -460,7 +460,9 @@ int mlx5hws_bwc_queue_poll(struct mlx5hws_context *ctx, got_comp = !!ret; if (unlikely(!got_comp && time_after(jiffies, timeout))) { - mlx5hws_err(ctx, "BWC poll error: polling queue %d - TIMEOUT\n", queue_id); + mlx5hws_err(ctx, + "BWC poll error: polling queue %d - TIMEOUT (%d sec)\n", + queue_id, MLX5HWS_BWC_POLLING_TIMEOUT); return -ETIMEDOUT; } } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c index 49dee44d0bef..9ff109fc8230 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c @@ -1192,6 +1192,8 @@ int mlx5hws_send_queue_action(struct mlx5hws_context *ctx, u16 queue_id, u32 actions) { + unsigned long timeout = jiffies + + secs_to_jiffies(MLX5HWS_BWC_POLLING_TIMEOUT); struct mlx5hws_send_ring_sq *send_sq; struct mlx5hws_send_engine *queue; bool wait_comp = false; @@ -1213,9 +1215,18 @@ int mlx5hws_send_queue_action(struct mlx5hws_context *ctx, mlx5hws_send_engine_flush_queue(queue); /* Poll queue until empty */ - while (wait_comp && !mlx5hws_send_engine_empty(queue)) + while (wait_comp && !mlx5hws_send_engine_empty(queue)) { hws_send_engine_poll_cq(queue, NULL, &polled, 0); + if (unlikely(time_after(jiffies, timeout))) { + mlx5hws_err(ctx, + "Error draining send queue %d - TIMEOUT (%d sec)\n", + queue_id, + MLX5HWS_BWC_POLLING_TIMEOUT); + return -ETIMEDOUT; + } + } + break; default: return -EINVAL; From 03d41926d03a4a4000a5e002c570545c12cd78a8 Mon Sep 17 00:00:00 2001 From: Yevgeny Kliteynik Date: Tue, 15 Sep 2026 14:19:11 +0300 Subject: [PATCH 5/6] net/mlx5: HWS, Handle timeout draining the send queue for FW STEs Handle a case in mlx5hws_send_stes_fw where draining a queue fails with timeout. Signed-off-by: Yevgeny Kliteynik Reviewed-by: Erez Shitrit Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260915111912.3926585-6-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- .../ethernet/mellanox/mlx5/core/steering/hws/send.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c index 9ff109fc8230..bddac018b44b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c @@ -1335,10 +1335,14 @@ void mlx5hws_send_stes_fw(struct mlx5hws_context *ctx, pdn = ctx->pd_num; /* Writing through FW can't HW fence, therefore we drain the queue */ - if (send_attr->fence) - mlx5hws_send_queue_action(ctx, - queue_id, - MLX5HWS_SEND_QUEUE_ACTION_DRAIN_SYNC); + if (send_attr->fence) { + enum mlx5hws_send_queue_actions drain = + MLX5HWS_SEND_QUEUE_ACTION_DRAIN_SYNC; + + ret = mlx5hws_send_queue_action(ctx, queue_id, drain); + if (ret) + goto fail_rule; + } if (ste_attr->rtc_1) { send_attr->id = ste_attr->rtc_1; From 889f1d8c0eb2f47c1b34f53e838693fd42bb783a Mon Sep 17 00:00:00 2001 From: Yevgeny Kliteynik Date: Tue, 15 Sep 2026 14:19:12 +0300 Subject: [PATCH 6/6] net/mlx5: HWS, Remove unneeded WRITE_ONCE in post send Remove the unneeded WRITE_ONCE, for two reasons: a) This write is erroneous - it just writes to a local variable and doesn't have any effect. b) This code originated from another place (copy-paste bug), where there was actually a CQ polling right after this line, and the WRITE_ONCE was writing to another place. Signed-off-by: Yevgeny Kliteynik Reviewed-by: Erez Shitrit Signed-off-by: Tariq Toukan Link: https://patch.msgid.link/20260915111912.3926585-7-tariqt@nvidia.com Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c index bddac018b44b..8b70040eaca0 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/send.c @@ -111,9 +111,6 @@ static void hws_send_engine_post_ring(struct mlx5hws_send_ring_sq *sq, wmb(); mlx5_write64((__be32 *)doorbell_cseg, sq->uar_map); - - /* Ensure doorbell is written on uar_page before poll_cq */ - WRITE_ONCE(doorbell_cseg, NULL); } static void