RDMA/rxe: Simplify cq->notify code
authorBob Pearson <rpearsonhpe@gmail.com>
Mon, 12 Jun 2023 16:22:45 +0000 (11:22 -0500)
committerJason Gunthorpe <jgg@nvidia.com>
Tue, 20 Jun 2023 15:46:18 +0000 (12:46 -0300)
The flags parameter to the request notify verb is a bitmask. But, rxe
driver treats cq->notify as an int. If someone ever set both the
IB_CQ_SOLICITED and the IB_CQ_NEXT_COMP bits rxe_cq_post could fail to
generate a completion event. This patch treats the notify flags as a bit
mask consistently and can handle the above case correctly.

Link: https://lore.kernel.org/r/20230612162244.20038-1-rpearsonhpe@gmail.com
Signed-off-by: Bob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/sw/rxe/rxe_cq.c
drivers/infiniband/sw/rxe/rxe_verbs.c

index 20ff0c0..31a25aa 100644 (file)
@@ -115,10 +115,9 @@ int rxe_cq_post(struct rxe_cq *cq, struct rxe_cqe *cqe, int solicited)
 
        spin_unlock_irqrestore(&cq->cq_lock, flags);
 
-       if ((cq->notify == IB_CQ_NEXT_COMP) ||
-           (cq->notify == IB_CQ_SOLICITED && solicited)) {
+       if ((cq->notify & IB_CQ_NEXT_COMP) ||
+           (cq->notify & IB_CQ_SOLICITED && solicited)) {
                cq->notify = 0;
-
                cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context);
        }
 
index f639633..515f9ff 100644 (file)
@@ -1181,9 +1181,7 @@ static int rxe_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
        unsigned long irq_flags;
 
        spin_lock_irqsave(&cq->cq_lock, irq_flags);
-       if (cq->notify != IB_CQ_NEXT_COMP)
-               cq->notify = flags & IB_CQ_SOLICITED_MASK;
-
+       cq->notify |= flags & IB_CQ_SOLICITED_MASK;
        empty = queue_empty(cq->queue, QUEUE_TYPE_TO_ULP);
 
        if ((flags & IB_CQ_REPORT_MISSED_EVENTS) && !empty)