patch 'net/mlx5: fix spurious CPU wakeups' has been queued to stable release 24.11.4
Kevin Traynor
ktraynor at redhat.com
Fri Nov 21 12:21:08 CET 2025
Hi,
FYI, your patch has been queued to stable release 24.11.4
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/26/25. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable
This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/445b320f57e0aa24e79530aabbd2ade62cad66d5
Thanks.
Kevin
---
>From 445b320f57e0aa24e79530aabbd2ade62cad66d5 Mon Sep 17 00:00:00 2001
From: Sivaprasad Tummala <sivaprasad.tummala at amd.com>
Date: Tue, 11 Nov 2025 03:40:57 +0000
Subject: [PATCH] net/mlx5: fix spurious CPU wakeups
[ upstream commit 750f635fc6a7ee287e076c5500ca97d77187676a ]
Previously, the PMD used a common monitor callback to determine
CQE ownership for power-aware polling. However, when a CQE contained
an invalid opcode (MLX5_CQE_INVALID), ownership bit was not reliable.
As a result, the monitor condition could falsely indicate CQE
availability and cause the CPU to wake up unnecessarily during
low traffic periods.
This resulted in spurious wakeups in monitor-wait mode and reduced
the expected power savings, as cores exited the sleep state even
when no valid CQEs were available.
This patch introduces a dedicated callback that skips invalid CQEs
and optimizes power efficiency by preventing false wakeups caused
by hardware-owned or invalid entries.
Fixes: a8f0df6bf98d ("net/mlx5: support power monitoring")
Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala at amd.com>
---
drivers/net/mlx5/mlx5_rx.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/drivers/net/mlx5/mlx5_rx.c b/drivers/net/mlx5/mlx5_rx.c
index 0f2152fdb0..c5fdf25a38 100644
--- a/drivers/net/mlx5/mlx5_rx.c
+++ b/drivers/net/mlx5/mlx5_rx.c
@@ -295,4 +295,18 @@ mlx5_monitor_callback(const uint64_t value,
}
+static int
+mlx5_monitor_cqe_own_callback(const uint64_t value,
+ const uint64_t opaque[RTE_POWER_MONITOR_OPAQUE_SZ])
+{
+ const uint64_t m = opaque[CLB_MSK_IDX];
+ const uint64_t v = opaque[CLB_VAL_IDX];
+ const uint64_t sw_owned = ((value & m) == v);
+ const uint64_t opcode = MLX5_CQE_OPCODE(value);
+ const uint64_t valid_op = (opcode != MLX5_CQE_INVALID);
+
+ /* ownership bit is not valid for invalid opcode; CQE is HW owned */
+ return -(valid_op & sw_owned);
+}
+
int mlx5_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc)
{
@@ -312,10 +326,11 @@ int mlx5_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc)
pmc->opaque[CLB_VAL_IDX] = vic;
pmc->opaque[CLB_MSK_IDX] = MLX5_CQE_VIC_INIT;
+ pmc->fn = mlx5_monitor_callback;
} else {
pmc->addr = &cqe->op_own;
pmc->opaque[CLB_VAL_IDX] = !!idx;
pmc->opaque[CLB_MSK_IDX] = MLX5_CQE_OWNER_MASK;
+ pmc->fn = mlx5_monitor_cqe_own_callback;
}
- pmc->fn = mlx5_monitor_callback;
pmc->size = sizeof(uint8_t);
return 0;
--
2.51.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2025-11-21 11:05:12.157007382 +0000
+++ 0084-net-mlx5-fix-spurious-CPU-wakeups.patch 2025-11-21 11:05:09.567201613 +0000
@@ -1 +1 @@
-From 750f635fc6a7ee287e076c5500ca97d77187676a Mon Sep 17 00:00:00 2001
+From 445b320f57e0aa24e79530aabbd2ade62cad66d5 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 750f635fc6a7ee287e076c5500ca97d77187676a ]
+
@@ -22 +23,0 @@
-Cc: stable at dpdk.org
@@ -30 +31 @@
-index 420a03068d..ac663a978e 100644
+index 0f2152fdb0..c5fdf25a38 100644
@@ -33 +34 @@
-@@ -296,4 +296,18 @@ mlx5_monitor_callback(const uint64_t value,
+@@ -295,4 +295,18 @@ mlx5_monitor_callback(const uint64_t value,
@@ -52 +53 @@
-@@ -313,10 +327,11 @@ int mlx5_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc)
+@@ -312,10 +326,11 @@ int mlx5_get_monitor_addr(void *rx_queue, struct rte_power_monitor_cond *pmc)
More information about the stable
mailing list