Re: [PATCH net 2/6] net/mlx5: Fix misidentification of write combining CQE during poll loop

From: Jacob Keller

Date: Thu Feb 12 2026 - 17:37:16 EST




On 2/12/2026 2:32 AM, Tariq Toukan wrote:
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wc.c b/drivers/net/ethernet/mellanox/mlx5/core/wc.c
index 815a7c97d6b0..29db15c4b978 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/wc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/wc.c
@@ -390,12 +390,10 @@ static void mlx5_core_test_wc(struct mlx5_core_dev *mdev)
mlx5_wc_post_nop(sq, &offset, true);
expires = jiffies + TEST_WC_POLLING_MAX_TIME_JIFFIES;
- do {
- err = mlx5_wc_poll_cq(sq);
- if (err)
- usleep_range(2, 10);
- } while (mdev->wc_state == MLX5_WC_STATE_UNINITIALIZED &&
- time_is_after_jiffies(expires));
+ while ((mlx5_wc_poll_cq(sq),
+ mdev->wc_state == MLX5_WC_STATE_UNINITIALIZED) &&
+ time_is_after_jiffies(expires))
+ usleep_range(2, 10);

This could be written with poll_timeout_us(), but I don't know if it warrants holding up the fix.

Something line the following:

diff --git i/drivers/net/ethernet/mellanox/mlx5/core/wc.c w/drivers/net/ethernet/mellanox/mlx5/core/wc.c
index 29db15c4b978..6ec9c1a2da78 100644
--- i/drivers/net/ethernet/mellanox/mlx5/core/wc.c
+++ w/drivers/net/ethernet/mellanox/mlx5/core/wc.c
@@ -15,7 +15,7 @@
#define TEST_WC_NUM_WQES 255
#define TEST_WC_LOG_CQ_SZ (order_base_2(TEST_WC_NUM_WQES))
#define TEST_WC_SQ_LOG_WQ_SZ TEST_WC_LOG_CQ_SZ
-#define TEST_WC_POLLING_MAX_TIME_JIFFIES msecs_to_jiffies(100)
+#define TEST_WC_POLLING_MAX_TIME_USEC (100 * USEC_PER_MSEC)

struct mlx5_wc_cq {
/* data path - accessed per cqe */
@@ -359,7 +359,6 @@ static int mlx5_wc_poll_cq(struct mlx5_wc_sq *sq)
static void mlx5_core_test_wc(struct mlx5_core_dev *mdev)
{
unsigned int offset = 0;
- unsigned long expires;
struct mlx5_wc_sq *sq;
int i, err;

@@ -389,11 +388,9 @@ static void mlx5_core_test_wc(struct mlx5_core_dev *mdev)

mlx5_wc_post_nop(sq, &offset, true);

- expires = jiffies + TEST_WC_POLLING_MAX_TIME_JIFFIES;
- while ((mlx5_wc_poll_cq(sq),
- mdev->wc_state == MLX5_WC_STATE_UNINITIALIZED) &&
- time_is_after_jiffies(expires))
- usleep_range(2, 10);
+ poll_timeout_us(mlx5_wc_poll_cq(sq),
+ mdev->wc_state != MLX5_WC_STATE_UNINITIALIZED,
+ 10, TEST_WC_POLLING_MAX_TIME_USEC, false);

mlx5_wc_destroy_sq(sq);