Linux Audio

Check our new training course

Loading...
v6.8
   1/*
   2 * Copyright (c) 2016, Mellanox Technologies inc.  All rights reserved.
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and/or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 */
  32
  33#include <linux/file.h>
  34#include <linux/anon_inodes.h>
  35#include <linux/sched/mm.h>
  36#include <rdma/ib_verbs.h>
  37#include <rdma/uverbs_types.h>
  38#include <linux/rcupdate.h>
  39#include <rdma/uverbs_ioctl.h>
  40#include <rdma/rdma_user_ioctl.h>
  41#include "uverbs.h"
  42#include "core_priv.h"
  43#include "rdma_core.h"
  44
 
 
 
 
 
  45static void uverbs_uobject_free(struct kref *ref)
  46{
  47	kfree_rcu(container_of(ref, struct ib_uobject, ref), rcu);
 
 
 
 
 
 
  48}
  49
  50/*
  51 * In order to indicate we no longer needs this uobject, uverbs_uobject_put
  52 * is called. When the reference count is decreased, the uobject is freed.
  53 * For example, this is used when attaching a completion channel to a CQ.
  54 */
  55void uverbs_uobject_put(struct ib_uobject *uobject)
  56{
  57	kref_put(&uobject->ref, uverbs_uobject_free);
  58}
  59EXPORT_SYMBOL(uverbs_uobject_put);
  60
  61static int uverbs_try_lock_object(struct ib_uobject *uobj,
  62				  enum rdma_lookup_mode mode)
  63{
  64	/*
  65	 * When a shared access is required, we use a positive counter. Each
  66	 * shared access request checks that the value != -1 and increment it.
  67	 * Exclusive access is required for operations like write or destroy.
  68	 * In exclusive access mode, we check that the counter is zero (nobody
  69	 * claimed this object) and we set it to -1. Releasing a shared access
  70	 * lock is done simply by decreasing the counter. As for exclusive
  71	 * access locks, since only a single one of them is allowed
  72	 * concurrently, setting the counter to zero is enough for releasing
  73	 * this lock.
  74	 */
  75	switch (mode) {
  76	case UVERBS_LOOKUP_READ:
  77		return atomic_fetch_add_unless(&uobj->usecnt, 1, -1) == -1 ?
  78			-EBUSY : 0;
  79	case UVERBS_LOOKUP_WRITE:
  80		/* lock is exclusive */
  81		return atomic_cmpxchg(&uobj->usecnt, 0, -1) == 0 ? 0 : -EBUSY;
  82	case UVERBS_LOOKUP_DESTROY:
  83		return 0;
  84	}
  85	return 0;
  86}
  87
  88static void assert_uverbs_usecnt(struct ib_uobject *uobj,
  89				 enum rdma_lookup_mode mode)
  90{
  91#ifdef CONFIG_LOCKDEP
  92	switch (mode) {
  93	case UVERBS_LOOKUP_READ:
  94		WARN_ON(atomic_read(&uobj->usecnt) <= 0);
  95		break;
  96	case UVERBS_LOOKUP_WRITE:
  97		WARN_ON(atomic_read(&uobj->usecnt) != -1);
  98		break;
  99	case UVERBS_LOOKUP_DESTROY:
 100		break;
 101	}
 102#endif
 103}
 104
 105/*
 106 * This must be called with the hw_destroy_rwsem locked for read or write,
 107 * also the uobject itself must be locked for write.
 108 *
 109 * Upon return the HW object is guaranteed to be destroyed.
 110 *
 111 * For RDMA_REMOVE_ABORT, the hw_destroy_rwsem is not required to be held,
 112 * however the type's allocat_commit function cannot have been called and the
 113 * uobject cannot be on the uobjects_lists
 114 *
 115 * For RDMA_REMOVE_DESTROY the caller should be holding a kref (eg via
 116 * rdma_lookup_get_uobject) and the object is left in a state where the caller
 117 * needs to call rdma_lookup_put_uobject.
 118 *
 119 * For all other destroy modes this function internally unlocks the uobject
 120 * and consumes the kref on the uobj.
 121 */
 122static int uverbs_destroy_uobject(struct ib_uobject *uobj,
 123				  enum rdma_remove_reason reason,
 124				  struct uverbs_attr_bundle *attrs)
 125{
 126	struct ib_uverbs_file *ufile = attrs->ufile;
 127	unsigned long flags;
 128	int ret;
 129
 130	lockdep_assert_held(&ufile->hw_destroy_rwsem);
 131	assert_uverbs_usecnt(uobj, UVERBS_LOOKUP_WRITE);
 132
 133	if (reason == RDMA_REMOVE_ABORT) {
 134		WARN_ON(!list_empty(&uobj->list));
 135		WARN_ON(!uobj->context);
 136		uobj->uapi_object->type_class->alloc_abort(uobj);
 137	} else if (uobj->object) {
 138		ret = uobj->uapi_object->type_class->destroy_hw(uobj, reason,
 139								attrs);
 140		if (ret)
 141			/* Nothing to be done, wait till ucontext will clean it */
 142			return ret;
 
 
 
 
 
 
 143
 144		uobj->object = NULL;
 145	}
 146
 
 
 
 
 
 
 147	uobj->context = NULL;
 148
 149	/*
 150	 * For DESTROY the usecnt is not changed, the caller is expected to
 151	 * manage it via uobj_put_destroy(). Only DESTROY can remove the IDR
 152	 * handle.
 153	 */
 154	if (reason != RDMA_REMOVE_DESTROY)
 155		atomic_set(&uobj->usecnt, 0);
 156	else
 157		uobj->uapi_object->type_class->remove_handle(uobj);
 158
 159	if (!list_empty(&uobj->list)) {
 160		spin_lock_irqsave(&ufile->uobjects_lock, flags);
 161		list_del_init(&uobj->list);
 162		spin_unlock_irqrestore(&ufile->uobjects_lock, flags);
 163
 164		/*
 165		 * Pairs with the get in rdma_alloc_commit_uobject(), could
 166		 * destroy uobj.
 167		 */
 168		uverbs_uobject_put(uobj);
 169	}
 170
 171	/*
 172	 * When aborting the stack kref remains owned by the core code, and is
 173	 * not transferred into the type. Pairs with the get in alloc_uobj
 174	 */
 175	if (reason == RDMA_REMOVE_ABORT)
 176		uverbs_uobject_put(uobj);
 177
 178	return 0;
 179}
 180
 181/*
 182 * This calls uverbs_destroy_uobject() using the RDMA_REMOVE_DESTROY
 183 * sequence. It should only be used from command callbacks. On success the
 184 * caller must pair this with uobj_put_destroy(). This
 185 * version requires the caller to have already obtained an
 186 * LOOKUP_DESTROY uobject kref.
 187 */
 188int uobj_destroy(struct ib_uobject *uobj, struct uverbs_attr_bundle *attrs)
 189{
 190	struct ib_uverbs_file *ufile = attrs->ufile;
 191	int ret;
 192
 193	down_read(&ufile->hw_destroy_rwsem);
 194
 195	/*
 196	 * Once the uobject is destroyed by RDMA_REMOVE_DESTROY then it is left
 197	 * write locked as the callers put it back with UVERBS_LOOKUP_DESTROY.
 198	 * This is because any other concurrent thread can still see the object
 199	 * in the xarray due to RCU. Leaving it locked ensures nothing else will
 200	 * touch it.
 201	 */
 202	ret = uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE);
 203	if (ret)
 204		goto out_unlock;
 205
 206	ret = uverbs_destroy_uobject(uobj, RDMA_REMOVE_DESTROY, attrs);
 207	if (ret) {
 208		atomic_set(&uobj->usecnt, 0);
 209		goto out_unlock;
 210	}
 211
 212out_unlock:
 213	up_read(&ufile->hw_destroy_rwsem);
 214	return ret;
 215}
 216
 217/*
 218 * uobj_get_destroy destroys the HW object and returns a handle to the uobj
 219 * with a NULL object pointer. The caller must pair this with
 220 * uobj_put_destroy().
 221 */
 222struct ib_uobject *__uobj_get_destroy(const struct uverbs_api_object *obj,
 223				      u32 id, struct uverbs_attr_bundle *attrs)
 224{
 225	struct ib_uobject *uobj;
 226	int ret;
 227
 228	uobj = rdma_lookup_get_uobject(obj, attrs->ufile, id,
 229				       UVERBS_LOOKUP_DESTROY, attrs);
 230	if (IS_ERR(uobj))
 231		return uobj;
 232
 233	ret = uobj_destroy(uobj, attrs);
 234	if (ret) {
 235		rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY);
 236		return ERR_PTR(ret);
 237	}
 238
 239	return uobj;
 240}
 241
 242/*
 243 * Does both uobj_get_destroy() and uobj_put_destroy().  Returns 0 on success
 244 * (negative errno on failure). For use by callers that do not need the uobj.
 245 */
 246int __uobj_perform_destroy(const struct uverbs_api_object *obj, u32 id,
 247			   struct uverbs_attr_bundle *attrs)
 248{
 249	struct ib_uobject *uobj;
 250
 251	uobj = __uobj_get_destroy(obj, id, attrs);
 252	if (IS_ERR(uobj))
 253		return PTR_ERR(uobj);
 254	uobj_put_destroy(uobj);
 
 255	return 0;
 256}
 257
 258/* alloc_uobj must be undone by uverbs_destroy_uobject() */
 259static struct ib_uobject *alloc_uobj(struct uverbs_attr_bundle *attrs,
 260				     const struct uverbs_api_object *obj)
 261{
 262	struct ib_uverbs_file *ufile = attrs->ufile;
 263	struct ib_uobject *uobj;
 
 264
 265	if (!attrs->context) {
 266		struct ib_ucontext *ucontext =
 267			ib_uverbs_get_ucontext_file(ufile);
 268
 269		if (IS_ERR(ucontext))
 270			return ERR_CAST(ucontext);
 271		attrs->context = ucontext;
 272	}
 273
 274	uobj = kzalloc(obj->type_attrs->obj_size, GFP_KERNEL);
 275	if (!uobj)
 276		return ERR_PTR(-ENOMEM);
 277	/*
 278	 * user_handle should be filled by the handler,
 279	 * The object is added to the list in the commit stage.
 280	 */
 281	uobj->ufile = ufile;
 282	uobj->context = attrs->context;
 283	INIT_LIST_HEAD(&uobj->list);
 284	uobj->uapi_object = obj;
 285	/*
 286	 * Allocated objects start out as write locked to deny any other
 287	 * syscalls from accessing them until they are committed. See
 288	 * rdma_alloc_commit_uobject
 289	 */
 290	atomic_set(&uobj->usecnt, -1);
 291	kref_init(&uobj->ref);
 292
 293	return uobj;
 294}
 295
 296static int idr_add_uobj(struct ib_uobject *uobj)
 297{
 298       /*
 299        * We start with allocating an idr pointing to NULL. This represents an
 300        * object which isn't initialized yet. We'll replace it later on with
 301        * the real object once we commit.
 302        */
 303	return xa_alloc(&uobj->ufile->idr, &uobj->id, NULL, xa_limit_32b,
 304			GFP_KERNEL);
 305}
 306
 307/* Returns the ib_uobject or an error. The caller should check for IS_ERR. */
 308static struct ib_uobject *
 309lookup_get_idr_uobject(const struct uverbs_api_object *obj,
 310		       struct ib_uverbs_file *ufile, s64 id,
 311		       enum rdma_lookup_mode mode)
 312{
 313	struct ib_uobject *uobj;
 314
 315	if (id < 0 || id > ULONG_MAX)
 316		return ERR_PTR(-EINVAL);
 317
 318	rcu_read_lock();
 319	/*
 320	 * The idr_find is guaranteed to return a pointer to something that
 321	 * isn't freed yet, or NULL, as the free after idr_remove goes through
 322	 * kfree_rcu(). However the object may still have been released and
 323	 * kfree() could be called at any time.
 324	 */
 325	uobj = xa_load(&ufile->idr, id);
 326	if (!uobj || !kref_get_unless_zero(&uobj->ref))
 327		uobj = ERR_PTR(-ENOENT);
 328	rcu_read_unlock();
 329	return uobj;
 330}
 331
 332static struct ib_uobject *
 333lookup_get_fd_uobject(const struct uverbs_api_object *obj,
 334		      struct ib_uverbs_file *ufile, s64 id,
 335		      enum rdma_lookup_mode mode)
 336{
 337	const struct uverbs_obj_fd_type *fd_type;
 338	struct file *f;
 339	struct ib_uobject *uobject;
 340	int fdno = id;
 341
 342	if (fdno != id)
 343		return ERR_PTR(-EINVAL);
 344
 345	if (mode != UVERBS_LOOKUP_READ)
 346		return ERR_PTR(-EOPNOTSUPP);
 347
 348	if (!obj->type_attrs)
 349		return ERR_PTR(-EIO);
 350	fd_type =
 351		container_of(obj->type_attrs, struct uverbs_obj_fd_type, type);
 352
 353	f = fget(fdno);
 354	if (!f)
 355		return ERR_PTR(-EBADF);
 356
 357	uobject = f->private_data;
 358	/*
 359	 * fget(id) ensures we are not currently running
 360	 * uverbs_uobject_fd_release(), and the caller is expected to ensure
 361	 * that release is never done while a call to lookup is possible.
 362	 */
 363	if (f->f_op != fd_type->fops || uobject->ufile != ufile) {
 364		fput(f);
 365		return ERR_PTR(-EBADF);
 366	}
 367
 368	uverbs_uobject_get(uobject);
 369	return uobject;
 370}
 371
 372struct ib_uobject *rdma_lookup_get_uobject(const struct uverbs_api_object *obj,
 373					   struct ib_uverbs_file *ufile, s64 id,
 374					   enum rdma_lookup_mode mode,
 375					   struct uverbs_attr_bundle *attrs)
 376{
 377	struct ib_uobject *uobj;
 378	int ret;
 379
 380	if (obj == ERR_PTR(-ENOMSG)) {
 381		/* must be UVERBS_IDR_ANY_OBJECT, see uapi_get_object() */
 382		uobj = lookup_get_idr_uobject(NULL, ufile, id, mode);
 383		if (IS_ERR(uobj))
 384			return uobj;
 385	} else {
 386		if (IS_ERR(obj))
 387			return ERR_PTR(-EINVAL);
 388
 389		uobj = obj->type_class->lookup_get(obj, ufile, id, mode);
 390		if (IS_ERR(uobj))
 391			return uobj;
 392
 393		if (uobj->uapi_object != obj) {
 394			ret = -EINVAL;
 395			goto free;
 396		}
 397	}
 398
 399	/*
 400	 * If we have been disassociated block every command except for
 401	 * DESTROY based commands.
 402	 */
 403	if (mode != UVERBS_LOOKUP_DESTROY &&
 404	    !srcu_dereference(ufile->device->ib_dev,
 405			      &ufile->device->disassociate_srcu)) {
 406		ret = -EIO;
 407		goto free;
 408	}
 409
 410	ret = uverbs_try_lock_object(uobj, mode);
 411	if (ret)
 412		goto free;
 413	if (attrs)
 414		attrs->context = uobj->context;
 415
 416	return uobj;
 417free:
 418	uobj->uapi_object->type_class->lookup_put(uobj, mode);
 419	uverbs_uobject_put(uobj);
 420	return ERR_PTR(ret);
 421}
 422
 423static struct ib_uobject *
 424alloc_begin_idr_uobject(const struct uverbs_api_object *obj,
 425			struct uverbs_attr_bundle *attrs)
 426{
 427	int ret;
 428	struct ib_uobject *uobj;
 429
 430	uobj = alloc_uobj(attrs, obj);
 431	if (IS_ERR(uobj))
 432		return uobj;
 433
 434	ret = idr_add_uobj(uobj);
 435	if (ret)
 436		goto uobj_put;
 437
 438	ret = ib_rdmacg_try_charge(&uobj->cg_obj, uobj->context->device,
 439				   RDMACG_RESOURCE_HCA_OBJECT);
 440	if (ret)
 441		goto remove;
 442
 443	return uobj;
 444
 445remove:
 446	xa_erase(&attrs->ufile->idr, uobj->id);
 447uobj_put:
 448	uverbs_uobject_put(uobj);
 449	return ERR_PTR(ret);
 450}
 451
 452static struct ib_uobject *
 453alloc_begin_fd_uobject(const struct uverbs_api_object *obj,
 454		       struct uverbs_attr_bundle *attrs)
 455{
 456	const struct uverbs_obj_fd_type *fd_type;
 457	int new_fd;
 458	struct ib_uobject *uobj, *ret;
 459	struct file *filp;
 460
 461	uobj = alloc_uobj(attrs, obj);
 462	if (IS_ERR(uobj))
 463		return uobj;
 464
 465	fd_type =
 466		container_of(obj->type_attrs, struct uverbs_obj_fd_type, type);
 467	if (WARN_ON(fd_type->fops->release != &uverbs_uobject_fd_release &&
 468		    fd_type->fops->release != &uverbs_async_event_release)) {
 469		ret = ERR_PTR(-EINVAL);
 470		goto err_fd;
 471	}
 472
 473	new_fd = get_unused_fd_flags(O_CLOEXEC);
 474	if (new_fd < 0) {
 475		ret = ERR_PTR(new_fd);
 476		goto err_fd;
 477	}
 478
 479	/* Note that uverbs_uobject_fd_release() is called during abort */
 480	filp = anon_inode_getfile(fd_type->name, fd_type->fops, NULL,
 481				  fd_type->flags);
 482	if (IS_ERR(filp)) {
 483		ret = ERR_CAST(filp);
 484		goto err_getfile;
 485	}
 486	uobj->object = filp;
 487
 488	uobj->id = new_fd;
 489	return uobj;
 490
 491err_getfile:
 492	put_unused_fd(new_fd);
 493err_fd:
 494	uverbs_uobject_put(uobj);
 495	return ret;
 496}
 497
 498struct ib_uobject *rdma_alloc_begin_uobject(const struct uverbs_api_object *obj,
 
 499					    struct uverbs_attr_bundle *attrs)
 500{
 501	struct ib_uverbs_file *ufile = attrs->ufile;
 502	struct ib_uobject *ret;
 503
 504	if (IS_ERR(obj))
 505		return ERR_PTR(-EINVAL);
 506
 507	/*
 508	 * The hw_destroy_rwsem is held across the entire object creation and
 509	 * released during rdma_alloc_commit_uobject or
 510	 * rdma_alloc_abort_uobject
 511	 */
 512	if (!down_read_trylock(&ufile->hw_destroy_rwsem))
 513		return ERR_PTR(-EIO);
 514
 515	ret = obj->type_class->alloc_begin(obj, attrs);
 516	if (IS_ERR(ret)) {
 517		up_read(&ufile->hw_destroy_rwsem);
 518		return ret;
 519	}
 
 
 520	return ret;
 521}
 522
 523static void alloc_abort_idr_uobject(struct ib_uobject *uobj)
 524{
 525	ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
 526			   RDMACG_RESOURCE_HCA_OBJECT);
 527
 528	xa_erase(&uobj->ufile->idr, uobj->id);
 529}
 530
 531static int __must_check destroy_hw_idr_uobject(struct ib_uobject *uobj,
 532					       enum rdma_remove_reason why,
 533					       struct uverbs_attr_bundle *attrs)
 534{
 535	const struct uverbs_obj_idr_type *idr_type =
 536		container_of(uobj->uapi_object->type_attrs,
 537			     struct uverbs_obj_idr_type, type);
 538	int ret = idr_type->destroy_object(uobj, why, attrs);
 539
 540	if (ret)
 
 
 
 
 
 541		return ret;
 542
 543	if (why == RDMA_REMOVE_ABORT)
 544		return 0;
 545
 546	ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
 547			   RDMACG_RESOURCE_HCA_OBJECT);
 548
 549	return 0;
 550}
 551
 552static void remove_handle_idr_uobject(struct ib_uobject *uobj)
 553{
 554	xa_erase(&uobj->ufile->idr, uobj->id);
 555	/* Matches the kref in alloc_commit_idr_uobject */
 556	uverbs_uobject_put(uobj);
 557}
 558
 559static void alloc_abort_fd_uobject(struct ib_uobject *uobj)
 560{
 561	struct file *filp = uobj->object;
 562
 563	fput(filp);
 564	put_unused_fd(uobj->id);
 565}
 566
 567static int __must_check destroy_hw_fd_uobject(struct ib_uobject *uobj,
 568					      enum rdma_remove_reason why,
 569					      struct uverbs_attr_bundle *attrs)
 570{
 571	const struct uverbs_obj_fd_type *fd_type = container_of(
 572		uobj->uapi_object->type_attrs, struct uverbs_obj_fd_type, type);
 
 
 
 
 573
 574	fd_type->destroy_object(uobj, why);
 575	return 0;
 576}
 577
 578static void remove_handle_fd_uobject(struct ib_uobject *uobj)
 579{
 580}
 581
 582static void alloc_commit_idr_uobject(struct ib_uobject *uobj)
 583{
 584	struct ib_uverbs_file *ufile = uobj->ufile;
 585	void *old;
 586
 587	/*
 588	 * We already allocated this IDR with a NULL object, so
 589	 * this shouldn't fail.
 590	 *
 591	 * NOTE: Storing the uobj transfers our kref on uobj to the XArray.
 592	 * It will be put by remove_commit_idr_uobject()
 593	 */
 594	old = xa_store(&ufile->idr, uobj->id, uobj, GFP_KERNEL);
 595	WARN_ON(old != NULL);
 
 
 596}
 597
 598static void swap_idr_uobjects(struct ib_uobject *obj_old,
 599			     struct ib_uobject *obj_new)
 600{
 601	struct ib_uverbs_file *ufile = obj_old->ufile;
 602	void *old;
 
 
 603
 604	/*
 605	 * New must be an object that been allocated but not yet committed, this
 606	 * moves the pre-committed state to obj_old, new still must be comitted.
 607	 */
 608	old = xa_cmpxchg(&ufile->idr, obj_old->id, obj_old, XA_ZERO_ENTRY,
 609			 GFP_KERNEL);
 610	if (WARN_ON(old != obj_old))
 611		return;
 612
 613	swap(obj_old->id, obj_new->id);
 614
 615	old = xa_cmpxchg(&ufile->idr, obj_old->id, NULL, obj_old, GFP_KERNEL);
 616	WARN_ON(old != NULL);
 617}
 618
 619static void alloc_commit_fd_uobject(struct ib_uobject *uobj)
 620{
 621	int fd = uobj->id;
 622	struct file *filp = uobj->object;
 623
 624	/* Matching put will be done in uverbs_uobject_fd_release() */
 625	kref_get(&uobj->ufile->ref);
 626
 627	/* This shouldn't be used anymore. Use the file object instead */
 628	uobj->id = 0;
 629
 630	/*
 631	 * NOTE: Once we install the file we loose ownership of our kref on
 632	 * uobj. It will be put by uverbs_uobject_fd_release()
 633	 */
 634	filp->private_data = uobj;
 635	fd_install(fd, filp);
 
 
 636}
 637
 638/*
 639 * In all cases rdma_alloc_commit_uobject() consumes the kref to uobj and the
 640 * caller can no longer assume uobj is valid. If this function fails it
 641 * destroys the uboject, including the attached HW object.
 642 */
 643void rdma_alloc_commit_uobject(struct ib_uobject *uobj,
 644			       struct uverbs_attr_bundle *attrs)
 645{
 646	struct ib_uverbs_file *ufile = attrs->ufile;
 
 
 
 
 
 
 
 
 
 647
 648	/* kref is held so long as the uobj is on the uobj list. */
 649	uverbs_uobject_get(uobj);
 650	spin_lock_irq(&ufile->uobjects_lock);
 651	list_add(&uobj->list, &ufile->uobjects);
 652	spin_unlock_irq(&ufile->uobjects_lock);
 653
 654	/* matches atomic_set(-1) in alloc_uobj */
 655	atomic_set(&uobj->usecnt, 0);
 656
 657	/* alloc_commit consumes the uobj kref */
 658	uobj->uapi_object->type_class->alloc_commit(uobj);
 659
 660	/* Matches the down_read in rdma_alloc_begin_uobject */
 661	up_read(&ufile->hw_destroy_rwsem);
 662}
 663
 664/*
 665 * new_uobj will be assigned to the handle currently used by to_uobj, and
 666 * to_uobj will be destroyed.
 667 *
 668 * Upon return the caller must do:
 669 *    rdma_alloc_commit_uobject(new_uobj)
 670 *    uobj_put_destroy(to_uobj)
 671 *
 672 * to_uobj must have a write get but the put mode switches to destroy once
 673 * this is called.
 674 */
 675void rdma_assign_uobject(struct ib_uobject *to_uobj, struct ib_uobject *new_uobj,
 676			struct uverbs_attr_bundle *attrs)
 677{
 678	assert_uverbs_usecnt(new_uobj, UVERBS_LOOKUP_WRITE);
 679
 680	if (WARN_ON(to_uobj->uapi_object != new_uobj->uapi_object ||
 681		    !to_uobj->uapi_object->type_class->swap_uobjects))
 682		return;
 683
 684	to_uobj->uapi_object->type_class->swap_uobjects(to_uobj, new_uobj);
 685
 686	/*
 687	 * If this fails then the uobject is still completely valid (though with
 688	 * a new ID) and we leak it until context close.
 689	 */
 690	uverbs_destroy_uobject(to_uobj, RDMA_REMOVE_DESTROY, attrs);
 691}
 692
 693/*
 694 * This consumes the kref for uobj. It is up to the caller to unwind the HW
 695 * object and anything else connected to uobj before calling this.
 696 */
 697void rdma_alloc_abort_uobject(struct ib_uobject *uobj,
 698			      struct uverbs_attr_bundle *attrs,
 699			      bool hw_obj_valid)
 700{
 701	struct ib_uverbs_file *ufile = uobj->ufile;
 702	int ret;
 703
 704	if (hw_obj_valid) {
 705		ret = uobj->uapi_object->type_class->destroy_hw(
 706			uobj, RDMA_REMOVE_ABORT, attrs);
 707		/*
 708		 * If the driver couldn't destroy the object then go ahead and
 709		 * commit it. Leaking objects that can't be destroyed is only
 710		 * done during FD close after the driver has a few more tries to
 711		 * destroy it.
 712		 */
 713		if (WARN_ON(ret))
 714			return rdma_alloc_commit_uobject(uobj, attrs);
 715	}
 716
 
 717	uverbs_destroy_uobject(uobj, RDMA_REMOVE_ABORT, attrs);
 718
 719	/* Matches the down_read in rdma_alloc_begin_uobject */
 720	up_read(&ufile->hw_destroy_rwsem);
 721}
 722
 723static void lookup_put_idr_uobject(struct ib_uobject *uobj,
 724				   enum rdma_lookup_mode mode)
 725{
 726}
 727
 728static void lookup_put_fd_uobject(struct ib_uobject *uobj,
 729				  enum rdma_lookup_mode mode)
 730{
 731	struct file *filp = uobj->object;
 732
 733	WARN_ON(mode != UVERBS_LOOKUP_READ);
 734	/*
 735	 * This indirectly calls uverbs_uobject_fd_release() and free the
 736	 * object
 737	 */
 738	fput(filp);
 739}
 740
 741void rdma_lookup_put_uobject(struct ib_uobject *uobj,
 742			     enum rdma_lookup_mode mode)
 743{
 744	assert_uverbs_usecnt(uobj, mode);
 
 745	/*
 746	 * In order to unlock an object, either decrease its usecnt for
 747	 * read access or zero it in case of exclusive access. See
 748	 * uverbs_try_lock_object for locking schema information.
 749	 */
 750	switch (mode) {
 751	case UVERBS_LOOKUP_READ:
 752		atomic_dec(&uobj->usecnt);
 753		break;
 754	case UVERBS_LOOKUP_WRITE:
 755		atomic_set(&uobj->usecnt, 0);
 756		break;
 757	case UVERBS_LOOKUP_DESTROY:
 758		break;
 759	}
 760
 761	uobj->uapi_object->type_class->lookup_put(uobj, mode);
 762	/* Pairs with the kref obtained by type->lookup_get */
 763	uverbs_uobject_put(uobj);
 764}
 765
 766void setup_ufile_idr_uobject(struct ib_uverbs_file *ufile)
 767{
 768	xa_init_flags(&ufile->idr, XA_FLAGS_ALLOC);
 769}
 770
 771void release_ufile_idr_uobject(struct ib_uverbs_file *ufile)
 772{
 773	struct ib_uobject *entry;
 774	unsigned long id;
 775
 776	/*
 777	 * At this point uverbs_cleanup_ufile() is guaranteed to have run, and
 778	 * there are no HW objects left, however the xarray is still populated
 779	 * with anything that has not been cleaned up by userspace. Since the
 780	 * kref on ufile is 0, nothing is allowed to call lookup_get.
 781	 *
 782	 * This is an optimized equivalent to remove_handle_idr_uobject
 783	 */
 784	xa_for_each(&ufile->idr, id, entry) {
 785		WARN_ON(entry->object);
 786		uverbs_uobject_put(entry);
 787	}
 788
 789	xa_destroy(&ufile->idr);
 790}
 791
 792const struct uverbs_obj_type_class uverbs_idr_class = {
 793	.alloc_begin = alloc_begin_idr_uobject,
 794	.lookup_get = lookup_get_idr_uobject,
 795	.alloc_commit = alloc_commit_idr_uobject,
 796	.alloc_abort = alloc_abort_idr_uobject,
 797	.lookup_put = lookup_put_idr_uobject,
 798	.destroy_hw = destroy_hw_idr_uobject,
 799	.remove_handle = remove_handle_idr_uobject,
 800	.swap_uobjects = swap_idr_uobjects,
 
 
 
 
 
 
 
 
 
 
 
 
 
 801};
 802EXPORT_SYMBOL(uverbs_idr_class);
 803
 804/*
 805 * Users of UVERBS_TYPE_ALLOC_FD should set this function as the struct
 806 * file_operations release method.
 807 */
 808int uverbs_uobject_fd_release(struct inode *inode, struct file *filp)
 809{
 810	struct ib_uverbs_file *ufile;
 811	struct ib_uobject *uobj;
 812
 813	/*
 814	 * This can only happen if the fput came from alloc_abort_fd_uobject()
 815	 */
 816	if (!filp->private_data)
 817		return 0;
 818	uobj = filp->private_data;
 819	ufile = uobj->ufile;
 820
 821	if (down_read_trylock(&ufile->hw_destroy_rwsem)) {
 822		struct uverbs_attr_bundle attrs = {
 823			.context = uobj->context,
 824			.ufile = ufile,
 825		};
 826
 827		/*
 828		 * lookup_get_fd_uobject holds the kref on the struct file any
 829		 * time a FD uobj is locked, which prevents this release
 830		 * method from being invoked. Meaning we can always get the
 831		 * write lock here, or we have a kernel bug.
 832		 */
 833		WARN_ON(uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE));
 834		uverbs_destroy_uobject(uobj, RDMA_REMOVE_CLOSE, &attrs);
 835		up_read(&ufile->hw_destroy_rwsem);
 836	}
 837
 838	/* Matches the get in alloc_commit_fd_uobject() */
 839	kref_put(&ufile->ref, ib_uverbs_release_file);
 840
 841	/* Pairs with filp->private_data in alloc_begin_fd_uobject */
 842	uverbs_uobject_put(uobj);
 843	return 0;
 844}
 845EXPORT_SYMBOL(uverbs_uobject_fd_release);
 846
 847/*
 848 * Drop the ucontext off the ufile and completely disconnect it from the
 849 * ib_device
 850 */
 851static void ufile_destroy_ucontext(struct ib_uverbs_file *ufile,
 852				   enum rdma_remove_reason reason)
 853{
 854	struct ib_ucontext *ucontext = ufile->ucontext;
 855	struct ib_device *ib_dev = ucontext->device;
 856
 857	/*
 858	 * If we are closing the FD then the user mmap VMAs must have
 859	 * already been destroyed as they hold on to the filep, otherwise
 860	 * they need to be zap'd.
 861	 */
 862	if (reason == RDMA_REMOVE_DRIVER_REMOVE) {
 863		uverbs_user_mmap_disassociate(ufile);
 864		if (ib_dev->ops.disassociate_ucontext)
 865			ib_dev->ops.disassociate_ucontext(ucontext);
 866	}
 867
 868	ib_rdmacg_uncharge(&ucontext->cg_obj, ib_dev,
 869			   RDMACG_RESOURCE_HCA_HANDLE);
 870
 871	rdma_restrack_del(&ucontext->res);
 872
 873	ib_dev->ops.dealloc_ucontext(ucontext);
 874	WARN_ON(!xa_empty(&ucontext->mmap_xa));
 875	kfree(ucontext);
 876
 877	ufile->ucontext = NULL;
 878}
 879
 880static int __uverbs_cleanup_ufile(struct ib_uverbs_file *ufile,
 881				  enum rdma_remove_reason reason)
 882{
 883	struct ib_uobject *obj, *next_obj;
 884	int ret = -EINVAL;
 885	struct uverbs_attr_bundle attrs = { .ufile = ufile };
 886
 887	/*
 888	 * This shouldn't run while executing other commands on this
 889	 * context. Thus, the only thing we should take care of is
 890	 * releasing a FD while traversing this list. The FD could be
 891	 * closed and released from the _release fop of this FD.
 892	 * In order to mitigate this, we add a lock.
 893	 * We take and release the lock per traversal in order to let
 894	 * other threads (which might still use the FDs) chance to run.
 895	 */
 896	list_for_each_entry_safe(obj, next_obj, &ufile->uobjects, list) {
 897		attrs.context = obj->context;
 898		/*
 899		 * if we hit this WARN_ON, that means we are
 900		 * racing with a lookup_get.
 901		 */
 902		WARN_ON(uverbs_try_lock_object(obj, UVERBS_LOOKUP_WRITE));
 903		if (reason == RDMA_REMOVE_DRIVER_FAILURE)
 904			obj->object = NULL;
 905		if (!uverbs_destroy_uobject(obj, reason, &attrs))
 906			ret = 0;
 907		else
 908			atomic_set(&obj->usecnt, 0);
 909	}
 910
 911	if (reason == RDMA_REMOVE_DRIVER_FAILURE) {
 912		WARN_ON(!list_empty(&ufile->uobjects));
 913		return 0;
 914	}
 915	return ret;
 916}
 917
 918/*
 919 * Destroy the ucontext and every uobject associated with it.
 
 
 920 *
 921 * This is internally locked and can be called in parallel from multiple
 922 * contexts.
 923 */
 924void uverbs_destroy_ufile_hw(struct ib_uverbs_file *ufile,
 925			     enum rdma_remove_reason reason)
 926{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 927	down_write(&ufile->hw_destroy_rwsem);
 928
 929	/*
 930	 * If a ucontext was never created then we can't have any uobjects to
 931	 * cleanup, nothing to do.
 932	 */
 933	if (!ufile->ucontext)
 934		goto done;
 935
 936	while (!list_empty(&ufile->uobjects) &&
 937	       !__uverbs_cleanup_ufile(ufile, reason)) {
 938	}
 
 
 
 
 
 
 
 
 
 
 
 939
 940	if (WARN_ON(!list_empty(&ufile->uobjects)))
 941		__uverbs_cleanup_ufile(ufile, RDMA_REMOVE_DRIVER_FAILURE);
 942	ufile_destroy_ucontext(ufile, reason);
 943
 944done:
 945	up_write(&ufile->hw_destroy_rwsem);
 
 946}
 947
 948const struct uverbs_obj_type_class uverbs_fd_class = {
 949	.alloc_begin = alloc_begin_fd_uobject,
 950	.lookup_get = lookup_get_fd_uobject,
 951	.alloc_commit = alloc_commit_fd_uobject,
 952	.alloc_abort = alloc_abort_fd_uobject,
 953	.lookup_put = lookup_put_fd_uobject,
 954	.destroy_hw = destroy_hw_fd_uobject,
 955	.remove_handle = remove_handle_fd_uobject,
 
 956};
 957EXPORT_SYMBOL(uverbs_fd_class);
 958
 959struct ib_uobject *
 960uverbs_get_uobject_from_file(u16 object_id, enum uverbs_obj_access access,
 961			     s64 id, struct uverbs_attr_bundle *attrs)
 962{
 963	const struct uverbs_api_object *obj =
 964		uapi_get_object(attrs->ufile->device->uapi, object_id);
 965
 966	switch (access) {
 967	case UVERBS_ACCESS_READ:
 968		return rdma_lookup_get_uobject(obj, attrs->ufile, id,
 969					       UVERBS_LOOKUP_READ, attrs);
 970	case UVERBS_ACCESS_DESTROY:
 971		/* Actual destruction is done inside uverbs_handle_method */
 972		return rdma_lookup_get_uobject(obj, attrs->ufile, id,
 973					       UVERBS_LOOKUP_DESTROY, attrs);
 974	case UVERBS_ACCESS_WRITE:
 975		return rdma_lookup_get_uobject(obj, attrs->ufile, id,
 976					       UVERBS_LOOKUP_WRITE, attrs);
 977	case UVERBS_ACCESS_NEW:
 978		return rdma_alloc_begin_uobject(obj, attrs);
 979	default:
 980		WARN_ON(true);
 981		return ERR_PTR(-EOPNOTSUPP);
 982	}
 983}
 984
 985void uverbs_finalize_object(struct ib_uobject *uobj,
 986			    enum uverbs_obj_access access, bool hw_obj_valid,
 987			    bool commit, struct uverbs_attr_bundle *attrs)
 988{
 
 
 989	/*
 990	 * refcounts should be handled at the object level and not at the
 991	 * uobject level. Refcounts of the objects themselves are done in
 992	 * handlers.
 993	 */
 994
 995	switch (access) {
 996	case UVERBS_ACCESS_READ:
 997		rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_READ);
 998		break;
 999	case UVERBS_ACCESS_WRITE:
1000		rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
1001		break;
1002	case UVERBS_ACCESS_DESTROY:
1003		if (uobj)
1004			rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY);
1005		break;
1006	case UVERBS_ACCESS_NEW:
1007		if (commit)
1008			rdma_alloc_commit_uobject(uobj, attrs);
1009		else
1010			rdma_alloc_abort_uobject(uobj, attrs, hw_obj_valid);
1011		break;
1012	default:
1013		WARN_ON(true);
 
