linux/drivers/infiniband/core/rdma_core.c
<<
>>
Prefs
   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 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 shold 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                        if (ib_is_destroy_retryable(ret, reason, uobj))
 142                                return ret;
 143
 144                        /* Nothing to be done, dangle the memory and move on */
 145                        WARN(true,
 146                             "ib_uverbs: failed to remove uobject id %d, driver err=%d",
 147                             uobj->id, ret);
 148                }
 149
 150                uobj->object = NULL;
 151        }
 152
 153        uobj->context = NULL;
 154
 155        /*
 156         * For DESTROY the usecnt is not changed, the caller is expected to
 157         * manage it via uobj_put_destroy(). Only DESTROY can remove the IDR
 158         * handle.
 159         */
 160        if (reason != RDMA_REMOVE_DESTROY)
 161                atomic_set(&uobj->usecnt, 0);
 162        else
 163                uobj->uapi_object->type_class->remove_handle(uobj);
 164
 165        if (!list_empty(&uobj->list)) {
 166                spin_lock_irqsave(&ufile->uobjects_lock, flags);
 167                list_del_init(&uobj->list);
 168                spin_unlock_irqrestore(&ufile->uobjects_lock, flags);
 169
 170                /*
 171                 * Pairs with the get in rdma_alloc_commit_uobject(), could
 172                 * destroy uobj.
 173                 */
 174                uverbs_uobject_put(uobj);
 175        }
 176
 177        /*
 178         * When aborting the stack kref remains owned by the core code, and is
 179         * not transferred into the type. Pairs with the get in alloc_uobj
 180         */
 181        if (reason == RDMA_REMOVE_ABORT)
 182                uverbs_uobject_put(uobj);
 183
 184        return 0;
 185}
 186
 187/*
 188 * This calls uverbs_destroy_uobject() using the RDMA_REMOVE_DESTROY
 189 * sequence. It should only be used from command callbacks. On success the
 190 * caller must pair this with uobj_put_destroy(). This
 191 * version requires the caller to have already obtained an
 192 * LOOKUP_DESTROY uobject kref.
 193 */
 194int uobj_destroy(struct ib_uobject *uobj, struct uverbs_attr_bundle *attrs)
 195{
 196        struct ib_uverbs_file *ufile = attrs->ufile;
 197        int ret;
 198
 199        down_read(&ufile->hw_destroy_rwsem);
 200
 201        /*
 202         * Once the uobject is destroyed by RDMA_REMOVE_DESTROY then it is left
 203         * write locked as the callers put it back with UVERBS_LOOKUP_DESTROY.
 204         * This is because any other concurrent thread can still see the object
 205         * in the xarray due to RCU. Leaving it locked ensures nothing else will
 206         * touch it.
 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 * uobj_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        uobj_put_destroy(uobj);
 261        return 0;
 262}
 263
 264/* alloc_uobj must be undone by uverbs_destroy_uobject() */
 265static struct ib_uobject *alloc_uobj(struct uverbs_attr_bundle *attrs,
 266                                     const struct uverbs_api_object *obj)
 267{
 268        struct ib_uverbs_file *ufile = attrs->ufile;
 269        struct ib_uobject *uobj;
 270
 271        if (!attrs->context) {
 272                struct ib_ucontext *ucontext =
 273                        ib_uverbs_get_ucontext_file(ufile);
 274
 275                if (IS_ERR(ucontext))
 276                        return ERR_CAST(ucontext);
 277                attrs->context = ucontext;
 278        }
 279
 280        uobj = kzalloc(obj->type_attrs->obj_size, GFP_KERNEL);
 281        if (!uobj)
 282                return ERR_PTR(-ENOMEM);
 283        /*
 284         * user_handle should be filled by the handler,
 285         * The object is added to the list in the commit stage.
 286         */
 287        uobj->ufile = ufile;
 288        uobj->context = attrs->context;
 289        INIT_LIST_HEAD(&uobj->list);
 290        uobj->uapi_object = obj;
 291        /*
 292         * Allocated objects start out as write locked to deny any other
 293         * syscalls from accessing them until they are committed. See
 294         * rdma_alloc_commit_uobject
 295         */
 296        atomic_set(&uobj->usecnt, -1);
 297        kref_init(&uobj->ref);
 298
 299        return uobj;
 300}
 301
 302static int idr_add_uobj(struct ib_uobject *uobj)
 303{
 304       /*
 305        * We start with allocating an idr pointing to NULL. This represents an
 306        * object which isn't initialized yet. We'll replace it later on with
 307        * the real object once we commit.
 308        */
 309        return xa_alloc(&uobj->ufile->idr, &uobj->id, NULL, xa_limit_32b,
 310                        GFP_KERNEL);
 311}
 312
 313/* Returns the ib_uobject or an error. The caller should check for IS_ERR. */
 314static struct ib_uobject *
 315lookup_get_idr_uobject(const struct uverbs_api_object *obj,
 316                       struct ib_uverbs_file *ufile, s64 id,
 317                       enum rdma_lookup_mode mode)
 318{
 319        struct ib_uobject *uobj;
 320
 321        if (id < 0 || id > ULONG_MAX)
 322                return ERR_PTR(-EINVAL);
 323
 324        rcu_read_lock();
 325        /*
 326         * The idr_find is guaranteed to return a pointer to something that
 327         * isn't freed yet, or NULL, as the free after idr_remove goes through
 328         * kfree_rcu(). However the object may still have been released and
 329         * kfree() could be called at any time.
 330         */
 331        uobj = xa_load(&ufile->idr, id);
 332        if (!uobj || !kref_get_unless_zero(&uobj->ref))
 333                uobj = ERR_PTR(-ENOENT);
 334        rcu_read_unlock();
 335        return uobj;
 336}
 337
 338static struct ib_uobject *
 339lookup_get_fd_uobject(const struct uverbs_api_object *obj,
 340                      struct ib_uverbs_file *ufile, s64 id,
 341                      enum rdma_lookup_mode mode)
 342{
 343        const struct uverbs_obj_fd_type *fd_type;
 344        struct file *f;
 345        struct ib_uobject *uobject;
 346        int fdno = id;
 347
 348        if (fdno != id)
 349                return ERR_PTR(-EINVAL);
 350
 351        if (mode != UVERBS_LOOKUP_READ)
 352                return ERR_PTR(-EOPNOTSUPP);
 353
 354        if (!obj->type_attrs)
 355                return ERR_PTR(-EIO);
 356        fd_type =
 357                container_of(obj->type_attrs, struct uverbs_obj_fd_type, type);
 358
 359        f = fget(fdno);
 360        if (!f)
 361                return ERR_PTR(-EBADF);
 362
 363        uobject = f->private_data;
 364        /*
 365         * fget(id) ensures we are not currently running
 366         * uverbs_uobject_fd_release(), and the caller is expected to ensure
 367         * that release is never done while a call to lookup is possible.
 368         */
 369        if (f->f_op != fd_type->fops || uobject->ufile != ufile) {
 370                fput(f);
 371                return ERR_PTR(-EBADF);
 372        }
 373
 374        uverbs_uobject_get(uobject);
 375        return uobject;
 376}
 377
 378struct ib_uobject *rdma_lookup_get_uobject(const struct uverbs_api_object *obj,
 379                                           struct ib_uverbs_file *ufile, s64 id,
 380                                           enum rdma_lookup_mode mode,
 381                                           struct uverbs_attr_bundle *attrs)
 382{
 383        struct ib_uobject *uobj;
 384        int ret;
 385
 386        if (obj == ERR_PTR(-ENOMSG)) {
 387                /* must be UVERBS_IDR_ANY_OBJECT, see uapi_get_object() */
 388                uobj = lookup_get_idr_uobject(NULL, ufile, id, mode);
 389                if (IS_ERR(uobj))
 390                        return uobj;
 391        } else {
 392                if (IS_ERR(obj))
 393                        return ERR_PTR(-EINVAL);
 394
 395                uobj = obj->type_class->lookup_get(obj, ufile, id, mode);
 396                if (IS_ERR(uobj))
 397                        return uobj;
 398
 399                if (uobj->uapi_object != obj) {
 400                        ret = -EINVAL;
 401                        goto free;
 402                }
 403        }
 404
 405        /*
 406         * If we have been disassociated block every command except for
 407         * DESTROY based commands.
 408         */
 409        if (mode != UVERBS_LOOKUP_DESTROY &&
 410            !srcu_dereference(ufile->device->ib_dev,
 411                              &ufile->device->disassociate_srcu)) {
 412                ret = -EIO;
 413                goto free;
 414        }
 415
 416        ret = uverbs_try_lock_object(uobj, mode);
 417        if (ret)
 418                goto free;
 419        if (attrs)
 420                attrs->context = uobj->context;
 421
 422        return uobj;
 423free:
 424        uobj->uapi_object->type_class->lookup_put(uobj, mode);
 425        uverbs_uobject_put(uobj);
 426        return ERR_PTR(ret);
 427}
 428
 429static struct ib_uobject *
 430alloc_begin_idr_uobject(const struct uverbs_api_object *obj,
 431                        struct uverbs_attr_bundle *attrs)
 432{
 433        int ret;
 434        struct ib_uobject *uobj;
 435
 436        uobj = alloc_uobj(attrs, obj);
 437        if (IS_ERR(uobj))
 438                return uobj;
 439
 440        ret = idr_add_uobj(uobj);
 441        if (ret)
 442                goto uobj_put;
 443
 444        ret = ib_rdmacg_try_charge(&uobj->cg_obj, uobj->context->device,
 445                                   RDMACG_RESOURCE_HCA_OBJECT);
 446        if (ret)
 447                goto remove;
 448
 449        return uobj;
 450
 451remove:
 452        xa_erase(&attrs->ufile->idr, uobj->id);
 453uobj_put:
 454        uverbs_uobject_put(uobj);
 455        return ERR_PTR(ret);
 456}
 457
 458static struct ib_uobject *
 459alloc_begin_fd_uobject(const struct uverbs_api_object *obj,
 460                       struct uverbs_attr_bundle *attrs)
 461{
 462        const struct uverbs_obj_fd_type *fd_type;
 463        int new_fd;
 464        struct ib_uobject *uobj, *ret;
 465        struct file *filp;
 466
 467        uobj = alloc_uobj(attrs, obj);
 468        if (IS_ERR(uobj))
 469                return uobj;
 470
 471        fd_type =
 472                container_of(obj->type_attrs, struct uverbs_obj_fd_type, type);
 473        if (WARN_ON(fd_type->fops->release != &uverbs_uobject_fd_release &&
 474                    fd_type->fops->release != &uverbs_async_event_release)) {
 475                ret = ERR_PTR(-EINVAL);
 476                goto err_fd;
 477        }
 478
 479        new_fd = get_unused_fd_flags(O_CLOEXEC);
 480        if (new_fd < 0) {
 481                ret = ERR_PTR(new_fd);
 482                goto err_fd;
 483        }
 484
 485        /* Note that uverbs_uobject_fd_release() is called during abort */
 486        filp = anon_inode_getfile(fd_type->name, fd_type->fops, NULL,
 487                                  fd_type->flags);
 488        if (IS_ERR(filp)) {
 489                ret = ERR_CAST(filp);
 490                goto err_getfile;
 491        }
 492        uobj->object = filp;
 493
 494        uobj->id = new_fd;
 495        return uobj;
 496
 497err_getfile:
 498        put_unused_fd(new_fd);
 499err_fd:
 500        uverbs_uobject_put(uobj);
 501        return ret;
 502}
 503
 504struct ib_uobject *rdma_alloc_begin_uobject(const struct uverbs_api_object *obj,
 505                                            struct uverbs_attr_bundle *attrs)
 506{
 507        struct ib_uverbs_file *ufile = attrs->ufile;
 508        struct ib_uobject *ret;
 509
 510        if (IS_ERR(obj))
 511                return ERR_PTR(-EINVAL);
 512
 513        /*
 514         * The hw_destroy_rwsem is held across the entire object creation and
 515         * released during rdma_alloc_commit_uobject or
 516         * rdma_alloc_abort_uobject
 517         */
 518        if (!down_read_trylock(&ufile->hw_destroy_rwsem))
 519                return ERR_PTR(-EIO);
 520
 521        ret = obj->type_class->alloc_begin(obj, attrs);
 522        if (IS_ERR(ret)) {
 523                up_read(&ufile->hw_destroy_rwsem);
 524                return ret;
 525        }
 526        return ret;
 527}
 528
 529static void alloc_abort_idr_uobject(struct ib_uobject *uobj)
 530{
 531        ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
 532                           RDMACG_RESOURCE_HCA_OBJECT);
 533
 534        xa_erase(&uobj->ufile->idr, uobj->id);
 535}
 536
 537static int __must_check destroy_hw_idr_uobject(struct ib_uobject *uobj,
 538                                               enum rdma_remove_reason why,
 539                                               struct uverbs_attr_bundle *attrs)
 540{
 541        const struct uverbs_obj_idr_type *idr_type =
 542                container_of(uobj->uapi_object->type_attrs,
 543                             struct uverbs_obj_idr_type, type);
 544        int ret = idr_type->destroy_object(uobj, why, attrs);
 545
 546        /*
 547         * We can only fail gracefully if the user requested to destroy the
 548         * object or when a retry may be called upon an error.
 549         * In the rest of the cases, just remove whatever you can.
 550         */
 551        if (ib_is_destroy_retryable(ret, why, uobj))
 552                return ret;
 553
 554        if (why == RDMA_REMOVE_ABORT)
 555                return 0;
 556
 557        ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
 558                           RDMACG_RESOURCE_HCA_OBJECT);
 559
 560        return 0;
 561}
 562
 563static void remove_handle_idr_uobject(struct ib_uobject *uobj)
 564{
 565        xa_erase(&uobj->ufile->idr, uobj->id);
 566        /* Matches the kref in alloc_commit_idr_uobject */
 567        uverbs_uobject_put(uobj);
 568}
 569
 570static void alloc_abort_fd_uobject(struct ib_uobject *uobj)
 571{
 572        struct file *filp = uobj->object;
 573
 574        fput(filp);
 575        put_unused_fd(uobj->id);
 576}
 577
 578static int __must_check destroy_hw_fd_uobject(struct ib_uobject *uobj,
 579                                              enum rdma_remove_reason why,
 580                                              struct uverbs_attr_bundle *attrs)
 581{
 582        const struct uverbs_obj_fd_type *fd_type = container_of(
 583                uobj->uapi_object->type_attrs, struct uverbs_obj_fd_type, type);
 584        int ret = fd_type->destroy_object(uobj, why);
 585
 586        if (ib_is_destroy_retryable(ret, why, uobj))
 587                return ret;
 588
 589        return 0;
 590}
 591
 592static void remove_handle_fd_uobject(struct ib_uobject *uobj)
 593{
 594}
 595
 596static void alloc_commit_idr_uobject(struct ib_uobject *uobj)
 597{
 598        struct ib_uverbs_file *ufile = uobj->ufile;
 599        void *old;
 600
 601        /*
 602         * We already allocated this IDR with a NULL object, so
 603         * this shouldn't fail.
 604         *
 605         * NOTE: Storing the uobj transfers our kref on uobj to the XArray.
 606         * It will be put by remove_commit_idr_uobject()
 607         */
 608        old = xa_store(&ufile->idr, uobj->id, uobj, GFP_KERNEL);
 609        WARN_ON(old != NULL);
 610}
 611
 612static void alloc_commit_fd_uobject(struct ib_uobject *uobj)
 613{
 614        int fd = uobj->id;
 615        struct file *filp = uobj->object;
 616
 617        /* Matching put will be done in uverbs_uobject_fd_release() */
 618        kref_get(&uobj->ufile->ref);
 619
 620        /* This shouldn't be used anymore. Use the file object instead */
 621        uobj->id = 0;
 622
 623        /*
 624         * NOTE: Once we install the file we loose ownership of our kref on
 625         * uobj. It will be put by uverbs_uobject_fd_release()
 626         */
 627        filp->private_data = uobj;
 628        fd_install(fd, filp);
 629}
 630
 631/*
 632 * In all cases rdma_alloc_commit_uobject() consumes the kref to uobj and the
 633 * caller can no longer assume uobj is valid. If this function fails it
 634 * destroys the uboject, including the attached HW object.
 635 */
 636void rdma_alloc_commit_uobject(struct ib_uobject *uobj,
 637                               struct uverbs_attr_bundle *attrs)
 638{
 639        struct ib_uverbs_file *ufile = attrs->ufile;
 640
 641        /* kref is held so long as the uobj is on the uobj list. */
 642        uverbs_uobject_get(uobj);
 643        spin_lock_irq(&ufile->uobjects_lock);
 644        list_add(&uobj->list, &ufile->uobjects);
 645        spin_unlock_irq(&ufile->uobjects_lock);
 646
 647        /* matches atomic_set(-1) in alloc_uobj */
 648        atomic_set(&uobj->usecnt, 0);
 649
 650        /* alloc_commit consumes the uobj kref */
 651        uobj->uapi_object->type_class->alloc_commit(uobj);
 652
 653        /* Matches the down_read in rdma_alloc_begin_uobject */
 654        up_read(&ufile->hw_destroy_rwsem);
 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                              bool hw_obj_valid)
 664{
 665        struct ib_uverbs_file *ufile = uobj->ufile;
 666        int ret;
 667
 668        if (hw_obj_valid) {
 669                ret = uobj->uapi_object->type_class->destroy_hw(
 670                        uobj, RDMA_REMOVE_ABORT, attrs);
 671                /*
 672                 * If the driver couldn't destroy the object then go ahead and
 673                 * commit it. Leaking objects that can't be destroyed is only
 674                 * done during FD close after the driver has a few more tries to
 675                 * destroy it.
 676                 */
 677                if (WARN_ON(ret))
 678                        return rdma_alloc_commit_uobject(uobj, attrs);
 679        }
 680
 681        uverbs_destroy_uobject(uobj, RDMA_REMOVE_ABORT, attrs);
 682
 683        /* Matches the down_read in rdma_alloc_begin_uobject */
 684        up_read(&ufile->hw_destroy_rwsem);
 685}
 686
 687static void lookup_put_idr_uobject(struct ib_uobject *uobj,
 688                                   enum rdma_lookup_mode mode)
 689{
 690}
 691
 692static void lookup_put_fd_uobject(struct ib_uobject *uobj,
 693                                  enum rdma_lookup_mode mode)
 694{
 695        struct file *filp = uobj->object;
 696
 697        WARN_ON(mode != UVERBS_LOOKUP_READ);
 698        /*
 699         * This indirectly calls uverbs_uobject_fd_release() and free the
 700         * object
 701         */
 702        fput(filp);
 703}
 704
 705void rdma_lookup_put_uobject(struct ib_uobject *uobj,
 706                             enum rdma_lookup_mode mode)
 707{
 708        assert_uverbs_usecnt(uobj, mode);
 709        /*
 710         * In order to unlock an object, either decrease its usecnt for
 711         * read access or zero it in case of exclusive access. See
 712         * uverbs_try_lock_object for locking schema information.
 713         */
 714        switch (mode) {
 715        case UVERBS_LOOKUP_READ:
 716                atomic_dec(&uobj->usecnt);
 717                break;
 718        case UVERBS_LOOKUP_WRITE:
 719                atomic_set(&uobj->usecnt, 0);
 720                break;
 721        case UVERBS_LOOKUP_DESTROY:
 722                break;
 723        }
 724
 725        uobj->uapi_object->type_class->lookup_put(uobj, mode);
 726        /* Pairs with the kref obtained by type->lookup_get */
 727        uverbs_uobject_put(uobj);
 728}
 729
 730void setup_ufile_idr_uobject(struct ib_uverbs_file *ufile)
 731{
 732        xa_init_flags(&ufile->idr, XA_FLAGS_ALLOC);
 733}
 734
 735void release_ufile_idr_uobject(struct ib_uverbs_file *ufile)
 736{
 737        struct ib_uobject *entry;
 738        unsigned long id;
 739
 740        /*
 741         * At this point uverbs_cleanup_ufile() is guaranteed to have run, and
 742         * there are no HW objects left, however the xarray is still populated
 743         * with anything that has not been cleaned up by userspace. Since the
 744         * kref on ufile is 0, nothing is allowed to call lookup_get.
 745         *
 746         * This is an optimized equivalent to remove_handle_idr_uobject
 747         */
 748        xa_for_each(&ufile->idr, id, entry) {
 749                WARN_ON(entry->object);
 750                uverbs_uobject_put(entry);
 751        }
 752
 753        xa_destroy(&ufile->idr);
 754}
 755
 756const struct uverbs_obj_type_class uverbs_idr_class = {
 757        .alloc_begin = alloc_begin_idr_uobject,
 758        .lookup_get = lookup_get_idr_uobject,
 759        .alloc_commit = alloc_commit_idr_uobject,
 760        .alloc_abort = alloc_abort_idr_uobject,
 761        .lookup_put = lookup_put_idr_uobject,
 762        .destroy_hw = destroy_hw_idr_uobject,
 763        .remove_handle = remove_handle_idr_uobject,
 764};
 765EXPORT_SYMBOL(uverbs_idr_class);
 766
 767/*
 768 * Users of UVERBS_TYPE_ALLOC_FD should set this function as the struct
 769 * file_operations release method.
 770 */
 771int uverbs_uobject_fd_release(struct inode *inode, struct file *filp)
 772{
 773        struct ib_uverbs_file *ufile;
 774        struct ib_uobject *uobj;
 775
 776        /*
 777         * This can only happen if the fput came from alloc_abort_fd_uobject()
 778         */
 779        if (!filp->private_data)
 780                return 0;
 781        uobj = filp->private_data;
 782        ufile = uobj->ufile;
 783
 784        if (down_read_trylock(&ufile->hw_destroy_rwsem)) {
 785                struct uverbs_attr_bundle attrs = {
 786                        .context = uobj->context,
 787                        .ufile = ufile,
 788                };
 789
 790                /*
 791                 * lookup_get_fd_uobject holds the kref on the struct file any
 792                 * time a FD uobj is locked, which prevents this release
 793                 * method from being invoked. Meaning we can always get the
 794                 * write lock here, or we have a kernel bug.
 795                 */
 796                WARN_ON(uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE));
 797                uverbs_destroy_uobject(uobj, RDMA_REMOVE_CLOSE, &attrs);
 798                up_read(&ufile->hw_destroy_rwsem);
 799        }
 800
 801        /* Matches the get in alloc_commit_fd_uobject() */
 802        kref_put(&ufile->ref, ib_uverbs_release_file);
 803
 804        /* Pairs with filp->private_data in alloc_begin_fd_uobject */
 805        uverbs_uobject_put(uobj);
 806        return 0;
 807}
 808EXPORT_SYMBOL(uverbs_uobject_fd_release);
 809
 810/*
 811 * Drop the ucontext off the ufile and completely disconnect it from the
 812 * ib_device
 813 */
 814static void ufile_destroy_ucontext(struct ib_uverbs_file *ufile,
 815                                   enum rdma_remove_reason reason)
 816{
 817        struct ib_ucontext *ucontext = ufile->ucontext;
 818        struct ib_device *ib_dev = ucontext->device;
 819
 820        /*
 821         * If we are closing the FD then the user mmap VMAs must have
 822         * already been destroyed as they hold on to the filep, otherwise
 823         * they need to be zap'd.
 824         */
 825        if (reason == RDMA_REMOVE_DRIVER_REMOVE) {
 826                uverbs_user_mmap_disassociate(ufile);
 827                if (ib_dev->ops.disassociate_ucontext)
 828                        ib_dev->ops.disassociate_ucontext(ucontext);
 829        }
 830
 831        ib_rdmacg_uncharge(&ucontext->cg_obj, ib_dev,
 832                           RDMACG_RESOURCE_HCA_HANDLE);
 833
 834        rdma_restrack_del(&ucontext->res);
 835
 836        ib_dev->ops.dealloc_ucontext(ucontext);
 837        WARN_ON(!xa_empty(&ucontext->mmap_xa));
 838        kfree(ucontext);
 839
 840        ufile->ucontext = NULL;
 841}
 842
 843static int __uverbs_cleanup_ufile(struct ib_uverbs_file *ufile,
 844                                  enum rdma_remove_reason reason)
 845{
 846        struct ib_uobject *obj, *next_obj;
 847        int ret = -EINVAL;
 848        struct uverbs_attr_bundle attrs = { .ufile = ufile };
 849
 850        /*
 851         * This shouldn't run while executing other commands on this
 852         * context. Thus, the only thing we should take care of is
 853         * releasing a FD while traversing this list. The FD could be
 854         * closed and released from the _release fop of this FD.
 855         * In order to mitigate this, we add a lock.
 856         * We take and release the lock per traversal in order to let
 857         * other threads (which might still use the FDs) chance to run.
 858         */
 859        list_for_each_entry_safe(obj, next_obj, &ufile->uobjects, list) {
 860                attrs.context = obj->context;
 861                /*
 862                 * if we hit this WARN_ON, that means we are
 863                 * racing with a lookup_get.
 864                 */
 865                WARN_ON(uverbs_try_lock_object(obj, UVERBS_LOOKUP_WRITE));
 866                if (!uverbs_destroy_uobject(obj, reason, &attrs))
 867                        ret = 0;
 868                else
 869                        atomic_set(&obj->usecnt, 0);
 870        }
 871        return ret;
 872}
 873
 874/*
 875 * Destroy the uncontext and every uobject associated with it.
 876 *
 877 * This is internally locked and can be called in parallel from multiple
 878 * contexts.
 879 */
 880void uverbs_destroy_ufile_hw(struct ib_uverbs_file *ufile,
 881                             enum rdma_remove_reason reason)
 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->cleanup_retryable = true;
 893        while (!list_empty(&ufile->uobjects))
 894                if (__uverbs_cleanup_ufile(ufile, reason)) {
 895                        /*
 896                         * No entry was cleaned-up successfully during this
 897                         * iteration. It is a driver bug to fail destruction.
 898                         */
 899                        WARN_ON(!list_empty(&ufile->uobjects));
 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}
 912
 913const struct uverbs_obj_type_class uverbs_fd_class = {
 914        .alloc_begin = alloc_begin_fd_uobject,
 915        .lookup_get = lookup_get_fd_uobject,
 916        .alloc_commit = alloc_commit_fd_uobject,
 917        .alloc_abort = alloc_abort_fd_uobject,
 918        .lookup_put = lookup_put_fd_uobject,
 919        .destroy_hw = destroy_hw_fd_uobject,
 920        .remove_handle = remove_handle_fd_uobject,
 921};
 922EXPORT_SYMBOL(uverbs_fd_class);
 923
 924struct ib_uobject *
 925uverbs_get_uobject_from_file(u16 object_id, enum uverbs_obj_access access,
 926                             s64 id, struct uverbs_attr_bundle *attrs)
 927{
 928        const struct uverbs_api_object *obj =
 929                uapi_get_object(attrs->ufile->device->uapi, object_id);
 930
 931        switch (access) {
 932        case UVERBS_ACCESS_READ:
 933                return rdma_lookup_get_uobject(obj, attrs->ufile, id,
 934                                               UVERBS_LOOKUP_READ, attrs);
 935        case UVERBS_ACCESS_DESTROY:
 936                /* Actual destruction is done inside uverbs_handle_method */
 937                return rdma_lookup_get_uobject(obj, attrs->ufile, id,
 938                                               UVERBS_LOOKUP_DESTROY, attrs);
 939        case UVERBS_ACCESS_WRITE:
 940                return rdma_lookup_get_uobject(obj, attrs->ufile, id,
 941                                               UVERBS_LOOKUP_WRITE, attrs);
 942        case UVERBS_ACCESS_NEW:
 943                return rdma_alloc_begin_uobject(obj, attrs);
 944        default:
 945                WARN_ON(true);
 946                return ERR_PTR(-EOPNOTSUPP);
 947        }
 948}
 949
 950void uverbs_finalize_object(struct ib_uobject *uobj,
 951                            enum uverbs_obj_access access, bool hw_obj_valid,
 952                            bool commit, struct uverbs_attr_bundle *attrs)
 953{
 954        /*
 955         * refcounts should be handled at the object level and not at the
 956         * uobject level. Refcounts of the objects themselves are done in
 957         * handlers.
 958         */
 959
 960        switch (access) {
 961        case UVERBS_ACCESS_READ:
 962                rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_READ);
 963                break;
 964        case UVERBS_ACCESS_WRITE:
 965                rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_WRITE);
 966                break;
 967        case UVERBS_ACCESS_DESTROY:
 968                if (uobj)
 969                        rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY);
 970                break;
 971        case UVERBS_ACCESS_NEW:
 972                if (commit)
 973                        rdma_alloc_commit_uobject(uobj, attrs);
 974                else
 975                        rdma_alloc_abort_uobject(uobj, attrs, hw_obj_valid);
 976                break;
 977        default:
 978                WARN_ON(true);
 979        }
 980}
 981