Merge branch 'net-mlx5-more-hws-misc-enhancements'

Tariq Toukan says:

====================
net/mlx5: more HWS misc enhancements

This series by Yevgeny brings more misc improvements to the mlx5 HWS
driver.
====================

Link: https://patch.msgid.link/20260915111912.3926585-1-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2026-09-18 17:54:04 -07:00
commit 5249efe2f5
2 changed files with 26 additions and 12 deletions

View File

@ -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;
}
}

View File

@ -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
@ -732,7 +729,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;
@ -1192,6 +1189,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 +1212,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;
@ -1287,7 +1295,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;
}
@ -1305,7 +1313,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,
@ -1324,10 +1332,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;