mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
RDMA/irdma: Bound in-flight CQP ops across deferred completions
On IRDMA_GEN_3+ devices, CQP operations can complete in two stages:
Stage-1 on the CCQ acknowledges receipt and moves an entry from
cqp->ooo_avail to cqp->ooo_pnd, while Stage-2 signals final completion
via an AEQ event or a subsequent CCQ CQE.
In irdma_sc_ccq_get_cqe_info(), Stage-1 processing advances
cqp->sq_ring.tail so the SQ descriptor slot can be reused once consumed
by hardware, whereas cqp->completed_ops is only incremented on Stage-2.
Because irdma_cqp_ring_full() only checks cqp->sq_ring, a burst of
backlogged commands in dev->cqp_cmd_head allows irdma_process_bh() to
submit more concurrent in-flight CQP commands than the maximum supported
limit (cqp->sq_size - 1) while earlier commands await Stage-2. This
causes CQP completions to be lost and synchronous waiters to time out
with -ETIMEDOUT (-110).
Fix this by:
- Updating irdma_cqp_ring_full() to bound total in-flight CQP
operations (cqp->requested_ops - cqp->completed_ops) to
(cqp->sq_size - 1).
- Calling irdma_process_bh() at the end of irdma_process_ae_def_cmpl()
so backlogged commands are drained after Stage-2 AEQ completions
increment cqp->completed_ops and free in-flight capacity.
Fixes: c7db0abe5f ("RDMA/irdma: Add GEN3 CQP support with deferred completions")
Assisted-by: Gemini
Signed-off-by: Sunny Tiwari <sunnytiwari@google.com>
Link: https://patch.msgid.link/20261017052856.3570063-1-sunnytiwari@google.com
Reviewed-by: Jacob Moroni <jmoroni@google.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
bb75e5580b
commit
c3e8e9451e
|
|
@ -5323,7 +5323,11 @@ int irdma_sc_static_hmc_pages_allocated(struct irdma_sc_cqp *cqp, u64 scratch,
|
|||
*/
|
||||
static bool irdma_cqp_ring_full(struct irdma_sc_cqp *cqp)
|
||||
{
|
||||
return IRDMA_RING_FULL_ERR(cqp->sq_ring);
|
||||
u64 in_flight = cqp->requested_ops -
|
||||
atomic64_read(&cqp->completed_ops);
|
||||
|
||||
return IRDMA_RING_FULL_ERR(cqp->sq_ring) ||
|
||||
in_flight >= (cqp->sq_size - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -265,6 +265,7 @@ static void irdma_process_ae_def_cmpl(struct irdma_pci_f *rf,
|
|||
irdma_sc_cqp_def_cmpl_ae_handler(&rf->sc_dev, info, false,
|
||||
&scratch, &sw_def_info);
|
||||
}
|
||||
irdma_process_bh(&rf->sc_dev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user