• Home
  • Raw
  • Download

Lines Matching refs:uobj

61 static int uverbs_try_lock_object(struct ib_uobject *uobj,  in uverbs_try_lock_object()  argument
77 return atomic_fetch_add_unless(&uobj->usecnt, 1, -1) == -1 ? in uverbs_try_lock_object()
81 return atomic_cmpxchg(&uobj->usecnt, 0, -1) == 0 ? 0 : -EBUSY; in uverbs_try_lock_object()
88 static void assert_uverbs_usecnt(struct ib_uobject *uobj, in assert_uverbs_usecnt() argument
94 WARN_ON(atomic_read(&uobj->usecnt) <= 0); in assert_uverbs_usecnt()
97 WARN_ON(atomic_read(&uobj->usecnt) != -1); in assert_uverbs_usecnt()
122 static int uverbs_destroy_uobject(struct ib_uobject *uobj, in uverbs_destroy_uobject() argument
131 assert_uverbs_usecnt(uobj, UVERBS_LOOKUP_WRITE); in uverbs_destroy_uobject()
134 WARN_ON(!list_empty(&uobj->list)); in uverbs_destroy_uobject()
135 WARN_ON(!uobj->context); in uverbs_destroy_uobject()
136 uobj->uapi_object->type_class->alloc_abort(uobj); in uverbs_destroy_uobject()
137 } else if (uobj->object) { in uverbs_destroy_uobject()
138 ret = uobj->uapi_object->type_class->destroy_hw(uobj, reason, in uverbs_destroy_uobject()
144 uobj->object = NULL; in uverbs_destroy_uobject()
147 uobj->context = NULL; in uverbs_destroy_uobject()
155 atomic_set(&uobj->usecnt, 0); in uverbs_destroy_uobject()
157 uobj->uapi_object->type_class->remove_handle(uobj); in uverbs_destroy_uobject()
159 if (!list_empty(&uobj->list)) { in uverbs_destroy_uobject()
161 list_del_init(&uobj->list); in uverbs_destroy_uobject()
168 uverbs_uobject_put(uobj); in uverbs_destroy_uobject()
176 uverbs_uobject_put(uobj); in uverbs_destroy_uobject()
188 int uobj_destroy(struct ib_uobject *uobj, struct uverbs_attr_bundle *attrs) in uobj_destroy() argument
202 ret = uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE); in uobj_destroy()
206 ret = uverbs_destroy_uobject(uobj, RDMA_REMOVE_DESTROY, attrs); in uobj_destroy()
208 atomic_set(&uobj->usecnt, 0); in uobj_destroy()
225 struct ib_uobject *uobj; in __uobj_get_destroy() local
228 uobj = rdma_lookup_get_uobject(obj, attrs->ufile, id, in __uobj_get_destroy()
230 if (IS_ERR(uobj)) in __uobj_get_destroy()
231 return uobj; in __uobj_get_destroy()
233 ret = uobj_destroy(uobj, attrs); in __uobj_get_destroy()
235 rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY); in __uobj_get_destroy()
239 return uobj; in __uobj_get_destroy()
249 struct ib_uobject *uobj; in __uobj_perform_destroy() local
251 uobj = __uobj_get_destroy(obj, id, attrs); in __uobj_perform_destroy()
252 if (IS_ERR(uobj)) in __uobj_perform_destroy()
253 return PTR_ERR(uobj); in __uobj_perform_destroy()
254 uobj_put_destroy(uobj); in __uobj_perform_destroy()
263 struct ib_uobject *uobj; in alloc_uobj() local
274 uobj = kzalloc(obj->type_attrs->obj_size, GFP_KERNEL); in alloc_uobj()
275 if (!uobj) in alloc_uobj()
281 uobj->ufile = ufile; in alloc_uobj()
282 uobj->context = attrs->context; in alloc_uobj()
283 INIT_LIST_HEAD(&uobj->list); in alloc_uobj()
284 uobj->uapi_object = obj; in alloc_uobj()
290 atomic_set(&uobj->usecnt, -1); in alloc_uobj()
291 kref_init(&uobj->ref); in alloc_uobj()
293 return uobj; in alloc_uobj()
296 static int idr_add_uobj(struct ib_uobject *uobj) in idr_add_uobj() argument
303 return xa_alloc(&uobj->ufile->idr, &uobj->id, NULL, xa_limit_32b, in idr_add_uobj()
313 struct ib_uobject *uobj; in lookup_get_idr_uobject() local
325 uobj = xa_load(&ufile->idr, id); in lookup_get_idr_uobject()
326 if (!uobj || !kref_get_unless_zero(&uobj->ref)) in lookup_get_idr_uobject()
327 uobj = ERR_PTR(-ENOENT); in lookup_get_idr_uobject()
329 return uobj; in lookup_get_idr_uobject()
377 struct ib_uobject *uobj; in rdma_lookup_get_uobject() local
382 uobj = lookup_get_idr_uobject(NULL, ufile, id, mode); in rdma_lookup_get_uobject()
383 if (IS_ERR(uobj)) in rdma_lookup_get_uobject()
384 return uobj; in rdma_lookup_get_uobject()
389 uobj = obj->type_class->lookup_get(obj, ufile, id, mode); in rdma_lookup_get_uobject()
390 if (IS_ERR(uobj)) in rdma_lookup_get_uobject()
391 return uobj; in rdma_lookup_get_uobject()
393 if (uobj->uapi_object != obj) { in rdma_lookup_get_uobject()
410 ret = uverbs_try_lock_object(uobj, mode); in rdma_lookup_get_uobject()
414 attrs->context = uobj->context; in rdma_lookup_get_uobject()
416 return uobj; in rdma_lookup_get_uobject()
418 uobj->uapi_object->type_class->lookup_put(uobj, mode); in rdma_lookup_get_uobject()
419 uverbs_uobject_put(uobj); in rdma_lookup_get_uobject()
428 struct ib_uobject *uobj; in alloc_begin_idr_uobject() local
430 uobj = alloc_uobj(attrs, obj); in alloc_begin_idr_uobject()
431 if (IS_ERR(uobj)) in alloc_begin_idr_uobject()
432 return uobj; in alloc_begin_idr_uobject()
434 ret = idr_add_uobj(uobj); in alloc_begin_idr_uobject()
438 ret = ib_rdmacg_try_charge(&uobj->cg_obj, uobj->context->device, in alloc_begin_idr_uobject()
443 return uobj; in alloc_begin_idr_uobject()
446 xa_erase(&attrs->ufile->idr, uobj->id); in alloc_begin_idr_uobject()
448 uverbs_uobject_put(uobj); in alloc_begin_idr_uobject()
458 struct ib_uobject *uobj, *ret; in alloc_begin_fd_uobject() local
461 uobj = alloc_uobj(attrs, obj); in alloc_begin_fd_uobject()
462 if (IS_ERR(uobj)) in alloc_begin_fd_uobject()
463 return uobj; in alloc_begin_fd_uobject()
486 uobj->object = filp; in alloc_begin_fd_uobject()
488 uobj->id = new_fd; in alloc_begin_fd_uobject()
489 return uobj; in alloc_begin_fd_uobject()
494 uverbs_uobject_put(uobj); in alloc_begin_fd_uobject()
523 static void alloc_abort_idr_uobject(struct ib_uobject *uobj) in alloc_abort_idr_uobject() argument
525 ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device, in alloc_abort_idr_uobject()
528 xa_erase(&uobj->ufile->idr, uobj->id); in alloc_abort_idr_uobject()
531 static int __must_check destroy_hw_idr_uobject(struct ib_uobject *uobj, in destroy_hw_idr_uobject() argument
536 container_of(uobj->uapi_object->type_attrs, in destroy_hw_idr_uobject()
538 int ret = idr_type->destroy_object(uobj, why, attrs); in destroy_hw_idr_uobject()
546 ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device, in destroy_hw_idr_uobject()
552 static void remove_handle_idr_uobject(struct ib_uobject *uobj) in remove_handle_idr_uobject() argument
554 xa_erase(&uobj->ufile->idr, uobj->id); in remove_handle_idr_uobject()
556 uverbs_uobject_put(uobj); in remove_handle_idr_uobject()
559 static void alloc_abort_fd_uobject(struct ib_uobject *uobj) in alloc_abort_fd_uobject() argument
561 struct file *filp = uobj->object; in alloc_abort_fd_uobject()
564 put_unused_fd(uobj->id); in alloc_abort_fd_uobject()
567 static int __must_check destroy_hw_fd_uobject(struct ib_uobject *uobj, in destroy_hw_fd_uobject() argument
572 uobj->uapi_object->type_attrs, struct uverbs_obj_fd_type, type); in destroy_hw_fd_uobject()
574 fd_type->destroy_object(uobj, why); in destroy_hw_fd_uobject()
578 static void remove_handle_fd_uobject(struct ib_uobject *uobj) in remove_handle_fd_uobject() argument
582 static void alloc_commit_idr_uobject(struct ib_uobject *uobj) in alloc_commit_idr_uobject() argument
584 struct ib_uverbs_file *ufile = uobj->ufile; in alloc_commit_idr_uobject()
594 old = xa_store(&ufile->idr, uobj->id, uobj, GFP_KERNEL); in alloc_commit_idr_uobject()
619 static void alloc_commit_fd_uobject(struct ib_uobject *uobj) in alloc_commit_fd_uobject() argument
621 int fd = uobj->id; in alloc_commit_fd_uobject()
622 struct file *filp = uobj->object; in alloc_commit_fd_uobject()
625 kref_get(&uobj->ufile->ref); in alloc_commit_fd_uobject()
628 uobj->id = 0; in alloc_commit_fd_uobject()
634 filp->private_data = uobj; in alloc_commit_fd_uobject()
643 void rdma_alloc_commit_uobject(struct ib_uobject *uobj, in rdma_alloc_commit_uobject() argument
649 uverbs_uobject_get(uobj); in rdma_alloc_commit_uobject()
651 list_add(&uobj->list, &ufile->uobjects); in rdma_alloc_commit_uobject()
655 atomic_set(&uobj->usecnt, 0); in rdma_alloc_commit_uobject()
658 uobj->uapi_object->type_class->alloc_commit(uobj); in rdma_alloc_commit_uobject()
697 void rdma_alloc_abort_uobject(struct ib_uobject *uobj, in rdma_alloc_abort_uobject() argument
701 struct ib_uverbs_file *ufile = uobj->ufile; in rdma_alloc_abort_uobject()
705 ret = uobj->uapi_object->type_class->destroy_hw( in rdma_alloc_abort_uobject()
706 uobj, RDMA_REMOVE_ABORT, attrs); in rdma_alloc_abort_uobject()
714 return rdma_alloc_commit_uobject(uobj, attrs); in rdma_alloc_abort_uobject()
717 uverbs_destroy_uobject(uobj, RDMA_REMOVE_ABORT, attrs); in rdma_alloc_abort_uobject()
723 static void lookup_put_idr_uobject(struct ib_uobject *uobj, in lookup_put_idr_uobject() argument
728 static void lookup_put_fd_uobject(struct ib_uobject *uobj, in lookup_put_fd_uobject() argument
731 struct file *filp = uobj->object; in lookup_put_fd_uobject()
741 void rdma_lookup_put_uobject(struct ib_uobject *uobj, in rdma_lookup_put_uobject() argument
744 assert_uverbs_usecnt(uobj, mode); in rdma_lookup_put_uobject()
752 atomic_dec(&uobj->usecnt); in rdma_lookup_put_uobject()
755 atomic_set(&uobj->usecnt, 0); in rdma_lookup_put_uobject()
761 uobj->uapi_object->type_class->lookup_put(uobj, mode); in rdma_lookup_put_uobject()
763 uverbs_uobject_put(uobj); in rdma_lookup_put_uobject()
811 struct ib_uobject *uobj; in uverbs_uobject_fd_release() local
818 uobj = filp->private_data; in uverbs_uobject_fd_release()
819 ufile = uobj->ufile; in uverbs_uobject_fd_release()
823 .context = uobj->context, in uverbs_uobject_fd_release()
833 WARN_ON(uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE)); in uverbs_uobject_fd_release()
834 uverbs_destroy_uobject(uobj, RDMA_REMOVE_CLOSE, &attrs); in uverbs_uobject_fd_release()
842 uverbs_uobject_put(uobj); in uverbs_uobject_fd_release()
985 void uverbs_finalize_object(struct ib_uobject *uobj, in uverbs_finalize_object() argument
997 rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_READ); in uverbs_finalize_object()
1000 rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE); in uverbs_finalize_object()
1003 if (uobj) in uverbs_finalize_object()
1004 rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY); in uverbs_finalize_object()
1008 rdma_alloc_commit_uobject(uobj, attrs); in uverbs_finalize_object()
1010 rdma_alloc_abort_uobject(uobj, attrs, hw_obj_valid); in uverbs_finalize_object()