Lines Matching refs:uobj
86 static void init_uobj(struct ib_uobject *uobj, u64 user_handle, in init_uobj() argument
89 uobj->user_handle = user_handle; in init_uobj()
90 uobj->context = context; in init_uobj()
91 kref_init(&uobj->ref); in init_uobj()
92 init_rwsem(&uobj->mutex); in init_uobj()
93 lockdep_set_class_and_name(&uobj->mutex, &c->key, c->name); in init_uobj()
94 uobj->live = 0; in init_uobj()
102 static void put_uobj(struct ib_uobject *uobj) in put_uobj() argument
104 kref_put(&uobj->ref, release_uobj); in put_uobj()
107 static void put_uobj_read(struct ib_uobject *uobj) in put_uobj_read() argument
109 up_read(&uobj->mutex); in put_uobj_read()
110 put_uobj(uobj); in put_uobj_read()
113 static void put_uobj_write(struct ib_uobject *uobj) in put_uobj_write() argument
115 up_write(&uobj->mutex); in put_uobj_write()
116 put_uobj(uobj); in put_uobj_write()
119 static int idr_add_uobj(struct idr *idr, struct ib_uobject *uobj) in idr_add_uobj() argument
126 ret = idr_alloc(idr, uobj, 0, 0, GFP_NOWAIT); in idr_add_uobj()
128 uobj->id = ret; in idr_add_uobj()
136 void idr_remove_uobj(struct idr *idr, struct ib_uobject *uobj) in idr_remove_uobj() argument
139 idr_remove(idr, uobj->id); in idr_remove_uobj()
146 struct ib_uobject *uobj; in __idr_get_uobj() local
149 uobj = idr_find(idr, id); in __idr_get_uobj()
150 if (uobj) { in __idr_get_uobj()
151 if (uobj->context == context) in __idr_get_uobj()
152 kref_get(&uobj->ref); in __idr_get_uobj()
154 uobj = NULL; in __idr_get_uobj()
158 return uobj; in __idr_get_uobj()
164 struct ib_uobject *uobj; in idr_read_uobj() local
166 uobj = __idr_get_uobj(idr, id, context); in idr_read_uobj()
167 if (!uobj) in idr_read_uobj()
171 down_read_nested(&uobj->mutex, SINGLE_DEPTH_NESTING); in idr_read_uobj()
173 down_read(&uobj->mutex); in idr_read_uobj()
174 if (!uobj->live) { in idr_read_uobj()
175 put_uobj_read(uobj); in idr_read_uobj()
179 return uobj; in idr_read_uobj()
185 struct ib_uobject *uobj; in idr_write_uobj() local
187 uobj = __idr_get_uobj(idr, id, context); in idr_write_uobj()
188 if (!uobj) in idr_write_uobj()
191 down_write(&uobj->mutex); in idr_write_uobj()
192 if (!uobj->live) { in idr_write_uobj()
193 put_uobj_write(uobj); in idr_write_uobj()
197 return uobj; in idr_write_uobj()
203 struct ib_uobject *uobj; in idr_read_obj() local
205 uobj = idr_read_uobj(idr, id, context, nested); in idr_read_obj()
206 return uobj ? uobj->object : NULL; in idr_read_obj()
246 struct ib_uobject *uobj; in idr_write_qp() local
248 uobj = idr_write_uobj(&ib_uverbs_qp_idr, qp_handle, context); in idr_write_qp()
249 return uobj ? uobj->object : NULL; in idr_write_qp()
273 struct ib_uobject **uobj) in idr_read_xrcd() argument
275 *uobj = idr_read_uobj(&ib_uverbs_xrcd_idr, xrcd_handle, context, 0); in idr_read_xrcd()
276 return *uobj ? (*uobj)->object : NULL; in idr_read_xrcd()
279 static void put_xrcd_read(struct ib_uobject *uobj) in put_xrcd_read() argument
281 put_uobj_read(uobj); in put_xrcd_read()
535 struct ib_uobject *uobj; in ib_uverbs_alloc_pd() local
549 uobj = kmalloc(sizeof *uobj, GFP_KERNEL); in ib_uverbs_alloc_pd()
550 if (!uobj) in ib_uverbs_alloc_pd()
553 init_uobj(uobj, 0, file->ucontext, &pd_lock_class); in ib_uverbs_alloc_pd()
554 down_write(&uobj->mutex); in ib_uverbs_alloc_pd()
564 pd->uobject = uobj; in ib_uverbs_alloc_pd()
567 uobj->object = pd; in ib_uverbs_alloc_pd()
568 ret = idr_add_uobj(&ib_uverbs_pd_idr, uobj); in ib_uverbs_alloc_pd()
573 resp.pd_handle = uobj->id; in ib_uverbs_alloc_pd()
582 list_add_tail(&uobj->list, &file->ucontext->pd_list); in ib_uverbs_alloc_pd()
585 uobj->live = 1; in ib_uverbs_alloc_pd()
587 up_write(&uobj->mutex); in ib_uverbs_alloc_pd()
592 idr_remove_uobj(&ib_uverbs_pd_idr, uobj); in ib_uverbs_alloc_pd()
598 put_uobj_write(uobj); in ib_uverbs_alloc_pd()
607 struct ib_uobject *uobj; in ib_uverbs_dealloc_pd() local
613 uobj = idr_write_uobj(&ib_uverbs_pd_idr, cmd.pd_handle, file->ucontext); in ib_uverbs_dealloc_pd()
614 if (!uobj) in ib_uverbs_dealloc_pd()
617 ret = ib_dealloc_pd(uobj->object); in ib_uverbs_dealloc_pd()
619 uobj->live = 0; in ib_uverbs_dealloc_pd()
621 put_uobj_write(uobj); in ib_uverbs_dealloc_pd()
626 idr_remove_uobj(&ib_uverbs_pd_idr, uobj); in ib_uverbs_dealloc_pd()
629 list_del(&uobj->list); in ib_uverbs_dealloc_pd()
632 put_uobj(uobj); in ib_uverbs_dealloc_pd()
864 struct ib_uobject *uobj; in ib_uverbs_close_xrcd() local
875 uobj = idr_write_uobj(&ib_uverbs_xrcd_idr, cmd.xrcd_handle, file->ucontext); in ib_uverbs_close_xrcd()
876 if (!uobj) { in ib_uverbs_close_xrcd()
881 xrcd = uobj->object; in ib_uverbs_close_xrcd()
883 obj = container_of(uobj, struct ib_uxrcd_object, uobject); in ib_uverbs_close_xrcd()
885 put_uobj_write(uobj); in ib_uverbs_close_xrcd()
891 ret = ib_dealloc_xrcd(uobj->object); in ib_uverbs_close_xrcd()
893 uobj->live = 0; in ib_uverbs_close_xrcd()
896 live = uobj->live; in ib_uverbs_close_xrcd()
900 put_uobj_write(uobj); in ib_uverbs_close_xrcd()
908 idr_remove_uobj(&ib_uverbs_xrcd_idr, uobj); in ib_uverbs_close_xrcd()
910 list_del(&uobj->list); in ib_uverbs_close_xrcd()
913 put_uobj(uobj); in ib_uverbs_close_xrcd()
943 struct ib_uobject *uobj; in ib_uverbs_reg_mr() local
965 uobj = kmalloc(sizeof *uobj, GFP_KERNEL); in ib_uverbs_reg_mr()
966 if (!uobj) in ib_uverbs_reg_mr()
969 init_uobj(uobj, 0, file->ucontext, &mr_lock_class); in ib_uverbs_reg_mr()
970 down_write(&uobj->mutex); in ib_uverbs_reg_mr()
999 mr->uobject = uobj; in ib_uverbs_reg_mr()
1003 uobj->object = mr; in ib_uverbs_reg_mr()
1004 ret = idr_add_uobj(&ib_uverbs_mr_idr, uobj); in ib_uverbs_reg_mr()
1011 resp.mr_handle = uobj->id; in ib_uverbs_reg_mr()
1022 list_add_tail(&uobj->list, &file->ucontext->mr_list); in ib_uverbs_reg_mr()
1025 uobj->live = 1; in ib_uverbs_reg_mr()
1027 up_write(&uobj->mutex); in ib_uverbs_reg_mr()
1032 idr_remove_uobj(&ib_uverbs_mr_idr, uobj); in ib_uverbs_reg_mr()
1041 put_uobj_write(uobj); in ib_uverbs_reg_mr()
1056 struct ib_uobject *uobj; in ib_uverbs_rereg_mr() local
1076 uobj = idr_write_uobj(&ib_uverbs_mr_idr, cmd.mr_handle, in ib_uverbs_rereg_mr()
1079 if (!uobj) in ib_uverbs_rereg_mr()
1082 mr = uobj->object; in ib_uverbs_rereg_mr()
1144 struct ib_uobject *uobj; in ib_uverbs_dereg_mr() local
1150 uobj = idr_write_uobj(&ib_uverbs_mr_idr, cmd.mr_handle, file->ucontext); in ib_uverbs_dereg_mr()
1151 if (!uobj) in ib_uverbs_dereg_mr()
1154 mr = uobj->object; in ib_uverbs_dereg_mr()
1158 uobj->live = 0; in ib_uverbs_dereg_mr()
1160 put_uobj_write(uobj); in ib_uverbs_dereg_mr()
1165 idr_remove_uobj(&ib_uverbs_mr_idr, uobj); in ib_uverbs_dereg_mr()
1168 list_del(&uobj->list); in ib_uverbs_dereg_mr()
1171 put_uobj(uobj); in ib_uverbs_dereg_mr()
1182 struct ib_uobject *uobj; in ib_uverbs_alloc_mw() local
1193 uobj = kmalloc(sizeof(*uobj), GFP_KERNEL); in ib_uverbs_alloc_mw()
1194 if (!uobj) in ib_uverbs_alloc_mw()
1197 init_uobj(uobj, 0, file->ucontext, &mw_lock_class); in ib_uverbs_alloc_mw()
1198 down_write(&uobj->mutex); in ib_uverbs_alloc_mw()
1214 mw->uobject = uobj; in ib_uverbs_alloc_mw()
1217 uobj->object = mw; in ib_uverbs_alloc_mw()
1218 ret = idr_add_uobj(&ib_uverbs_mw_idr, uobj); in ib_uverbs_alloc_mw()
1224 resp.mw_handle = uobj->id; in ib_uverbs_alloc_mw()
1235 list_add_tail(&uobj->list, &file->ucontext->mw_list); in ib_uverbs_alloc_mw()
1238 uobj->live = 1; in ib_uverbs_alloc_mw()
1240 up_write(&uobj->mutex); in ib_uverbs_alloc_mw()
1245 idr_remove_uobj(&ib_uverbs_mw_idr, uobj); in ib_uverbs_alloc_mw()
1254 put_uobj_write(uobj); in ib_uverbs_alloc_mw()
1264 struct ib_uobject *uobj; in ib_uverbs_dealloc_mw() local
1270 uobj = idr_write_uobj(&ib_uverbs_mw_idr, cmd.mw_handle, file->ucontext); in ib_uverbs_dealloc_mw()
1271 if (!uobj) in ib_uverbs_dealloc_mw()
1274 mw = uobj->object; in ib_uverbs_dealloc_mw()
1278 uobj->live = 0; in ib_uverbs_dealloc_mw()
1280 put_uobj_write(uobj); in ib_uverbs_dealloc_mw()
1285 idr_remove_uobj(&ib_uverbs_mw_idr, uobj); in ib_uverbs_dealloc_mw()
1288 list_del(&uobj->list); in ib_uverbs_dealloc_mw()
1291 put_uobj(uobj); in ib_uverbs_dealloc_mw()
1576 struct ib_uobject *uobj; in ib_uverbs_destroy_cq() local
1585 uobj = idr_write_uobj(&ib_uverbs_cq_idr, cmd.cq_handle, file->ucontext); in ib_uverbs_destroy_cq()
1586 if (!uobj) in ib_uverbs_destroy_cq()
1588 cq = uobj->object; in ib_uverbs_destroy_cq()
1594 uobj->live = 0; in ib_uverbs_destroy_cq()
1596 put_uobj_write(uobj); in ib_uverbs_destroy_cq()
1601 idr_remove_uobj(&ib_uverbs_cq_idr, uobj); in ib_uverbs_destroy_cq()
1604 list_del(&uobj->list); in ib_uverbs_destroy_cq()
1613 put_uobj(uobj); in ib_uverbs_destroy_cq()
2127 struct ib_uobject *uobj; in ib_uverbs_destroy_qp() local
2137 uobj = idr_write_uobj(&ib_uverbs_qp_idr, cmd.qp_handle, file->ucontext); in ib_uverbs_destroy_qp()
2138 if (!uobj) in ib_uverbs_destroy_qp()
2140 qp = uobj->object; in ib_uverbs_destroy_qp()
2141 obj = container_of(uobj, struct ib_uqp_object, uevent.uobject); in ib_uverbs_destroy_qp()
2144 put_uobj_write(uobj); in ib_uverbs_destroy_qp()
2150 uobj->live = 0; in ib_uverbs_destroy_qp()
2152 put_uobj_write(uobj); in ib_uverbs_destroy_qp()
2160 idr_remove_uobj(&ib_uverbs_qp_idr, uobj); in ib_uverbs_destroy_qp()
2163 list_del(&uobj->list); in ib_uverbs_destroy_qp()
2170 put_uobj(uobj); in ib_uverbs_destroy_qp()
2535 struct ib_uobject *uobj; in ib_uverbs_create_ah() local
2547 uobj = kmalloc(sizeof *uobj, GFP_KERNEL); in ib_uverbs_create_ah()
2548 if (!uobj) in ib_uverbs_create_ah()
2551 init_uobj(uobj, cmd.user_handle, file->ucontext, &ah_lock_class); in ib_uverbs_create_ah()
2552 down_write(&uobj->mutex); in ib_uverbs_create_ah()
2580 ah->uobject = uobj; in ib_uverbs_create_ah()
2581 uobj->object = ah; in ib_uverbs_create_ah()
2583 ret = idr_add_uobj(&ib_uverbs_ah_idr, uobj); in ib_uverbs_create_ah()
2587 resp.ah_handle = uobj->id; in ib_uverbs_create_ah()
2598 list_add_tail(&uobj->list, &file->ucontext->ah_list); in ib_uverbs_create_ah()
2601 uobj->live = 1; in ib_uverbs_create_ah()
2603 up_write(&uobj->mutex); in ib_uverbs_create_ah()
2608 idr_remove_uobj(&ib_uverbs_ah_idr, uobj); in ib_uverbs_create_ah()
2617 put_uobj_write(uobj); in ib_uverbs_create_ah()
2626 struct ib_uobject *uobj; in ib_uverbs_destroy_ah() local
2632 uobj = idr_write_uobj(&ib_uverbs_ah_idr, cmd.ah_handle, file->ucontext); in ib_uverbs_destroy_ah()
2633 if (!uobj) in ib_uverbs_destroy_ah()
2635 ah = uobj->object; in ib_uverbs_destroy_ah()
2639 uobj->live = 0; in ib_uverbs_destroy_ah()
2641 put_uobj_write(uobj); in ib_uverbs_destroy_ah()
2646 idr_remove_uobj(&ib_uverbs_ah_idr, uobj); in ib_uverbs_destroy_ah()
2649 list_del(&uobj->list); in ib_uverbs_destroy_ah()
2652 put_uobj(uobj); in ib_uverbs_destroy_ah()
2790 struct ib_uobject *uobj; in ib_uverbs_ex_create_flow() local
2847 uobj = kmalloc(sizeof(*uobj), GFP_KERNEL); in ib_uverbs_ex_create_flow()
2848 if (!uobj) { in ib_uverbs_ex_create_flow()
2852 init_uobj(uobj, 0, file->ucontext, &rule_lock_class); in ib_uverbs_ex_create_flow()
2853 down_write(&uobj->mutex); in ib_uverbs_ex_create_flow()
2901 flow_id->uobject = uobj; in ib_uverbs_ex_create_flow()
2902 uobj->object = flow_id; in ib_uverbs_ex_create_flow()
2904 err = idr_add_uobj(&ib_uverbs_rule_idr, uobj); in ib_uverbs_ex_create_flow()
2909 resp.flow_handle = uobj->id; in ib_uverbs_ex_create_flow()
2918 list_add_tail(&uobj->list, &file->ucontext->rule_list); in ib_uverbs_ex_create_flow()
2921 uobj->live = 1; in ib_uverbs_ex_create_flow()
2923 up_write(&uobj->mutex); in ib_uverbs_ex_create_flow()
2929 idr_remove_uobj(&ib_uverbs_rule_idr, uobj); in ib_uverbs_ex_create_flow()
2937 put_uobj_write(uobj); in ib_uverbs_ex_create_flow()
2950 struct ib_uobject *uobj; in ib_uverbs_ex_destroy_flow() local
2963 uobj = idr_write_uobj(&ib_uverbs_rule_idr, cmd.flow_handle, in ib_uverbs_ex_destroy_flow()
2965 if (!uobj) in ib_uverbs_ex_destroy_flow()
2967 flow_id = uobj->object; in ib_uverbs_ex_destroy_flow()
2971 uobj->live = 0; in ib_uverbs_ex_destroy_flow()
2973 put_uobj_write(uobj); in ib_uverbs_ex_destroy_flow()
2975 idr_remove_uobj(&ib_uverbs_rule_idr, uobj); in ib_uverbs_ex_destroy_flow()
2978 list_del(&uobj->list); in ib_uverbs_ex_destroy_flow()
2981 put_uobj(uobj); in ib_uverbs_ex_destroy_flow()
3255 struct ib_uobject *uobj; in ib_uverbs_destroy_srq() local
3265 uobj = idr_write_uobj(&ib_uverbs_srq_idr, cmd.srq_handle, file->ucontext); in ib_uverbs_destroy_srq()
3266 if (!uobj) in ib_uverbs_destroy_srq()
3268 srq = uobj->object; in ib_uverbs_destroy_srq()
3269 obj = container_of(uobj, struct ib_uevent_object, uobject); in ib_uverbs_destroy_srq()
3274 uobj->live = 0; in ib_uverbs_destroy_srq()
3276 put_uobj_write(uobj); in ib_uverbs_destroy_srq()
3286 idr_remove_uobj(&ib_uverbs_srq_idr, uobj); in ib_uverbs_destroy_srq()
3289 list_del(&uobj->list); in ib_uverbs_destroy_srq()
3297 put_uobj(uobj); in ib_uverbs_destroy_srq()