From: Danielle Costantino <dcostantino@meta.com>
To: Saeed Mahameed <saeedm@nvidia.com>,
Leon Romanovsky <leon@kernel.org>,
Tariq Toukan <tariqt@nvidia.com>, Mark Bloch <mbloch@nvidia.com>,
Andrew Lunn <andrew+netdev@lunn.ch>, <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Moshe Shemesh <moshe@nvidia.com>,
Eran Ben Elisha <eranbe@nvidia.com>
Cc: <netdev@vger.kernel.org>, <linux-rdma@vger.kernel.org>,
<linux-kernel@vger.kernel.org>,
Danielle Costantino <dcostantino@meta.com>
Subject: [PATCH net 0/2] net/mlx5: command mailbox use-after-free, and the teardown hang hiding it
Date: Tue, 15 Sep 2026 15:59:38 -0700 [thread overview]
Message-ID: <20260915225941.554568-1-dcostantino@meta.com> (raw)
Two defects in the mlx5 command interface, both reached through the same
door: a firmware command that times out.
1/2 bounds the drain in mlx5_cmd_allowed_opcode() and
mlx5_cmd_change_mod(). Both take every unit of cmd->vars.sem, and since
commit 8e715cd613a1 ("net/mlx5: Set command entry semaphore up once got
index free") a unit is only returned when the entry's refcount reaches
zero, which for a timed-out entry never happens. One stalled slot blocks
them forever, and destroy_async_eqs() calls both from mlx5_unload(), so a
function with any stalled command cannot be removed: the task stays in D
state holding the devlink instance lock, and reboot hits the same path.
2/2 stops the driver handing a firmware-owned DMA mailbox back to
dev->cmd.pool. When mlx5_cmd_comp_handler(forced) keeps an entry and its
queue slot because firmware may still complete the command, cmd_exec() and
the callback path free the mailboxes anyway. dmapool keeps its free list
node in the first 16 bytes of the block, which for mlx5 is the start of the
command payload, so a late firmware write corrupts the allocator and a
subsequent dma_pool_alloc() follows a poisoned pointer. That is the crash.
1/2 comes first because it is what makes 2/2's teardown cleanup reachable:
without it teardown deadlocks long before mlx5_cmd_disable(), so nothing in
this series would ever run there. They are otherwise independent - 1/2
does not touch anything 2/2 changes - and each builds on its own.
Testing
=======
A 32-slot aarch64 device with 22 mlx5 functions, debug kernel (KASAN,
DEBUG_OBJECTS, DEBUG_LIST, DMA_API_DEBUG, DEBUG_SPINLOCK), driving real
-ETIMEDOUT by swallowing firmware completions with a kprobe, then
unbinding the function.
control, unbind/rebind with no stalled slots
unbind 10s, rebind 3s, no warnings, no splats - the drain refactor
leaves the normal path alone
1/2, with 13 stalled slots
before unbind never returns; task in D state in
mlx5_cmd_allowed_opcode() with cmd->vars.sem at 0
after the drain gives up three times, once per quiesce call in
destroy_async_eqs(), at 61.4s intervals - the command
timeout - then the unbind completes in 195s and the
function rebinds in 2s
the partial drain declines to narrow the allowed opcode, once,
and still widens it back afterwards
2/2, same 13 stalled slots
mailbox ownership taken on 13 of 13 timed-out entries
slots sharing one lay->out_ptr ............. 0 (7 and 6 before)
firmware-owned mailbox on pool free list ... 0 (8 and 7 before)
pool->next_block .......................... valid, was garbage
entries retired ........................... 13, matching the slots
"dma_pool_destroy mlx5_cmd busy" .......... 0 (1 without the
reclaim)
kmemleak reports of mlx5_cmd_work_ent ..... 0 (14 without it)
across every run
no KASAN, refcount_t, list corruption or dma_pool warnings
Danielle Costantino (2):
net/mlx5: Bound the command interface drain so teardown cannot hang
net/mlx5: Don't return firmware-owned command mailboxes to the DMA
pool
drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 231 +++++++++++++++---
.../net/ethernet/mellanox/mlx5/core/main.c | 21 +-
.../ethernet/mellanox/mlx5/core/mlx5_core.h | 2 +-
include/linux/mlx5/driver.h | 6 +
4 files changed, 228 insertions(+), 32 deletions(-)
base-commit: 83a945a529d6e002dd7339c532288a931f463dba
next reply other threads:[~2026-09-15 23:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 22:59 Danielle Costantino [this message]
2026-09-15 22:59 ` [PATCH net 1/2] net/mlx5: Bound the command interface drain so teardown cannot hang Danielle Costantino
2026-09-15 22:59 ` [PATCH net 2/2] net/mlx5: Don't return firmware-owned command mailboxes to the DMA pool Danielle Costantino
2026-09-16 5:31 ` [PATCH net 0/2] net/mlx5: command mailbox use-after-free, and the teardown hang hiding it Leon Romanovsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260915225941.554568-1-dcostantino@meta.com \
--to=dcostantino@meta.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=eranbe@nvidia.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=mbloch@nvidia.com \
--cc=moshe@nvidia.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=saeedm@nvidia.com \
--cc=tariqt@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®