diff options
Diffstat (limited to 'drivers/infiniband/core/cq.c')
| -rw-r--r-- | drivers/infiniband/core/cq.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/infiniband/core/cq.c b/drivers/infiniband/core/cq.c index e95510117a6d..f2ae75fa3128 100644 --- a/drivers/infiniband/core/cq.c +++ b/drivers/infiniband/core/cq.c | |||
| @@ -29,7 +29,13 @@ static int __ib_process_cq(struct ib_cq *cq, int budget) | |||
| 29 | { | 29 | { |
| 30 | int i, n, completed = 0; | 30 | int i, n, completed = 0; |
| 31 | 31 | ||
| 32 | while ((n = ib_poll_cq(cq, IB_POLL_BATCH, cq->wc)) > 0) { | 32 | /* |
| 33 | * budget might be (-1) if the caller does not | ||
| 34 | * want to bound this call, thus we need unsigned | ||
| 35 | * minimum here. | ||
| 36 | */ | ||
| 37 | while ((n = ib_poll_cq(cq, min_t(u32, IB_POLL_BATCH, | ||
| 38 | budget - completed), cq->wc)) > 0) { | ||
| 33 | for (i = 0; i < n; i++) { | 39 | for (i = 0; i < n; i++) { |
| 34 | struct ib_wc *wc = &cq->wc[i]; | 40 | struct ib_wc *wc = &cq->wc[i]; |
| 35 | 41 | ||
| @@ -196,7 +202,7 @@ void ib_free_cq(struct ib_cq *cq) | |||
| 196 | irq_poll_disable(&cq->iop); | 202 | irq_poll_disable(&cq->iop); |
| 197 | break; | 203 | break; |
| 198 | case IB_POLL_WORKQUEUE: | 204 | case IB_POLL_WORKQUEUE: |
| 199 | flush_work(&cq->work); | 205 | cancel_work_sync(&cq->work); |
| 200 | break; | 206 | break; |
| 201 | default: | 207 | default: |
| 202 | WARN_ON_ONCE(1); | 208 | WARN_ON_ONCE(1); |
