diff options
-rw-r--r-- | drivers/infiniband/core/verbs.c | 21 | ||||
-rw-r--r-- | include/rdma/ib_verbs.h | 18 |
2 files changed, 37 insertions, 2 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 | } |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index d0c2dc034054..516647a22135 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -524,7 +524,8 @@ enum ib_cq_notify_flags { | |||
524 | }; | 524 | }; |
525 | 525 | ||
526 | enum ib_srq_type { | 526 | enum ib_srq_type { |
527 | IB_SRQT_BASIC | 527 | IB_SRQT_BASIC, |
528 | IB_SRQT_XRC | ||
528 | }; | 529 | }; |
529 | 530 | ||
530 | enum ib_srq_attr_mask { | 531 | enum ib_srq_attr_mask { |
@@ -543,6 +544,13 @@ struct ib_srq_init_attr { | |||
543 | void *srq_context; | 544 | void *srq_context; |
544 | struct ib_srq_attr attr; | 545 | struct ib_srq_attr attr; |
545 | enum ib_srq_type srq_type; | 546 | enum ib_srq_type srq_type; |
547 | |||
548 | union { | ||
549 | struct { | ||
550 | struct ib_xrcd *xrcd; | ||
551 | struct ib_cq *cq; | ||
552 | } xrc; | ||
553 | } ext; | ||
546 | }; | 554 | }; |
547 | 555 | ||
548 | struct ib_qp_cap { | 556 | struct ib_qp_cap { |
@@ -895,6 +903,14 @@ struct ib_srq { | |||
895 | void *srq_context; | 903 | void *srq_context; |
896 | enum ib_srq_type srq_type; | 904 | enum ib_srq_type srq_type; |
897 | atomic_t usecnt; | 905 | atomic_t usecnt; |
906 | |||
907 | union { | ||
908 | struct { | ||
909 | struct ib_xrcd *xrcd; | ||
910 | struct ib_cq *cq; | ||
911 | u32 srq_num; | ||
912 | } xrc; | ||
913 | } ext; | ||
898 | }; | 914 | }; |
899 | 915 | ||
900 | struct ib_qp { | 916 | struct ib_qp { |