Lines Matching refs:uobj

88 static void init_uobj(struct ib_uobject *uobj, u64 user_handle,  in init_uobj()  argument
91 uobj->user_handle = user_handle; in init_uobj()
92 uobj->context = context; in init_uobj()
93 kref_init(&uobj->ref); in init_uobj()
94 init_rwsem(&uobj->mutex); in init_uobj()
95 lockdep_set_class_and_name(&uobj->mutex, &c->key, c->name); in init_uobj()
96 uobj->live = 0; in init_uobj()
104 static void put_uobj(struct ib_uobject *uobj) in put_uobj() argument
106 kref_put(&uobj->ref, release_uobj); in put_uobj()
109 static void put_uobj_read(struct ib_uobject *uobj) in put_uobj_read() argument
111 up_read(&uobj->mutex); in put_uobj_read()
112 put_uobj(uobj); in put_uobj_read()
115 static void put_uobj_write(struct ib_uobject *uobj) in put_uobj_write() argument
117 up_write(&uobj->mutex); in put_uobj_write()
118 put_uobj(uobj); in put_uobj_write()
121 static int idr_add_uobj(struct idr *idr, struct ib_uobject *uobj) in idr_add_uobj() argument
128 ret = idr_alloc(idr, uobj, 0, 0, GFP_NOWAIT); in idr_add_uobj()
130 uobj->id = ret; in idr_add_uobj()
138 void idr_remove_uobj(struct idr *idr, struct ib_uobject *uobj) in idr_remove_uobj() argument
141 idr_remove(idr, uobj->id); in idr_remove_uobj()
148 struct ib_uobject *uobj; in __idr_get_uobj() local
151 uobj = idr_find(idr, id); in __idr_get_uobj()
152 if (uobj) { in __idr_get_uobj()
153 if (uobj->context == context) in __idr_get_uobj()
154 kref_get(&uobj->ref); in __idr_get_uobj()
156 uobj = NULL; in __idr_get_uobj()
160 return uobj; in __idr_get_uobj()
166 struct ib_uobject *uobj; in idr_read_uobj() local
168 uobj = __idr_get_uobj(idr, id, context); in idr_read_uobj()
169 if (!uobj) in idr_read_uobj()
173 down_read_nested(&uobj->mutex, SINGLE_DEPTH_NESTING); in idr_read_uobj()
175 down_read(&uobj->mutex); in idr_read_uobj()
176 if (!uobj->live) { in idr_read_uobj()
177 put_uobj_read(uobj); in idr_read_uobj()
181 return uobj; in idr_read_uobj()
187 struct ib_uobject *uobj; in idr_write_uobj() local
189 uobj = __idr_get_uobj(idr, id, context); in idr_write_uobj()
190 if (!uobj) in idr_write_uobj()
193 down_write(&uobj->mutex); in idr_write_uobj()
194 if (!uobj->live) { in idr_write_uobj()
195 put_uobj_write(uobj); in idr_write_uobj()
199 return uobj; in idr_write_uobj()
205 struct ib_uobject *uobj; in idr_read_obj() local
207 uobj = idr_read_uobj(idr, id, context, nested); in idr_read_obj()
208 return uobj ? uobj->object : NULL; in idr_read_obj()
248 struct ib_uobject *uobj; in idr_write_qp() local
250 uobj = idr_write_uobj(&ib_uverbs_qp_idr, qp_handle, context); in idr_write_qp()
251 return uobj ? uobj->object : NULL; in idr_write_qp()
275 struct ib_uobject **uobj) in idr_read_xrcd() argument
277 *uobj = idr_read_uobj(&ib_uverbs_xrcd_idr, xrcd_handle, context, 0); in idr_read_xrcd()
278 return *uobj ? (*uobj)->object : NULL; in idr_read_xrcd()
281 static void put_xrcd_read(struct ib_uobject *uobj) in put_xrcd_read() argument
283 put_uobj_read(uobj); in put_xrcd_read()
532 struct ib_uobject *uobj; in ib_uverbs_alloc_pd() local
546 uobj = kmalloc(sizeof *uobj, GFP_KERNEL); in ib_uverbs_alloc_pd()
547 if (!uobj) in ib_uverbs_alloc_pd()
550 init_uobj(uobj, 0, file->ucontext, &pd_lock_class); in ib_uverbs_alloc_pd()
551 down_write(&uobj->mutex); in ib_uverbs_alloc_pd()
560 pd->uobject = uobj; in ib_uverbs_alloc_pd()
564 uobj->object = pd; in ib_uverbs_alloc_pd()
565 ret = idr_add_uobj(&ib_uverbs_pd_idr, uobj); in ib_uverbs_alloc_pd()
570 resp.pd_handle = uobj->id; in ib_uverbs_alloc_pd()
579 list_add_tail(&uobj->list, &file->ucontext->pd_list); in ib_uverbs_alloc_pd()
582 uobj->live = 1; in ib_uverbs_alloc_pd()
584 up_write(&uobj->mutex); in ib_uverbs_alloc_pd()
589 idr_remove_uobj(&ib_uverbs_pd_idr, uobj); in ib_uverbs_alloc_pd()
595 put_uobj_write(uobj); in ib_uverbs_alloc_pd()
605 struct ib_uobject *uobj; in ib_uverbs_dealloc_pd() local
612 uobj = idr_write_uobj(&ib_uverbs_pd_idr, cmd.pd_handle, file->ucontext); in ib_uverbs_dealloc_pd()
613 if (!uobj) in ib_uverbs_dealloc_pd()
615 pd = uobj->object; in ib_uverbs_dealloc_pd()
622 ret = pd->device->dealloc_pd(uobj->object); in ib_uverbs_dealloc_pd()
627 uobj->live = 0; in ib_uverbs_dealloc_pd()
628 put_uobj_write(uobj); in ib_uverbs_dealloc_pd()
630 idr_remove_uobj(&ib_uverbs_pd_idr, uobj); in ib_uverbs_dealloc_pd()
633 list_del(&uobj->list); in ib_uverbs_dealloc_pd()
636 put_uobj(uobj); in ib_uverbs_dealloc_pd()
641 put_uobj_write(uobj); in ib_uverbs_dealloc_pd()
873 struct ib_uobject *uobj; in ib_uverbs_close_xrcd() local
884 uobj = idr_write_uobj(&ib_uverbs_xrcd_idr, cmd.xrcd_handle, file->ucontext); in ib_uverbs_close_xrcd()
885 if (!uobj) { in ib_uverbs_close_xrcd()
890 xrcd = uobj->object; in ib_uverbs_close_xrcd()
892 obj = container_of(uobj, struct ib_uxrcd_object, uobject); in ib_uverbs_close_xrcd()
894 put_uobj_write(uobj); in ib_uverbs_close_xrcd()
900 ret = ib_dealloc_xrcd(uobj->object); in ib_uverbs_close_xrcd()
902 uobj->live = 0; in ib_uverbs_close_xrcd()
905 live = uobj->live; in ib_uverbs_close_xrcd()
909 put_uobj_write(uobj); in ib_uverbs_close_xrcd()
917 idr_remove_uobj(&ib_uverbs_xrcd_idr, uobj); in ib_uverbs_close_xrcd()
919 list_del(&uobj->list); in ib_uverbs_close_xrcd()
922 put_uobj(uobj); in ib_uverbs_close_xrcd()
953 struct ib_uobject *uobj; in ib_uverbs_reg_mr() local
975 uobj = kmalloc(sizeof *uobj, GFP_KERNEL); in ib_uverbs_reg_mr()
976 if (!uobj) in ib_uverbs_reg_mr()
979 init_uobj(uobj, 0, file->ucontext, &mr_lock_class); in ib_uverbs_reg_mr()
980 down_write(&uobj->mutex); in ib_uverbs_reg_mr()
1009 mr->uobject = uobj; in ib_uverbs_reg_mr()
1013 uobj->object = mr; in ib_uverbs_reg_mr()
1014 ret = idr_add_uobj(&ib_uverbs_mr_idr, uobj); in ib_uverbs_reg_mr()
1021 resp.mr_handle = uobj->id; in ib_uverbs_reg_mr()
1032 list_add_tail(&uobj->list, &file->ucontext->mr_list); in ib_uverbs_reg_mr()
1035 uobj->live = 1; in ib_uverbs_reg_mr()
1037 up_write(&uobj->mutex); in ib_uverbs_reg_mr()
1042 idr_remove_uobj(&ib_uverbs_mr_idr, uobj); in ib_uverbs_reg_mr()
1051 put_uobj_write(uobj); in ib_uverbs_reg_mr()
1067 struct ib_uobject *uobj; in ib_uverbs_rereg_mr() local
1087 uobj = idr_write_uobj(&ib_uverbs_mr_idr, cmd.mr_handle, in ib_uverbs_rereg_mr()
1090 if (!uobj) in ib_uverbs_rereg_mr()
1093 mr = uobj->object; in ib_uverbs_rereg_mr()
1156 struct ib_uobject *uobj; in ib_uverbs_dereg_mr() local
1162 uobj = idr_write_uobj(&ib_uverbs_mr_idr, cmd.mr_handle, file->ucontext); in ib_uverbs_dereg_mr()
1163 if (!uobj) in ib_uverbs_dereg_mr()
1166 mr = uobj->object; in ib_uverbs_dereg_mr()
1170 uobj->live = 0; in ib_uverbs_dereg_mr()
1172 put_uobj_write(uobj); in ib_uverbs_dereg_mr()
1177 idr_remove_uobj(&ib_uverbs_mr_idr, uobj); in ib_uverbs_dereg_mr()
1180 list_del(&uobj->list); in ib_uverbs_dereg_mr()
1183 put_uobj(uobj); in ib_uverbs_dereg_mr()
1195 struct ib_uobject *uobj; in ib_uverbs_alloc_mw() local
1206 uobj = kmalloc(sizeof(*uobj), GFP_KERNEL); in ib_uverbs_alloc_mw()
1207 if (!uobj) in ib_uverbs_alloc_mw()
1210 init_uobj(uobj, 0, file->ucontext, &mw_lock_class); in ib_uverbs_alloc_mw()
1211 down_write(&uobj->mutex); in ib_uverbs_alloc_mw()
1227 mw->uobject = uobj; in ib_uverbs_alloc_mw()
1230 uobj->object = mw; in ib_uverbs_alloc_mw()
1231 ret = idr_add_uobj(&ib_uverbs_mw_idr, uobj); in ib_uverbs_alloc_mw()
1237 resp.mw_handle = uobj->id; in ib_uverbs_alloc_mw()
1248 list_add_tail(&uobj->list, &file->ucontext->mw_list); in ib_uverbs_alloc_mw()
1251 uobj->live = 1; in ib_uverbs_alloc_mw()
1253 up_write(&uobj->mutex); in ib_uverbs_alloc_mw()
1258 idr_remove_uobj(&ib_uverbs_mw_idr, uobj); in ib_uverbs_alloc_mw()
1267 put_uobj_write(uobj); in ib_uverbs_alloc_mw()
1278 struct ib_uobject *uobj; in ib_uverbs_dealloc_mw() local
1284 uobj = idr_write_uobj(&ib_uverbs_mw_idr, cmd.mw_handle, file->ucontext); in ib_uverbs_dealloc_mw()
1285 if (!uobj) in ib_uverbs_dealloc_mw()
1288 mw = uobj->object; in ib_uverbs_dealloc_mw()
1292 uobj->live = 0; in ib_uverbs_dealloc_mw()
1294 put_uobj_write(uobj); in ib_uverbs_dealloc_mw()
1299 idr_remove_uobj(&ib_uverbs_mw_idr, uobj); in ib_uverbs_dealloc_mw()
1302 list_del(&uobj->list); in ib_uverbs_dealloc_mw()
1305 put_uobj(uobj); in ib_uverbs_dealloc_mw()
1700 struct ib_uobject *uobj; in ib_uverbs_destroy_cq() local
1709 uobj = idr_write_uobj(&ib_uverbs_cq_idr, cmd.cq_handle, file->ucontext); in ib_uverbs_destroy_cq()
1710 if (!uobj) in ib_uverbs_destroy_cq()
1712 cq = uobj->object; in ib_uverbs_destroy_cq()
1718 uobj->live = 0; in ib_uverbs_destroy_cq()
1720 put_uobj_write(uobj); in ib_uverbs_destroy_cq()
1725 idr_remove_uobj(&ib_uverbs_cq_idr, uobj); in ib_uverbs_destroy_cq()
1728 list_del(&uobj->list); in ib_uverbs_destroy_cq()
1737 put_uobj(uobj); in ib_uverbs_destroy_cq()
2380 struct ib_uobject *uobj; in ib_uverbs_destroy_qp() local
2390 uobj = idr_write_uobj(&ib_uverbs_qp_idr, cmd.qp_handle, file->ucontext); in ib_uverbs_destroy_qp()
2391 if (!uobj) in ib_uverbs_destroy_qp()
2393 qp = uobj->object; in ib_uverbs_destroy_qp()
2394 obj = container_of(uobj, struct ib_uqp_object, uevent.uobject); in ib_uverbs_destroy_qp()
2397 put_uobj_write(uobj); in ib_uverbs_destroy_qp()
2403 uobj->live = 0; in ib_uverbs_destroy_qp()
2405 put_uobj_write(uobj); in ib_uverbs_destroy_qp()
2413 idr_remove_uobj(&ib_uverbs_qp_idr, uobj); in ib_uverbs_destroy_qp()
2416 list_del(&uobj->list); in ib_uverbs_destroy_qp()
2423 put_uobj(uobj); in ib_uverbs_destroy_qp()
2818 struct ib_uobject *uobj; in ib_uverbs_create_ah() local
2830 uobj = kmalloc(sizeof *uobj, GFP_KERNEL); in ib_uverbs_create_ah()
2831 if (!uobj) in ib_uverbs_create_ah()
2834 init_uobj(uobj, cmd.user_handle, file->ucontext, &ah_lock_class); in ib_uverbs_create_ah()
2835 down_write(&uobj->mutex); in ib_uverbs_create_ah()
2862 ah->uobject = uobj; in ib_uverbs_create_ah()
2863 uobj->object = ah; in ib_uverbs_create_ah()
2865 ret = idr_add_uobj(&ib_uverbs_ah_idr, uobj); in ib_uverbs_create_ah()
2869 resp.ah_handle = uobj->id; in ib_uverbs_create_ah()
2880 list_add_tail(&uobj->list, &file->ucontext->ah_list); in ib_uverbs_create_ah()
2883 uobj->live = 1; in ib_uverbs_create_ah()
2885 up_write(&uobj->mutex); in ib_uverbs_create_ah()
2890 idr_remove_uobj(&ib_uverbs_ah_idr, uobj); in ib_uverbs_create_ah()
2899 put_uobj_write(uobj); in ib_uverbs_create_ah()
2909 struct ib_uobject *uobj; in ib_uverbs_destroy_ah() local
2915 uobj = idr_write_uobj(&ib_uverbs_ah_idr, cmd.ah_handle, file->ucontext); in ib_uverbs_destroy_ah()
2916 if (!uobj) in ib_uverbs_destroy_ah()
2918 ah = uobj->object; in ib_uverbs_destroy_ah()
2922 uobj->live = 0; in ib_uverbs_destroy_ah()
2924 put_uobj_write(uobj); in ib_uverbs_destroy_ah()
2929 idr_remove_uobj(&ib_uverbs_ah_idr, uobj); in ib_uverbs_destroy_ah()
2932 list_del(&uobj->list); in ib_uverbs_destroy_ah()
2935 put_uobj(uobj); in ib_uverbs_destroy_ah()
3076 struct ib_uobject *uobj; in ib_uverbs_ex_create_flow() local
3133 uobj = kmalloc(sizeof(*uobj), GFP_KERNEL); in ib_uverbs_ex_create_flow()
3134 if (!uobj) { in ib_uverbs_ex_create_flow()
3138 init_uobj(uobj, 0, file->ucontext, &rule_lock_class); in ib_uverbs_ex_create_flow()
3139 down_write(&uobj->mutex); in ib_uverbs_ex_create_flow()
3187 flow_id->uobject = uobj; in ib_uverbs_ex_create_flow()
3188 uobj->object = flow_id; in ib_uverbs_ex_create_flow()
3190 err = idr_add_uobj(&ib_uverbs_rule_idr, uobj); in ib_uverbs_ex_create_flow()
3195 resp.flow_handle = uobj->id; in ib_uverbs_ex_create_flow()
3204 list_add_tail(&uobj->list, &file->ucontext->rule_list); in ib_uverbs_ex_create_flow()
3207 uobj->live = 1; in ib_uverbs_ex_create_flow()
3209 up_write(&uobj->mutex); in ib_uverbs_ex_create_flow()
3215 idr_remove_uobj(&ib_uverbs_rule_idr, uobj); in ib_uverbs_ex_create_flow()
3223 put_uobj_write(uobj); in ib_uverbs_ex_create_flow()
3237 struct ib_uobject *uobj; in ib_uverbs_ex_destroy_flow() local
3250 uobj = idr_write_uobj(&ib_uverbs_rule_idr, cmd.flow_handle, in ib_uverbs_ex_destroy_flow()
3252 if (!uobj) in ib_uverbs_ex_destroy_flow()
3254 flow_id = uobj->object; in ib_uverbs_ex_destroy_flow()
3258 uobj->live = 0; in ib_uverbs_ex_destroy_flow()
3260 put_uobj_write(uobj); in ib_uverbs_ex_destroy_flow()
3262 idr_remove_uobj(&ib_uverbs_rule_idr, uobj); in ib_uverbs_ex_destroy_flow()
3265 list_del(&uobj->list); in ib_uverbs_ex_destroy_flow()
3268 put_uobj(uobj); in ib_uverbs_ex_destroy_flow()
3548 struct ib_uobject *uobj; in ib_uverbs_destroy_srq() local
3558 uobj = idr_write_uobj(&ib_uverbs_srq_idr, cmd.srq_handle, file->ucontext); in ib_uverbs_destroy_srq()
3559 if (!uobj) in ib_uverbs_destroy_srq()
3561 srq = uobj->object; in ib_uverbs_destroy_srq()
3562 obj = container_of(uobj, struct ib_uevent_object, uobject); in ib_uverbs_destroy_srq()
3567 uobj->live = 0; in ib_uverbs_destroy_srq()
3569 put_uobj_write(uobj); in ib_uverbs_destroy_srq()
3579 idr_remove_uobj(&ib_uverbs_srq_idr, uobj); in ib_uverbs_destroy_srq()
3582 list_del(&uobj->list); in ib_uverbs_destroy_srq()
3590 put_uobj(uobj); in ib_uverbs_destroy_srq()