1014	}
 
 
1015}
v5.4
  1/*
  2 * Copyright (c) 2016, Mellanox Technologies inc.  All rights reserved.
  3 *
  4 * This software is available to you under a choice of one of two
  5 * licenses.  You may choose to be licensed under the terms of the GNU
  6 * General Public License (GPL) Version 2, available from the file
  7 * COPYING in the main directory of this source tree, or the
  8 * OpenIB.org BSD license below:
  9 *
 10 *     Redistribution and use in source and binary forms, with or
 11 *     without modification, are permitted provided that the following
 12 *     conditions are met:
 13 *
 14 *      - Redistributions of source code must retain the above
 15 *        copyright notice, this list of conditions and the following
 16 *        disclaimer.
 17 *
 18 *      - Redistributions in binary form must reproduce the above
 19 *        copyright notice, this list of conditions and the following
 20 *        disclaimer in the documentation and/or other materials
 21 *        provided with the distribution.
 22 *
 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 30 * SOFTWARE.
 31 */
 32
 33#include <linux/file.h>
 34#include <linux/anon_inodes.h>
 35#include <linux/sched/mm.h>
 36#include <rdma/ib_verbs.h>
 37#include <rdma/uverbs_types.h>
 38#include <linux/rcupdate.h>
 39#include <rdma/uverbs_ioctl.h>
 40#include <rdma/rdma_user_ioctl.h>
 41#include "uverbs.h"
 42#include "core_priv.h"
 43#include "rdma_core.h"
 44
 45void uverbs_uobject_get(struct ib_uobject *uobject)
 46{
 47	kref_get(&uobject->ref);
 48}
 49
 50static void uverbs_uobject_free(struct kref *ref)
 51{
 52	struct ib_uobject *uobj =
 53		container_of(ref, struct ib_uobject, ref);
 54
 55	if (uobj->uapi_object->type_class->needs_kfree_rcu)
 56		kfree_rcu(uobj, rcu);
 57	else
 58		kfree(uobj);
 59}
 60
 
 
 
 
 
 61void uverbs_uobject_put(struct ib_uobject *uobject)
 62{
 63	kref_put(&uobject->ref, uverbs_uobject_free);
 64}
 
 65
 66static int uverbs_try_lock_object(struct ib_uobject *uobj,
 67				  enum rdma_lookup_mode mode)
 68{
 69	/*
 70	 * When a shared access is required, we use a positive counter. Each
 71	 * shared access request checks that the value != -1 and increment it.
 72	 * Exclusive access is required for operations like write or destroy.
 73	 * In exclusive access mode, we check that the counter is zero (nobody
 74	 * claimed this object) and we set it to -1. Releasing a shared access
 75	 * lock is done simply by decreasing the counter. As for exclusive
 76	 * access locks, since only a single one of them is is allowed
 77	 * concurrently, setting the counter to zero is enough for releasing
 78	 * this lock.
 79	 */
 80	switch (mode) {
 81	case UVERBS_LOOKUP_READ:
 82		return atomic_fetch_add_unless(&uobj->usecnt, 1, -1) == -1 ?
 83			-EBUSY : 0;
 84	case UVERBS_LOOKUP_WRITE:
 85		/* lock is exclusive */
 86		return atomic_cmpxchg(&uobj->usecnt, 0, -1) == 0 ? 0 : -EBUSY;
 87	case UVERBS_LOOKUP_DESTROY:
 88		return 0;
 89	}
 90	return 0;
 91}
 92
 93static void assert_uverbs_usecnt(struct ib_uobject *uobj,
 94				 enum rdma_lookup_mode mode)
 95{
 96#ifdef CONFIG_LOCKDEP
 97	switch (mode) {
 98	case UVERBS_LOOKUP_READ:
 99		WARN_ON(atomic_read(&uobj->usecnt) <= 0);
100		break;
101	case UVERBS_LOOKUP_WRITE:
102		WARN_ON(atomic_read(&uobj->usecnt) != -1);
103		break;
104	case UVERBS_LOOKUP_DESTROY:
105		break;
106	}
107#endif
108}
109
110/*
111 * This must be called with the hw_destroy_rwsem locked for read or write,
112 * also the uobject itself must be locked for write.
113 *
114 * Upon return the HW object is guaranteed to be destroyed.
115 *
116 * For RDMA_REMOVE_ABORT, the hw_destroy_rwsem is not required to be held,
117 * however the type's allocat_commit function cannot have been called and the
118 * uobject cannot be on the uobjects_lists
119 *
120 * For RDMA_REMOVE_DESTROY the caller shold be holding a kref (eg via
121 * rdma_lookup_get_uobject) and the object is left in a state where the caller
122 * needs to call rdma_lookup_put_uobject.
123 *
124 * For all other destroy modes this function internally unlocks the uobject
125 * and consumes the kref on the uobj.
126 */
127static int uverbs_destroy_uobject(struct ib_uobject *uobj,
128				  enum rdma_remove_reason reason,
129				  struct uverbs_attr_bundle *attrs)
130{
131	struct ib_uverbs_file *ufile = attrs->ufile;
132	unsigned long flags;
133	int ret;
134
135	lockdep_assert_held(&ufile->hw_destroy_rwsem);
136	assert_uverbs_usecnt(uobj, UVERBS_LOOKUP_WRITE);
137
138	if (uobj->object) {
 
 
 
 
139		ret = uobj->uapi_object->type_class->destroy_hw(uobj, reason,
140								attrs);
141		if (ret) {
142			if (ib_is_destroy_retryable(ret, reason, uobj))
143				return ret;
144
145			/* Nothing to be done, dangle the memory and move on */
146			WARN(true,
147			     "ib_uverbs: failed to remove uobject id %d, driver err=%d",
148			     uobj->id, ret);
149		}
150
151		uobj->object = NULL;
152	}
153
154	if (reason == RDMA_REMOVE_ABORT) {
155		WARN_ON(!list_empty(&uobj->list));
156		WARN_ON(!uobj->context);
157		uobj->uapi_object->type_class->alloc_abort(uobj);
158	}
159
160	uobj->context = NULL;
161
162	/*
163	 * For DESTROY the usecnt is held write locked, the caller is expected
164	 * to put it unlock and put the object when done with it. Only DESTROY
165	 * can remove the IDR handle.
166	 */
167	if (reason != RDMA_REMOVE_DESTROY)
168		atomic_set(&uobj->usecnt, 0);
169	else
170		uobj->uapi_object->type_class->remove_handle(uobj);
171
172	if (!list_empty(&uobj->list)) {
173		spin_lock_irqsave(&ufile->uobjects_lock, flags);
174		list_del_init(&uobj->list);
175		spin_unlock_irqrestore(&ufile->uobjects_lock, flags);
176
177		/*
178		 * Pairs with the get in rdma_alloc_commit_uobject(), could
179		 * destroy uobj.
180		 */
181		uverbs_uobject_put(uobj);
182	}
183
184	/*
185	 * When aborting the stack kref remains owned by the core code, and is
186	 * not transferred into the type. Pairs with the get in alloc_uobj
187	 */
188	if (reason == RDMA_REMOVE_ABORT)
189		uverbs_uobject_put(uobj);
190
191	return 0;
192}
193
194/*
195 * This calls uverbs_destroy_uobject() using the RDMA_REMOVE_DESTROY
196 * sequence. It should only be used from command callbacks. On success the
197 * caller must pair this with rdma_lookup_put_uobject(LOOKUP_WRITE). This
198 * version requires the caller to have already obtained an
199 * LOOKUP_DESTROY uobject kref.
200 */
201int uobj_destroy(struct ib_uobject *uobj, struct uverbs_attr_bundle *attrs)
202{
203	struct ib_uverbs_file *ufile = attrs->ufile;
204	int ret;
205
206	down_read(&ufile->hw_destroy_rwsem);
207
 
 
 
 
 
 
 
208	ret = uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE);
209	if (ret)
210		goto out_unlock;
211
212	ret = uverbs_destroy_uobject(uobj, RDMA_REMOVE_DESTROY, attrs);
213	if (ret) {
214		atomic_set(&uobj->usecnt, 0);
215		goto out_unlock;
216	}
217
218out_unlock:
219	up_read(&ufile->hw_destroy_rwsem);
220	return ret;
221}
222
223/*
224 * uobj_get_destroy destroys the HW object and returns a handle to the uobj
225 * with a NULL object pointer. The caller must pair this with
226 * uverbs_put_destroy.
227 */
228struct ib_uobject *__uobj_get_destroy(const struct uverbs_api_object *obj,
229				      u32 id, struct uverbs_attr_bundle *attrs)
230{
231	struct ib_uobject *uobj;
232	int ret;
233
234	uobj = rdma_lookup_get_uobject(obj, attrs->ufile, id,
235				       UVERBS_LOOKUP_DESTROY, attrs);
236	if (IS_ERR(uobj))
237		return uobj;
238
239	ret = uobj_destroy(uobj, attrs);
240	if (ret) {
241		rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY);
242		return ERR_PTR(ret);
243	}
244
245	return uobj;
246}
247
248/*
249 * Does both uobj_get_destroy() and uobj_put_destroy().  Returns 0 on success
250 * (negative errno on failure). For use by callers that do not need the uobj.
251 */
252int __uobj_perform_destroy(const struct uverbs_api_object *obj, u32 id,
253			   struct uverbs_attr_bundle *attrs)
254{
255	struct ib_uobject *uobj;
256
257	uobj = __uobj_get_destroy(obj, id, attrs);
258	if (IS_ERR(uobj))
259		return PTR_ERR(uobj);
260
261	rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
262	return 0;
263}
264
265/* alloc_uobj must be undone by uverbs_destroy_uobject() */
266static struct ib_uobject *alloc_uobj(struct ib_uverbs_file *ufile,
267				     const struct uverbs_api_object *obj)
268{
 
269	struct ib_uobject *uobj;
270	struct ib_ucontext *ucontext;
271
272	ucontext = ib_uverbs_get_ucontext_file(ufile);
273	if (IS_ERR(ucontext))
274		return ERR_CAST(ucontext);
 
 
 
 
 
275
276	uobj = kzalloc(obj->type_attrs->obj_size, GFP_KERNEL);
277	if (!uobj)
278		return ERR_PTR(-ENOMEM);
279	/*
280	 * user_handle should be filled by the handler,
281	 * The object is added to the list in the commit stage.
282	 */
283	uobj->ufile = ufile;
284	uobj->context = ucontext;
285	INIT_LIST_HEAD(&uobj->list);
286	uobj->uapi_object = obj;
287	/*
288	 * Allocated objects start out as write locked to deny any other
289	 * syscalls from accessing them until they are committed. See
290	 * rdma_alloc_commit_uobject
291	 */
292	atomic_set(&uobj->usecnt, -1);
293	kref_init(&uobj->ref);
294
295	return uobj;
296}
297
298static int idr_add_uobj(struct ib_uobject *uobj)
299{
300       /*
301        * We start with allocating an idr pointing to NULL. This represents an
302        * object which isn't initialized yet. We'll replace it later on with
303        * the real object once we commit.
304        */
305	return xa_alloc(&uobj->ufile->idr, &uobj->id, NULL, xa_limit_32b,
306			GFP_KERNEL);
307}
308
309/* Returns the ib_uobject or an error. The caller should check for IS_ERR. */
310static struct ib_uobject *
311lookup_get_idr_uobject(const struct uverbs_api_object *obj,
312		       struct ib_uverbs_file *ufile, s64 id,
313		       enum rdma_lookup_mode mode)
314{
315	struct ib_uobject *uobj;
316
317	if (id < 0 || id > ULONG_MAX)
318		return ERR_PTR(-EINVAL);
319
320	rcu_read_lock();
321	/*
322	 * The idr_find is guaranteed to return a pointer to something that
323	 * isn't freed yet, or NULL, as the free after idr_remove goes through
324	 * kfree_rcu(). However the object may still have been released and
325	 * kfree() could be called at any time.
326	 */
327	uobj = xa_load(&ufile->idr, id);
328	if (!uobj || !kref_get_unless_zero(&uobj->ref))
329		uobj = ERR_PTR(-ENOENT);
330	rcu_read_unlock();
331	return uobj;
332}
333
334static struct ib_uobject *
335lookup_get_fd_uobject(const struct uverbs_api_object *obj,
336		      struct ib_uverbs_file *ufile, s64 id,
337		      enum rdma_lookup_mode mode)
338{
339	const struct uverbs_obj_fd_type *fd_type;
340	struct file *f;
341	struct ib_uobject *uobject;
342	int fdno = id;
343
344	if (fdno != id)
345		return ERR_PTR(-EINVAL);
346
347	if (mode != UVERBS_LOOKUP_READ)
348		return ERR_PTR(-EOPNOTSUPP);
349
350	if (!obj->type_attrs)
351		return ERR_PTR(-EIO);
352	fd_type =
353		container_of(obj->type_attrs, struct uverbs_obj_fd_type, type);
354
355	f = fget(fdno);
356	if (!f)
357		return ERR_PTR(-EBADF);
358
359	uobject = f->private_data;
360	/*
361	 * fget(id) ensures we are not currently running uverbs_close_fd,
362	 * and the caller is expected to ensure that uverbs_close_fd is never
363	 * done while a call top lookup is possible.
364	 */
365	if (f->f_op != fd_type->fops) {
366		fput(f);
367		return ERR_PTR(-EBADF);
368	}
369
370	uverbs_uobject_get(uobject);
371	return uobject;
372}
373
374struct ib_uobject *rdma_lookup_get_uobject(const struct uverbs_api_object *obj,
375					   struct ib_uverbs_file *ufile, s64 id,
376					   enum rdma_lookup_mode mode,
377					   struct uverbs_attr_bundle *attrs)
378{
379	struct ib_uobject *uobj;
380	int ret;
381
382	if (obj == ERR_PTR(-ENOMSG)) {
383		/* must be UVERBS_IDR_ANY_OBJECT, see uapi_get_object() */
384		uobj = lookup_get_idr_uobject(NULL, ufile, id, mode);
385		if (IS_ERR(uobj))
386			return uobj;
387	} else {
388		if (IS_ERR(obj))
389			return ERR_PTR(-EINVAL);
390
391		uobj = obj->type_class->lookup_get(obj, ufile, id, mode);
392		if (IS_ERR(uobj))
393			return uobj;
394
395		if (uobj->uapi_object != obj) {
396			ret = -EINVAL;
397			goto free;
398		}
399	}
400
401	/*
402	 * If we have been disassociated block every command except for
403	 * DESTROY based commands.
404	 */
405	if (mode != UVERBS_LOOKUP_DESTROY &&
406	    !srcu_dereference(ufile->device->ib_dev,
407			      &ufile->device->disassociate_srcu)) {
408		ret = -EIO;
409		goto free;
410	}
411
412	ret = uverbs_try_lock_object(uobj, mode);
413	if (ret)
414		goto free;
415	if (attrs)
416		attrs->context = uobj->context;
417
418	return uobj;
419free:
420	uobj->uapi_object->type_class->lookup_put(uobj, mode);
421	uverbs_uobject_put(uobj);
422	return ERR_PTR(ret);
423}
424
425static struct ib_uobject *
426alloc_begin_idr_uobject(const struct uverbs_api_object *obj,
427			struct ib_uverbs_file *ufile)
428{
429	int ret;
430	struct ib_uobject *uobj;
431
432	uobj = alloc_uobj(ufile, obj);
433	if (IS_ERR(uobj))
434		return uobj;
435
436	ret = idr_add_uobj(uobj);
437	if (ret)
438		goto uobj_put;
439
440	ret = ib_rdmacg_try_charge(&uobj->cg_obj, uobj->context->device,
441				   RDMACG_RESOURCE_HCA_OBJECT);
442	if (ret)
443		goto remove;
444
445	return uobj;
446
447remove:
448	xa_erase(&ufile->idr, uobj->id);
449uobj_put:
450	uverbs_uobject_put(uobj);
451	return ERR_PTR(ret);
452}
453
454static struct ib_uobject *
455alloc_begin_fd_uobject(const struct uverbs_api_object *obj,
456		       struct ib_uverbs_file *ufile)
457{
 
458	int new_fd;
459	struct ib_uobject *uobj;
 
 
 
 
 
 
 
 
 
 
 
 
 
460
461	new_fd = get_unused_fd_flags(O_CLOEXEC);
462	if (new_fd < 0)
463		return ERR_PTR(new_fd);
 
 
464
465	uobj = alloc_uobj(ufile, obj);
466	if (IS_ERR(uobj)) {
467		put_unused_fd(new_fd);
468		return uobj;
 
 
469	}
 
470
471	uobj->id = new_fd;
472	uobj->ufile = ufile;
473
474	return uobj;
 
 
 
 
475}
476
477struct ib_uobject *rdma_alloc_begin_uobject(const struct uverbs_api_object *obj,
478					    struct ib_uverbs_file *ufile,
479					    struct uverbs_attr_bundle *attrs)
480{
 
481	struct ib_uobject *ret;
482
483	if (IS_ERR(obj))
484		return ERR_PTR(-EINVAL);
485
486	/*
487	 * The hw_destroy_rwsem is held across the entire object creation and
488	 * released during rdma_alloc_commit_uobject or
489	 * rdma_alloc_abort_uobject
490	 */
491	if (!down_read_trylock(&ufile->hw_destroy_rwsem))
492		return ERR_PTR(-EIO);
493
494	ret = obj->type_class->alloc_begin(obj, ufile);
495	if (IS_ERR(ret)) {
496		up_read(&ufile->hw_destroy_rwsem);
497		return ret;
498	}
499	if (attrs)
500		attrs->context = ret->context;
501	return ret;
502}
503
504static void alloc_abort_idr_uobject(struct ib_uobject *uobj)
505{
506	ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
507			   RDMACG_RESOURCE_HCA_OBJECT);
508
509	xa_erase(&uobj->ufile->idr, uobj->id);
510}
511
512static int __must_check destroy_hw_idr_uobject(struct ib_uobject *uobj,
513					       enum rdma_remove_reason why,
514					       struct uverbs_attr_bundle *attrs)
515{
516	const struct uverbs_obj_idr_type *idr_type =
517		container_of(uobj->uapi_object->type_attrs,
518			     struct uverbs_obj_idr_type, type);
519	int ret = idr_type->destroy_object(uobj, why, attrs);
520
521	/*
522	 * We can only fail gracefully if the user requested to destroy the
523	 * object or when a retry may be called upon an error.
524	 * In the rest of the cases, just remove whatever you can.
525	 */
526	if (ib_is_destroy_retryable(ret, why, uobj))
527		return ret;
528
529	if (why == RDMA_REMOVE_ABORT)
530		return 0;
531
532	ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
533			   RDMACG_RESOURCE_HCA_OBJECT);
534
535	return 0;
536}
537
538static void remove_handle_idr_uobject(struct ib_uobject *uobj)
539{
540	xa_erase(&uobj->ufile->idr, uobj->id);
541	/* Matches the kref in alloc_commit_idr_uobject */
542	uverbs_uobject_put(uobj);
543}
544
545static void alloc_abort_fd_uobject(struct ib_uobject *uobj)
546{
 
 
 
547	put_unused_fd(uobj->id);
548}
549
550static int __must_check destroy_hw_fd_uobject(struct ib_uobject *uobj,
551					      enum rdma_remove_reason why,
552					      struct uverbs_attr_bundle *attrs)
553{
554	const struct uverbs_obj_fd_type *fd_type = container_of(
555		uobj->uapi_object->type_attrs, struct uverbs_obj_fd_type, type);
556	int ret = fd_type->context_closed(uobj, why);
557
558	if (ib_is_destroy_retryable(ret, why, uobj))
559		return ret;
560
 
561	return 0;
562}
563
564static void remove_handle_fd_uobject(struct ib_uobject *uobj)
565{
566}
567
568static int alloc_commit_idr_uobject(struct ib_uobject *uobj)
569{
570	struct ib_uverbs_file *ufile = uobj->ufile;
571	void *old;
572
573	/*
574	 * We already allocated this IDR with a NULL object, so
575	 * this shouldn't fail.
576	 *
577	 * NOTE: Storing the uobj transfers our kref on uobj to the XArray.
578	 * It will be put by remove_commit_idr_uobject()
579	 */
580	old = xa_store(&ufile->idr, uobj->id, uobj, GFP_KERNEL);
581	WARN_ON(old != NULL);
582
583	return 0;
584}
585
586static int alloc_commit_fd_uobject(struct ib_uobject *uobj)
 
