RDMA/bnxt_re: Report MISSED_EVENTS in req_notify_cq
While invoking the req_notify_cq hook, ULPs can request whether the CQs have any CQEs pending. If CQEs are pending, drivers can indicate it by returning 1 for req_notify_cq. The stack will poll CQ again till CQ is empty. This patch peeks the CQ for any valid entries and return accordingly. Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
10d1dedf9b
commit
499e456981
@ -3027,6 +3027,11 @@ int bnxt_re_req_notify_cq(struct ib_cq *ib_cq,
|
||||
else if (ib_cqn_flags & IB_CQ_SOLICITED)
|
||||
type = DBR_DBR_TYPE_CQ_ARMSE;
|
||||
|
||||
/* Poll to see if there are missed events */
|
||||
if ((ib_cqn_flags & IB_CQ_REPORT_MISSED_EVENTS) &&
|
||||
!(bnxt_qplib_is_cq_empty(&cq->qplib_cq)))
|
||||
return 1;
|
||||
|
||||
bnxt_qplib_req_notify_cq(&cq->qplib_cq, type);
|
||||
|
||||
return 0;
|
||||
|
@ -1895,6 +1895,25 @@ flush_rq:
|
||||
return rc;
|
||||
}
|
||||
|
||||
bool bnxt_qplib_is_cq_empty(struct bnxt_qplib_cq *cq)
|
||||
{
|
||||
struct cq_base *hw_cqe, **hw_cqe_ptr;
|
||||
unsigned long flags;
|
||||
u32 sw_cons, raw_cons;
|
||||
bool rc = true;
|
||||
|
||||
spin_lock_irqsave(&cq->hwq.lock, flags);
|
||||
raw_cons = cq->hwq.cons;
|
||||
sw_cons = HWQ_CMP(raw_cons, &cq->hwq);
|
||||
hw_cqe_ptr = (struct cq_base **)cq->hwq.pbl_ptr;
|
||||
hw_cqe = &hw_cqe_ptr[CQE_PG(sw_cons)][CQE_IDX(sw_cons)];
|
||||
|
||||
/* Check for Valid bit. If the CQE is valid, return false */
|
||||
rc = !CQE_CMP_VALID(hw_cqe, raw_cons, cq->hwq.max_elements);
|
||||
spin_unlock_irqrestore(&cq->hwq.lock, flags);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int bnxt_qplib_cq_process_res_raweth_qp1(struct bnxt_qplib_cq *cq,
|
||||
struct cq_res_raweth_qp1 *hwcqe,
|
||||
struct bnxt_qplib_cqe **pcqe,
|
||||
|
@ -449,6 +449,7 @@ int bnxt_qplib_create_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq);
|
||||
int bnxt_qplib_destroy_cq(struct bnxt_qplib_res *res, struct bnxt_qplib_cq *cq);
|
||||
int bnxt_qplib_poll_cq(struct bnxt_qplib_cq *cq, struct bnxt_qplib_cqe *cqe,
|
||||
int num, struct bnxt_qplib_qp **qp);
|
||||
bool bnxt_qplib_is_cq_empty(struct bnxt_qplib_cq *cq);
|
||||
void bnxt_qplib_req_notify_cq(struct bnxt_qplib_cq *cq, u32 arm_type);
|
||||
void bnxt_qplib_free_nq(struct bnxt_qplib_nq *nq);
|
||||
int bnxt_qplib_alloc_nq(struct pci_dev *pdev, struct bnxt_qplib_nq *nq);
|
||||
|
Loading…
Reference in New Issue
Block a user