diff options
author | Bryan Tan <bryantan@vmware.com> | 2017-08-10 15:05:02 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2017-08-16 10:56:04 -0400 |
commit | a7d2e03928c1936004750c56faf7534c8534f875 (patch) | |
tree | fa3937c849945344e71c5a8a53daeb21051332aa | |
parent | 48107c4e596c8523d46c7b04f92cf29e7569a01e (diff) |
RDMA/vmw_pvrdma: Report CQ missed events
There is a chance of a race between arming the CQ and receiving
completions. By reporting CQ missed events any ULPs should poll
again to get the completions.
Fixes: 29c8d9eba550 ("IB: Add vmw_pvrdma driver")
Acked-by: Aditya Sarwade <asarwade@vmware.com>
Signed-off-by: Bryan Tan <bryantan@vmware.com>
Signed-off-by: Adit Ranadive <aditr@vmware.com>
Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c index 69bda611d313..90aa326fd7c0 100644 --- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c +++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c | |||
@@ -65,13 +65,28 @@ int pvrdma_req_notify_cq(struct ib_cq *ibcq, | |||
65 | struct pvrdma_dev *dev = to_vdev(ibcq->device); | 65 | struct pvrdma_dev *dev = to_vdev(ibcq->device); |
66 | struct pvrdma_cq *cq = to_vcq(ibcq); | 66 | struct pvrdma_cq *cq = to_vcq(ibcq); |
67 | u32 val = cq->cq_handle; | 67 | u32 val = cq->cq_handle; |
68 | unsigned long flags; | ||
69 | int has_data = 0; | ||
68 | 70 | ||
69 | val |= (notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ? | 71 | val |= (notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED ? |
70 | PVRDMA_UAR_CQ_ARM_SOL : PVRDMA_UAR_CQ_ARM; | 72 | PVRDMA_UAR_CQ_ARM_SOL : PVRDMA_UAR_CQ_ARM; |
71 | 73 | ||
74 | spin_lock_irqsave(&cq->cq_lock, flags); | ||
75 | |||
72 | pvrdma_write_uar_cq(dev, val); | 76 | pvrdma_write_uar_cq(dev, val); |
73 | 77 | ||
74 | return 0; | 78 | if (notify_flags & IB_CQ_REPORT_MISSED_EVENTS) { |
79 | unsigned int head; | ||
80 | |||
81 | has_data = pvrdma_idx_ring_has_data(&cq->ring_state->rx, | ||
82 | cq->ibcq.cqe, &head); | ||
83 | if (unlikely(has_data == PVRDMA_INVALID_IDX)) | ||
84 | dev_err(&dev->pdev->dev, "CQ ring state invalid\n"); | ||
85 | } | ||
86 | |||
87 | spin_unlock_irqrestore(&cq->cq_lock, flags); | ||
88 | |||
89 | return has_data; | ||
75 | } | 90 | } |
76 | 91 | ||
77 | /** | 92 | /** |