587{
588	const struct uverbs_obj_fd_type *fd_type = container_of(
589		uobj->uapi_object->type_attrs, struct uverbs_obj_fd_type, type);
590	int fd = uobj->id;
591	struct file *filp;
592
593	/*
594	 * The kref for uobj is moved into filp->private data and put in
595	 * uverbs_close_fd(). Once alloc_commit() succeeds uverbs_close_fd()
596	 * must be guaranteed to be called from the provided fops release
597	 * callback.
598	 */
599	filp = anon_inode_getfile(fd_type->name,
600				  fd_type->fops,
601				  uobj,
602				  fd_type->flags);
603	if (IS_ERR(filp))
604		return PTR_ERR(filp);
 
 
605
606	uobj->object = filp;
 
 
 
607
608	/* Matching put will be done in uverbs_close_fd() */
609	kref_get(&uobj->ufile->ref);
610
611	/* This shouldn't be used anymore. Use the file object instead */
612	uobj->id = 0;
613
614	/*
615	 * NOTE: Once we install the file we loose ownership of our kref on
616	 * uobj. It will be put by uverbs_close_fd()
617	 */
 
618	fd_install(fd, filp);
619
620	return 0;
621}
622
623/*
624 * In all cases rdma_alloc_commit_uobject() consumes the kref to uobj and the
625 * caller can no longer assume uobj is valid. If this function fails it
626 * destroys the uboject, including the attached HW object.
627 */
628int __must_check rdma_alloc_commit_uobject(struct ib_uobject *uobj,
629					   struct uverbs_attr_bundle *attrs)
630{
631	struct ib_uverbs_file *ufile = attrs->ufile;
632	int ret;
633
634	/* alloc_commit consumes the uobj kref */
635	ret = uobj->uapi_object->type_class->alloc_commit(uobj);
636	if (ret) {
637		uverbs_destroy_uobject(uobj, RDMA_REMOVE_ABORT, attrs);
638		up_read(&ufile->hw_destroy_rwsem);
639		return ret;
640	}
641
642	/* kref is held so long as the uobj is on the uobj list. */
643	uverbs_uobject_get(uobj);
644	spin_lock_irq(&ufile->uobjects_lock);
645	list_add(&uobj->list, &ufile->uobjects);
646	spin_unlock_irq(&ufile->uobjects_lock);
647
648	/* matches atomic_set(-1) in alloc_uobj */
649	atomic_set(&uobj->usecnt, 0);
650
 
 
 
651	/* Matches the down_read in rdma_alloc_begin_uobject */
652	up_read(&ufile->hw_destroy_rwsem);
 
653
654	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
655}
656
657/*
658 * This consumes the kref for uobj. It is up to the caller to unwind the HW
659 * object and anything else connected to uobj before calling this.
660 */
661void rdma_alloc_abort_uobject(struct ib_uobject *uobj,
662			      struct uverbs_attr_bundle *attrs)
 
