[PATCH net-next 0/7] net: mana: harden the HWC and add dynamic queue depth
From: Long Li <longli@microsoft.com>
Date: 2026-07-15 03:30:04
Also in:
linux-hyperv, linux-rdma, lkml
This series hardens the MANA Hardware Channel (HWC) control-plane path
and then builds on that to support a dynamic HWC queue depth.
The HWC is the command channel the driver uses to talk to the device.
Today it is created at a fixed depth of one outstanding request, and
several of its lookup and teardown paths predate the RCU and DMA-lifetime
rules they now need to follow. Raising the queue depth and allowing
concurrent commands makes those latent races reachable, so the fixes come
first and the feature builds on them.
Patches 1-5 are fixes for pre-existing HWC bugs, each with a Fixes: tag:
1: cq_table was a plain pointer array freed with no grace period while
the EQ interrupt handler dereferenced it; put it under RCU.
2: the HWC RQ and SQ were sized with each other's message size, so a
response could overflow the RQ buffer and the RX slot stride was
computed with the wrong size.
3: comp_buf was freed before the EQ was destroyed, so a late completion
handler could touch freed memory.
4: the RX path consumed device-supplied lengths and indices without
validation; validate them before use (this matters for confidential
VMs, where the DMA buffer is shared with the host).
5: a failed mana_hwc_establish_channel() could leave live MST entries
while the driver freed the queue buffers, and destroy_channel() freed
the TXQ/RXQ before the EQ was quiesced; add a setup_active teardown
gate and destroy the CQ first.
Patches 6-7 add the feature:
6: replace the depth-1 semaphore with a slot bitmap and per-slot
synchronization so several management commands can be in flight,
with teardown that drains in-flight senders before freeing the HWC.
7: bootstrap the HWC at depth 1, query the device maximum and, if it is
larger, tear down and rebuild the queues at that depth. The reported
dimensions are validated before they size DMA allocations, and the
capability is advertised so firmware enables it only when the driver
supports it.
The fixes are grouped ahead of the feature they enable rather than sent
separately to net, since the HWC runs at depth 1 today and the races are
reached only once the later patches raise the depth.
Long Li (7):
net: mana: RCU-protect gc->cq_table lookups against concurrent CQ
destroy
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: support concurrent HWC requests with proper synchronization
net: mana: add dynamic HWC queue depth with reinit path
drivers/infiniband/hw/mana/cq.c | 46 +-
.../net/ethernet/microsoft/mana/gdma_main.c | 78 +-
.../net/ethernet/microsoft/mana/hw_channel.c | 707 ++++++++++++++++--
drivers/net/ethernet/microsoft/mana/mana_en.c | 22 +-
include/net/mana/gdma.h | 48 +-
include/net/mana/hw_channel.h | 40 +-
6 files changed, 849 insertions(+), 92 deletions(-)
base-commit: f6f3b36c15ed44de1fbb44e645e4fae8c4a4453e
--
2.43.0