net: mana: Add support to process throttled EQEs
When an event queue nears full, the hardware coalesces the per-CQ
GDMA_EQE_COMPLETION notifications into a single throttle EQE (type 4)
that carries no cq_id. The driver does not handle this event type, so
it falls through to the default case and is dropped. Any CQ whose
completion notification was replaced by the throttle EQE can remain
unserviced, causing its queue to stall.
This was observed internally as a TX stall:
ens1: NETDEV WATCHDOG: CPU: 45: transmit queue 1 timed out 15133 ms
mana 7870:00:00.0: HWC: Request timed out: 60000 ms
mana 7870:00:00.0: Gf stats wk handler: gf stats query timed out.
ens1: NETDEV WATCHDOG: CPU: 20: transmit queue 0 timed out 15859 ms
ens1: NETDEV WATCHDOG: CPU: 15: transmit queue 0 timed out 31731 ms
ens1: NETDEV WATCHDOG: CPU: 21: transmit queue 0 timed out 47603 ms
ens1: NETDEV WATCHDOG: CPU: 42: transmit queue 0 timed out 62451 ms
Handle the throttle EQE:
- Record up to two child CQs per EQ when a CQ is created with a parent
EQ. A mana_en EQ serves one TX CQ and one RX CQ, and the HWC EQ
serves the HWC CQ.
- On a throttle EQE, call the callback of each child CQ that is still
in cq_table[].
- Before a child CQ is freed, unlink it from its parent EQ and from
cq_table[] in mana_gd_detach_cq(), then wait for an RCU
grace period, because mana_gd_intr() reads both under
rcu_read_lock(). mana_destroy_txq() and mana_destroy_rxq() detach
the CQ before deleting its NAPI, so the synchronize_net() that NAPI
deletion already needs also covers the CQ. mana_hwc_destroy_channel()
detaches the HWC CQ and waits for a grace period before freeing the
HWC queues.
- Advertise the capability bit for throttled EQE.
- Add a throttle eqe counter per queue.
Fixes: ca9c54d2d6a5 ("net: mana: Add a driver for Microsoft Azure Network Adapter (MANA)")
Cc: stable@vger.kernel.org
Signed-off-by: Sahil Chandna <sahilchandna@linux.microsoft.com>
Link: https://patch.msgid.link/20261028084020.2051254-1-sahilchandna@linux.microsoft.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
6 files changed