663{
664	struct ib_uverbs_file *ufile = uobj->ufile;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
665
666	uobj->object = NULL;
667	uverbs_destroy_uobject(uobj, RDMA_REMOVE_ABORT, attrs);
668
669	/* Matches the down_read in rdma_alloc_begin_uobject */
670	up_read(&ufile->hw_destroy_rwsem);
671}
672
673static void lookup_put_idr_uobject(struct ib_uobject *uobj,
674				   enum rdma_lookup_mode mode)
675{
676}
677
678static void lookup_put_fd_uobject(struct ib_uobject *uobj,
679				  enum rdma_lookup_mode mode)
680{
681	struct file *filp = uobj->object;
682
683	WARN_ON(mode != UVERBS_LOOKUP_READ);
684	/* This indirectly calls uverbs_close_fd and free the object */
 
 
 
685	fput(filp);
686}
687
688void rdma_lookup_put_uobject(struct ib_uobject *uobj,
689			     enum rdma_lookup_mode mode)
690{
691	assert_uverbs_usecnt(uobj, mode);
692	uobj->uapi_object->type_class->lookup_put(uobj, mode);
693	/*
694	 * In order to unlock an object, either decrease its usecnt for
695	 * read access or zero it in case of exclusive access. See
696	 * uverbs_try_lock_object for locking schema information.
697	 */
698	switch (mode) {
699	case UVERBS_LOOKUP_READ:
700		atomic_dec(&uobj->usecnt);
701		break;
702	case UVERBS_LOOKUP_WRITE:
703		atomic_set(&uobj->usecnt, 0);
704		break;
705	case UVERBS_LOOKUP_DESTROY:
706		break;
707	}
708
 
709	/* Pairs with the kref obtained by type->lookup_get */
710	uverbs_uobject_put(uobj);
711}
712
713void setup_ufile_idr_uobject(struct ib_uverbs_file *ufile)
714{
715	xa_init_flags(&ufile->idr, XA_FLAGS_ALLOC);
716}
717
718void release_ufile_idr_uobject(struct ib_uverbs_file *ufile)
719{
720	struct ib_uobject *entry;
721	unsigned long id;
722
723	/*
724	 * At this point uverbs_cleanup_ufile() is guaranteed to have run, and
725	 * there are no HW objects left, however the xarray is still populated
726	 * with anything that has not been cleaned up by userspace. Since the
727	 * kref on ufile is 0, nothing is allowed to call lookup_get.
728	 *
729	 * This is an optimized equivalent to remove_handle_idr_uobject
730	 */
731	xa_for_each(&ufile->idr, id, entry) {
732		WARN_ON(entry->object);
733		uverbs_uobject_put(entry);
734	}
735
736	xa_destroy(&ufile->idr);
737}
738
739const struct uverbs_obj_type_class uverbs_idr_class = {
740	.alloc_begin = alloc_begin_idr_uobject,
741	.lookup_get = lookup_get_idr_uobject,
742	.alloc_commit = alloc_commit_idr_uobject,
743	.alloc_abort = alloc_abort_idr_uobject,
744	.lookup_put = lookup_put_idr_uobject,
745	.destroy_hw = destroy_hw_idr_uobject,
746	.remove_handle = remove_handle_idr_uobject,
747	/*
748	 * When we destroy an object, we first just lock it for WRITE and
749	 * actually DESTROY it in the finalize stage. So, the problematic
750	 * scenario is when we just started the finalize stage of the
751	 * destruction (nothing was executed yet). Now, the other thread
752	 * fetched the object for READ access, but it didn't lock it yet.
753	 * The DESTROY thread continues and starts destroying the object.
754	 * When the other thread continue - without the RCU, it would
755	 * access freed memory. However, the rcu_read_lock delays the free
756	 * until the rcu_read_lock of the READ operation quits. Since the
757	 * exclusive lock of the object is still taken by the DESTROY flow, the
758	 * READ operation will get -EBUSY and it'll just bail out.
759	 */
760	.needs_kfree_rcu = true,
761};
762EXPORT_SYMBOL(uverbs_idr_class);
763
764void uverbs_close_fd(struct file *f)
 
 
 
 
765{
766	struct ib_uobject *uobj = f->private_data;
767	struct ib_uverbs_file *ufile = uobj->ufile;
768	struct uverbs_attr_bundle attrs = {
769		.context = uobj->context,
770		.ufile = ufile,
771	};
 
 
 
 
772
773	if (down_read_trylock(&ufile->hw_destroy_rwsem)) {
 
 
 
 
 
774		/*
775		 * lookup_get_fd_uobject holds the kref on the struct file any
776		 * time a FD uobj is locked, which prevents this release
777		 * method from being invoked. Meaning we can always get the
778		 * write lock here, or we have a kernel bug.
779		 */
780		WARN_ON(uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE));
781		uverbs_destroy_uobject(uobj, RDMA_REMOVE_CLOSE, &attrs);
782		up_read(&ufile->hw_destroy_rwsem);
783	}
784
785	/* Matches the get in alloc_begin_fd_uobject */
786	kref_put(&ufile->ref, ib_uverbs_release_file);
787
788	/* Pairs with filp->private_data in alloc_begin_fd_uobject */
789	uverbs_uobject_put(uobj);
 
