diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/verbs.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index cbe85ddaf898..25c1c1ea4460 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
@@ -251,6 +251,12 @@ struct ib_srq *ib_create_srq(struct ib_pd *pd, | |||
251 | srq->event_handler = srq_init_attr->event_handler; | 251 | srq->event_handler = srq_init_attr->event_handler; |
252 | srq->srq_context = srq_init_attr->srq_context; | 252 | srq->srq_context = srq_init_attr->srq_context; |
253 | srq->srq_type = srq_init_attr->srq_type; | 253 | srq->srq_type = srq_init_attr->srq_type; |
254 | if (srq->srq_type == IB_SRQT_XRC) { | ||
255 | srq->ext.xrc.xrcd = srq_init_attr->ext.xrc.xrcd; | ||
256 | srq->ext.xrc.cq = srq_init_attr->ext.xrc.cq; | ||
257 | atomic_inc(&srq->ext.xrc.xrcd->usecnt); | ||
258 | atomic_inc(&srq->ext.xrc.cq->usecnt); | ||
259 | } | ||
254 | atomic_inc(&pd->usecnt); | 260 | atomic_inc(&pd->usecnt); |
255 | atomic_set(&srq->usecnt, 0); | 261 | atomic_set(&srq->usecnt, 0); |
256 | } | 262 | } |
@@ -280,16 +286,29 @@ EXPORT_SYMBOL(ib_query_srq); | |||
280 | int ib_destroy_srq(struct ib_srq *srq) | 286 | int ib_destroy_srq(struct ib_srq *srq) |
281 | { | 287 | { |
282 | struct ib_pd *pd; | 288 | struct ib_pd *pd; |
289 | enum ib_srq_type srq_type; | ||
290 | struct ib_xrcd *uninitialized_var(xrcd); | ||
291 | struct ib_cq *uninitialized_var(cq); | ||
283 | int ret; | 292 | int ret; |
284 | 293 | ||
285 | if (atomic_read(&srq->usecnt)) | 294 | if (atomic_read(&srq->usecnt)) |
286 | return -EBUSY; | 295 | return -EBUSY; |
287 | 296 | ||
288 | pd = srq->pd; | 297 | pd = srq->pd; |
298 | srq_type = srq->srq_type; | ||
299 | if (srq_type == IB_SRQT_XRC) { | ||
300 | xrcd = srq->ext.xrc.xrcd; | ||
301 | cq = srq->ext.xrc.cq; | ||
302 | } | ||
289 | 303 | ||
290 | ret = srq->device->destroy_srq(srq); | 304 | ret = srq->device->destroy_srq(srq); |
291 | if (!ret) | 305 | if (!ret) { |
292 | atomic_dec(&pd->usecnt); | 306 | atomic_dec(&pd->usecnt); |
307 | if (srq_type == IB_SRQT_XRC) { | ||
308 | atomic_dec(&xrcd->usecnt); | ||
309 | atomic_dec(&cq->usecnt); | ||
310 | } | ||
311 | } | ||
293 | 312 | ||
294 | return ret; | 313 | return ret; |
295 | } | 314 | } |