[PATCH net v7 0/7] net: mana: HW channel reliability and hardening fixes
From: Long Li <longli@microsoft.com>
Date: 2026-08-13 17:43:14
Also in:
linux-hyperv, linux-rdma, lkml
This series fixes a set of reliability and safety bugs in the MANA HW
communication channel (HWC) and hardens the paths that consume
device-supplied values. The HWC bootstrap and RX data come from the PF,
which is untrusted from a confidential-VM guest, so several of these are
also hardening fixes against a malicious or buggy host.
Patch 1 reference-counts the CQs looked up from the EQ interrupt handler so
a completion cannot race a concurrent CQ destroy. Patches 2-3 fix an
RQ/SQ size swap and a use-after-free of the HWC comp_buf during teardown.
Patch 4 validates the lengths and indices taken from device DMA in the HWC
RX path. Patch 5 makes HWC teardown safe when a device stops responding.
Patch 6 stops a stale/late HWC response from completing the wrong command
after a timeout. Patch 7 keeps max_num_cqs immutable once cq_table is
allocated, so a later device event cannot inflate the bound past the
allocation.
The series has been build- and sparse-tested (C=2), and checkpatch is
clean on every patch.
Changes since v6:
- Patch 1: reworked from the lock-based scheme to lockless reference
counting per review feedback. Dropped gc->cq_table_lock entirely;
lookups now take a reference under RCU (refcount_inc_not_zero) and the
CQ is freed with kfree_rcu(), publish/unpublish are lockless. Reordered
mana_ib_destroy_cq() to detach the software callback before destroying
the hardware CQ, closing a CQ-id recycle window. Retitled accordingly
("reference-count CQs looked up from the EQ handler").
- Patch 4: bound the RX slot index by msg_buf->num_reqs (the __counted_by
array bound) rather than the queue depth, and rate-limit the
device-triggered RX error messages.
- Patch 5: the leak-on-teardown-failure branch now deregisters the HWC EQ
IRQ and unpublishes the CQ before returning, so no late EQE can reach the
leaked buffers. Corrected the setup_active kerneldoc comment.
- Patch 6: dropped the terminal "timed out" latch, which could stop
teardown commands from ever being posted to a slow device; the core
stale-response fix (per-slot lock/refcount/responded flag) and the
wait-queue admission change are retained, and the timeout still shortens
later waits so teardown is posted.
- Patch 7: reject an out-of-range CQ id with a rate-limited error and
-EPROTO instead of WARN_ON(), since both operands are device-controlled
and WARN_ON() could panic a panic_on_warn guest.
- Patches 2, 3: commit-message wording only; no code change.
The v6 posting is at:
https://lore.kernel.org/netdev/20260811023823.2391255-1-longli@microsoft.com/ (local)
Long Li (7):
net: mana: reference-count CQs looked up from the EQ handler
net: mana: fix HWC RQ/SQ buffer size swap
net: mana: free HWC comp_buf after destroying the EQ
net: mana: validate hardware-supplied values in the HWC RX path
net: mana: fix HWC teardown safety with setup_active flag and destroy
ordering
net: mana: fix stale HWC response after command timeout
net: mana: keep max_num_cqs immutable once cq_table is allocated
drivers/infiniband/hw/mana/cq.c | 41 +-
.../net/ethernet/microsoft/mana/gdma_main.c | 111 ++++-
.../net/ethernet/microsoft/mana/hw_channel.c | 402 ++++++++++++++----
drivers/net/ethernet/microsoft/mana/mana_en.c | 8 +-
include/net/mana/gdma.h | 29 +-
include/net/mana/hw_channel.h | 34 +-
6 files changed, 515 insertions(+), 110 deletions(-)
base-commit: f1b3416ceaf7ca4cb5cbd986ee8fe3ffaeda2d48
--
2.43.0