790}
791EXPORT_SYMBOL(uverbs_close_fd);
792
793/*
794 * Drop the ucontext off the ufile and completely disconnect it from the
795 * ib_device
796 */
797static void ufile_destroy_ucontext(struct ib_uverbs_file *ufile,
798				   enum rdma_remove_reason reason)
799{
800	struct ib_ucontext *ucontext = ufile->ucontext;
801	struct ib_device *ib_dev = ucontext->device;
802
803	/*
804	 * If we are closing the FD then the user mmap VMAs must have
805	 * already been destroyed as they hold on to the filep, otherwise
806	 * they need to be zap'd.
807	 */
808	if (reason == RDMA_REMOVE_DRIVER_REMOVE) {
809		uverbs_user_mmap_disassociate(ufile);
810		if (ib_dev->ops.disassociate_ucontext)
811			ib_dev->ops.disassociate_ucontext(ucontext);
812	}
813
814	ib_rdmacg_uncharge(&ucontext->cg_obj, ib_dev,
815			   RDMACG_RESOURCE_HCA_HANDLE);
816
817	rdma_restrack_del(&ucontext->res);
818
819	ib_dev->ops.dealloc_ucontext(ucontext);
 
820	kfree(ucontext);
821
822	ufile->ucontext = NULL;
823}
824
825static int __uverbs_cleanup_ufile(struct ib_uverbs_file *ufile,
826				  enum rdma_remove_reason reason)
827{
828	struct ib_uobject *obj, *next_obj;
829	int ret = -EINVAL;
830	struct uverbs_attr_bundle attrs = { .ufile = ufile };
831
832	/*
833	 * This shouldn't run while executing other commands on this
834	 * context. Thus, the only thing we should take care of is
835	 * releasing a FD while traversing this list. The FD could be
836	 * closed and released from the _release fop of this FD.
837	 * In order to mitigate this, we add a lock.
838	 * We take and release the lock per traversal in order to let
839	 * other threads (which might still use the FDs) chance to run.
840	 */
841	list_for_each_entry_safe(obj, next_obj, &ufile->uobjects, list) {
842		attrs.context = obj->context;
843		/*
844		 * if we hit this WARN_ON, that means we are
845		 * racing with a lookup_get.
846		 */
847		WARN_ON(uverbs_try_lock_object(obj, UVERBS_LOOKUP_WRITE));
 
 
848		if (!uverbs_destroy_uobject(obj, reason, &attrs))
849			ret = 0;
850		else
851			atomic_set(&obj->usecnt, 0);
852	}
 
 
 
 
 
853	return ret;
854}
855
856/*
857 * Destroy the uncontext and every uobject associated with it. If called with
858 * reason != RDMA_REMOVE_CLOSE this will not return until the destruction has
859 * been completed and ufile->ucontext is NULL.
860 *
861 * This is internally locked and can be called in parallel from multiple
862 * contexts.
863 */
864void uverbs_destroy_ufile_hw(struct ib_uverbs_file *ufile,
865			     enum rdma_remove_reason reason)
866{
867	if (reason == RDMA_REMOVE_CLOSE) {
868		/*
869		 * During destruction we might trigger something that
870		 * synchronously calls release on any file descriptor. For
871		 * this reason all paths that come from file_operations
872		 * release must use try_lock. They can progress knowing that
873		 * there is an ongoing uverbs_destroy_ufile_hw that will clean
874		 * up the driver resources.
875		 */
876		if (!mutex_trylock(&ufile->ucontext_lock))
877			return;
878
879	} else {
880		mutex_lock(&ufile->ucontext_lock);
881	}
882
883	down_write(&ufile->hw_destroy_rwsem);
884
885	/*
886	 * If a ucontext was never created then we can't have any uobjects to
887	 * cleanup, nothing to do.
888	 */
889	if (!ufile->ucontext)
890		goto done;
891
892	ufile->ucontext->closing = true;
893	ufile->ucontext->cleanup_retryable = true;
894	while (!list_empty(&ufile->uobjects))
895		if (__uverbs_cleanup_ufile(ufile, reason)) {
896			/*
897			 * No entry was cleaned-up successfully during this
898			 * iteration
899			 */
900			break;
901		}
902
903	ufile->ucontext->cleanup_retryable = false;
904	if (!list_empty(&ufile->uobjects))
905		__uverbs_cleanup_ufile(ufile, reason);
906
 
 
907	ufile_destroy_ucontext(ufile, reason);
908
909done:
910	up_write(&ufile->hw_destroy_rwsem);
911	mutex_unlock(&ufile->ucontext_lock);
912}
913
914const struct uverbs_obj_type_class uverbs_fd_class = {
915	.alloc_begin = alloc_begin_fd_uobject,
916	.lookup_get = lookup_get_fd_uobject,
917	.alloc_commit = alloc_commit_fd_uobject,
918	.alloc_abort = alloc_abort_fd_uobject,
919	.lookup_put = lookup_put_fd_uobject,
920	.destroy_hw = destroy_hw_fd_uobject,
921	.remove_handle = remove_handle_fd_uobject,
922	.needs_kfree_rcu = false,
923};
924EXPORT_SYMBOL(uverbs_fd_class);
925
926struct ib_uobject *
927uverbs_get_uobject_from_file(u16 object_id, enum uverbs_obj_access access,
928			     s64 id, struct uverbs_attr_bundle *attrs)
929{
930	const struct uverbs_api_object *obj =
931		uapi_get_object(attrs->ufile->device->uapi, object_id);
932
933	switch (access) {
934	case UVERBS_ACCESS_READ:
935		return rdma_lookup_get_uobject(obj, attrs->ufile, id,
936					       UVERBS_LOOKUP_READ, attrs);
937	case UVERBS_ACCESS_DESTROY:
938		/* Actual destruction is done inside uverbs_handle_method */
939		return rdma_lookup_get_uobject(obj, attrs->ufile, id,
940					       UVERBS_LOOKUP_DESTROY, attrs);
941	case UVERBS_ACCESS_WRITE:
942		return rdma_lookup_get_uobject(obj, attrs->ufile, id,
943					       UVERBS_LOOKUP_WRITE, attrs);
944	case UVERBS_ACCESS_NEW:
945		return rdma_alloc_begin_uobject(obj, attrs->ufile, attrs);
946	default:
947		WARN_ON(true);
948		return ERR_PTR(-EOPNOTSUPP);
949	}
950}
951
952int uverbs_finalize_object(struct ib_uobject *uobj,
953			   enum uverbs_obj_access access, bool commit,
954			   struct uverbs_attr_bundle *attrs)
955{
956	int ret = 0;
957
958	/*
959	 * refcounts should be handled at the object level and not at the
960	 * uobject level. Refcounts of the objects themselves are done in
961	 * handlers.
962	 */
963
964	switch (access) {
965	case UVERBS_ACCESS_READ:
966		rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_READ);
967		break;
968	case UVERBS_ACCESS_WRITE:
969		rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
970		break;
971	case UVERBS_ACCESS_DESTROY:
972		if (uobj)
973			rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY);
974		break;
975	case UVERBS_ACCESS_NEW:
976		if (commit)
977			ret = rdma_alloc_commit_uobject(uobj, attrs);
978		else
979			rdma_alloc_abort_uobject(uobj, attrs);
980		break;
981	default:
982		WARN_ON(true);
983		ret = -EOPNOTSUPP;
984	}
985
986	return ret;
987}