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_HWOBJ) {
 134                reason = RDMA_REMOVE_ABORT;
 135                ret = uobj->uapi_object->type_class->destroy_hw(uobj, reason,
 136                                                                attrs);
 137                /*
 138                 * Drivers are not permitted to ignore RDMA_REMOVE_ABORT, see
 139                 * ib_is_destroy_retryable, cleanup_retryable == false here.
 140                 */
 141                WARN_ON(ret);
 142        }
 143
 144        if (reason == RDMA_REMOVE_ABORT) {
 145                WARN_ON(!list_empty(&uobj->list));
 146                WARN_ON(!uobj->context);
 147                uobj->uapi_object->type_class->alloc_abort(uobj);
 148        } else if (uobj->object) {
 149                ret = uobj->uapi_object->type_class->destroy_hw(uobj, reason,
 150                                                                attrs);
 151                if (ret) {
 152                        if (ib_is_destroy_retryable(ret, reason, uobj))
 153                                return ret;
 154
 155                        /* Nothing to be done, dangle the memory and move on */
 156                        WARN(true,
 157                             "ib_uverbs: failed to remove uobject id %d, driver err=%d",
 158                             uobj->id, ret);
 159                }
 160
 161                uobj->object = NULL;
 162        }
 163
 164        uobj->context = NULL;
 165
 166        /*
 167         * For DESTROY the usecnt is not changed, the caller is expected to
 168         * manage it via uobj_put_destroy(). Only DESTROY can remove the IDR
 169         * handle.
 170         */
 171        if (reason != RDMA_REMOVE_DESTROY)
 172                atomic_set(&uobj->usecnt, 0);
 173        else
 174                uobj->uapi_object->type_class->remove_handle(uobj);
 175
 176        if (!list_empty(&uobj->list)) {
 177                spin_lock_irqsave(&ufile->uobjects_lock, flags);
 178                list_del_init(&uobj->list);
 179                spin_unlock_irqrestore(&ufile->uobjects_lock, flags);
 180
 181                /*
 182                 * Pairs with the get in rdma_alloc_commit_uobject(), could
 183                 * destroy uobj.
 184                 */
 185                uverbs_uobject_put(uobj);
 186        }
 187
 188        /*
 189         * When aborting the stack kref remains owned by the core code, and is
 190         * not transferred into the type. Pairs with the get in alloc_uobj
 191         */
 192        if (reason == RDMA_REMOVE_ABORT)
 193                uverbs_uobject_put(uobj);
 194
 195        return 0;
 196}
 197
 198/*
 199 * This calls uverbs_destroy_uobject() using the RDMA_REMOVE_DESTROY
 200 * sequence. It should only be used from command callbacks. On success the
 201 * caller must pair this with uobj_put_destroy(). This
 202 * version requires the caller to have already obtained an
 203 * LOOKUP_DESTROY uobject kref.
 204 */
 205int uobj_destroy(struct ib_uobject *uobj, struct uverbs_attr_bundle *attrs)
 206{
 207        struct ib_uverbs_file *ufile = attrs->ufile;
 208        int ret;
 209
 210        down_read(&ufile->hw_destroy_rwsem);
 211
 212        /*
 213         * Once the uobject is destroyed by RDMA_REMOVE_DESTROY then it is left
 214         * write locked as the callers put it back with UVERBS_LOOKUP_DESTROY.
 215         * This is because any other concurrent thread can still see the object
 216         * in the xarray due to RCU. Leaving it locked ensures nothing else will
 217         * touch it.
 218         */
 219        ret = uverbs_try_lock_object(uobj, UVERBS_LOOKUP_WRITE);
 220        if (ret)
 221                goto out_unlock;
 222
 223        ret = uverbs_destroy_uobject(uobj, RDMA_REMOVE_DESTROY, attrs);
 224        if (ret) {
 225                atomic_set(&uobj->usecnt, 0);
 226                goto out_unlock;
 227        }
 228
 229out_unlock:
 230        up_read(&ufile->hw_destroy_rwsem);
 231        return ret;
 232}
 233
 234/*
 235 * uobj_get_destroy destroys the HW object and returns a handle to the uobj
 236 * with a NULL object pointer. The caller must pair this with
 237 * uobj_put_destroy().
 238 */
 239struct ib_uobject *__uobj_get_destroy(const struct uverbs_api_object *obj,
 240                                      u32 id, struct uverbs_attr_bundle *attrs)
 241{
 242        struct ib_uobject *uobj;
 243        int ret;
 244
 245        uobj = rdma_lookup_get_uobject(obj, attrs->ufile, id,
 246                                       UVERBS_LOOKUP_DESTROY, attrs);
 247        if (IS_ERR(uobj))
 248                return uobj;
 249
 250        ret = uobj_destroy(uobj, attrs);
 251        if (ret) {
 252                rdma_lookup_put_uobject(uobj, UVERBS_LOOKUP_DESTROY);
 253                return ERR_PTR(ret);
 254        }
 255
 256        return uobj;
 257}
 258
 259/*
 260 * Does both uobj_get_destroy() and uobj_put_destroy().  Returns 0 on success
 261 * (negative errno on failure). For use by callers that do not need the uobj.
 262 */
 263int __uobj_perform_destroy(const struct uverbs_api_object *obj, u32 id,
 264                           struct uverbs_attr_bundle *attrs)
 265{
 266        struct ib_uobject *uobj;
 267
 268        uobj = __uobj_get_destroy(obj, id, attrs);
 269        if (IS_ERR(uobj))
 270                return PTR_ERR(uobj);
 271        uobj_put_destroy(uobj);
 272        return 0;
 273}
 274
 275/* alloc_uobj must be undone by uverbs_destroy_uobject() */
 276static struct ib_uobject *alloc_uobj(struct uverbs_attr_bundle *attrs,
 277                                     const struct uverbs_api_object *obj)
 278{
 279        struct ib_uverbs_file *ufile = attrs->ufile;
 280        struct ib_uobject *uobj;
 281
 282        if (!attrs->context) {
 283                struct ib_ucontext *ucontext =
 284                        ib_uverbs_get_ucontext_file(ufile);
 285
 286                if (IS_ERR(ucontext))
 287                        return ERR_CAST(ucontext);
 288                attrs->context = ucontext;
 289        }
 290
 291        uobj = kzalloc(obj->type_attrs->obj_size, GFP_KERNEL);
 292        if (!uobj)
 293                return ERR_PTR(-ENOMEM);
 294        /*
 295         * user_handle should be filled by the handler,
 296         * The object is added to the list in the commit stage.
 297         */
 298        uobj->ufile = ufile;
 299        uobj->context = attrs->context;
 300        INIT_LIST_HEAD(&uobj->list);
 301        uobj->uapi_object = obj;
 302        /*
 303         * Allocated objects start out as write locked to deny any other
 304         * syscalls from accessing them until they are committed. See
 305         * rdma_alloc_commit_uobject
 306         */
 307        atomic_set(&uobj->usecnt, -1);
 308        kref_init(&uobj->ref);
 309
 310        return uobj;
 311}
 312
 313static int idr_add_uobj(struct ib_uobject *uobj)
 314{
 315       /*
 316        * We start with allocating an idr pointing to NULL. This represents an
 317        * object which isn't initialized yet. We'll replace it later on with
 318        * the real object once we commit.
 319        */
 320        return xa_alloc(&uobj->ufile->idr, &uobj->id, NULL, xa_limit_32b,
 321                        GFP_KERNEL);
 322}
 323
 324/* Returns the ib_uobject or an error. The caller should check for IS_ERR. */
 325static struct ib_uobject *
 326lookup_get_idr_uobject(const struct uverbs_api_object *obj,
 327                       struct ib_uverbs_file *ufile, s64 id,
 328                       enum rdma_lookup_mode mode)
 329{
 330        struct ib_uobject *uobj;
 331
 332        if (id < 0 || id > ULONG_MAX)
 333                return ERR_PTR(-EINVAL);
 334
 335        rcu_read_lock();
 336        /*
 337         * The idr_find is guaranteed to return a pointer to something that
 338         * isn't freed yet, or NULL, as the free after idr_remove goes through
 339         * kfree_rcu(). However the object may still have been released and
 340         * kfree() could be called at any time.
 341         */
 342        uobj = xa_load(&ufile->idr, id);
 343        if (!uobj || !kref_get_unless_zero(&uobj->ref))
 344                uobj = ERR_PTR(-ENOENT);
 345        rcu_read_unlock();
 346        return uobj;
 347}
 348
 349static struct ib_uobject *
 350lookup_get_fd_uobject(const struct uverbs_api_object *obj,
 351                      struct ib_uverbs_file *ufile, s64 id,
 352                      enum rdma_lookup_mode mode)
 353{
 354        const struct uverbs_obj_fd_type *fd_type;
 355        struct file *f;
 356        struct ib_uobject *uobject;
 357        int fdno = id;
 358
 359        if (fdno != id)
 360                return ERR_PTR(-EINVAL);
 361
 362        if (mode != UVERBS_LOOKUP_READ)
 363                return ERR_PTR(-EOPNOTSUPP);
 364
 365        if (!obj->type_attrs)
 366                return ERR_PTR(-EIO);
 367        fd_type =
 368                container_of(obj->type_attrs, struct uverbs_obj_fd_type, type);
 369
 370        f = fget(fdno);
 371        if (!f)
 372                return ERR_PTR(-EBADF);
 373
 374        uobject = f->private_data;
 375        /*
 376         * fget(id) ensures we are not currently running
 377         * uverbs_uobject_fd_release(), and the caller is expected to ensure
 378         * that release is never done while a call to lookup is possible.
 379         */
 380        if (f->f_op != fd_type->fops || uobject->ufile != ufile) {
 381                fput(f);
 382                return ERR_PTR(-EBADF);
 383        }
 384
 385        uverbs_uobject_get(uobject);
 386        return uobject;
 387}
 388
 389struct ib_uobject *rdma_lookup_get_uobject(const struct uverbs_api_object *obj,
 390                                           struct ib_uverbs_file *ufile, s64 id,
 391                                           enum rdma_lookup_mode mode,
 392                                           struct uverbs_attr_bundle *attrs)
 393{
 394        struct ib_uobject *uobj;
 395        int ret;
 396
 397        if (obj == ERR_PTR(-ENOMSG)) {
 398                /* must be UVERBS_IDR_ANY_OBJECT, see uapi_get_object() */
 399                uobj = lookup_get_idr_uobject(NULL, ufile, id, mode);
 400                if (IS_ERR(uobj))
 401                        return uobj;
 402        } else {
 403                if (IS_ERR(obj))
 404                        return ERR_PTR(-EINVAL);
 405
 406                uobj = obj->type_class->lookup_get(obj, ufile, id, mode);
 407                if (IS_ERR(uobj))
 408                        return uobj;
 409
 410                if (uobj->uapi_object != obj) {
 411                        ret = -EINVAL;
 412                        goto free;
 413                }
 414        }
 415
 416        /*
 417         * If we have been disassociated block every command except for
 418         * DESTROY based commands.
 419         */
 420        if (mode != UVERBS_LOOKUP_DESTROY &&
 421            !srcu_dereference(ufile->device->ib_dev,
 422                              &ufile->device->disassociate_srcu)) {
 423                ret = -EIO;
 424                goto free;
 425        }
 426
 427        ret = uverbs_try_lock_object(uobj, mode);
 428        if (ret)
 429                goto free;
 430        if (attrs)
 431                attrs->context = uobj->context;
 432
 433        return uobj;
 434free:
 435        uobj->uapi_object->type_class->lookup_put(uobj, mode);
 436        uverbs_uobject_put(uobj);
 437        return ERR_PTR(ret);
 438}
 439
 440static struct ib_uobject *
 441alloc_begin_idr_uobject(const struct uverbs_api_object *obj,
 442                        struct uverbs_attr_bundle *attrs)
 443{
 444        int ret;
 445        struct ib_uobject *uobj;
 446
 447        uobj = alloc_uobj(attrs, obj);
 448        if (IS_ERR(uobj))
 449                return uobj;
 450
 451        ret = idr_add_uobj(uobj);
 452        if (ret)
 453                goto uobj_put;
 454
 455        ret = ib_rdmacg_try_charge(&uobj->cg_obj, uobj->context->device,
 456                                   RDMACG_RESOURCE_HCA_OBJECT);
 457        if (ret)
 458                goto remove;
 459
 460        return uobj;
 461
 462remove:
 463        xa_erase(&attrs->ufile->idr, uobj->id);
 464uobj_put:
 465        uverbs_uobject_put(uobj);
 466        return ERR_PTR(ret);
 467}
 468
 469static struct ib_uobject *
 470alloc_begin_fd_uobject(const struct uverbs_api_object *obj,
 471                       struct uverbs_attr_bundle *attrs)
 472{
 473        const struct uverbs_obj_fd_type *fd_type;
 474        int new_fd;
 475        struct ib_uobject *uobj, *ret;
 476        struct file *filp;
 477
 478        uobj = alloc_uobj(attrs, obj);
 479        if (IS_ERR(uobj))
 480                return uobj;
 481
 482        fd_type =
 483                container_of(obj->type_attrs, struct uverbs_obj_fd_type, type);
 484        if (WARN_ON(fd_type->fops->release != &uverbs_uobject_fd_release &&
 485                    fd_type->fops->release != &uverbs_async_event_release)) {
 486                ret = ERR_PTR(-EINVAL);
 487                goto err_fd;
 488        }
 489
 490        new_fd = get_unused_fd_flags(O_CLOEXEC);
 491        if (new_fd < 0) {
 492                ret = ERR_PTR(new_fd);
 493                goto err_fd;
 494        }
 495
 496        /* Note that uverbs_uobject_fd_release() is called during abort */
 497        filp = anon_inode_getfile(fd_type->name, fd_type->fops, NULL,
 498                                  fd_type->flags);
 499        if (IS_ERR(filp)) {
 500                ret = ERR_CAST(filp);
 501                goto err_getfile;
 502        }
 503        uobj->object = filp;
 504
 505        uobj->id = new_fd;
 506        return uobj;
 507
 508err_getfile:
 509        put_unused_fd(new_fd);
 510err_fd:
 511        uverbs_uobject_put(uobj);
 512        return ret;
 513}
 514
 515struct ib_uobject *rdma_alloc_begin_uobject(const struct uverbs_api_object *obj,
 516                                            struct uverbs_attr_bundle *attrs)
 517{
 518        struct ib_uverbs_file *ufile = attrs->ufile;
 519        struct ib_uobject *ret;
 520
 521        if (IS_ERR(obj))
 522                return ERR_PTR(-EINVAL);
 523
 524        /*
 525         * The hw_destroy_rwsem is held across the entire object creation and
 526         * released during rdma_alloc_commit_uobject or
 527         * rdma_alloc_abort_uobject
 528         */
 529        if (!down_read_trylock(&ufile->hw_destroy_rwsem))
 530                return ERR_PTR(-EIO);
 531
 532        ret = obj->type_class->alloc_begin(obj, attrs);
 533        if (IS_ERR(ret)) {
 534                up_read(&ufile->hw_destroy_rwsem);
 535                return ret;
 536        }
 537        return ret;
 538}
 539
 540static void alloc_abort_idr_uobject(struct ib_uobject *uobj)
 541{
 542        ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
 543                           RDMACG_RESOURCE_HCA_OBJECT);
 544
 545        xa_erase(&uobj->ufile->idr, uobj->id);
 546}
 547
 548static int __must_check destroy_hw_idr_uobject(struct ib_uobject *uobj,
 549                                               enum rdma_remove_reason why,
 550                                               struct uverbs_attr_bundle *attrs)
 551{
 552        const struct uverbs_obj_idr_type *idr_type =
 553                container_of(uobj->uapi_object->type_attrs,
 554                             struct uverbs_obj_idr_type, type);
 555        int ret = idr_type->destroy_object(uobj, why, attrs);
 556
 557        /*
 558         * We can only fail gracefully if the user requested to destroy the
 559         * object or when a retry may be called upon an error.
 560         * In the rest of the cases, just remove whatever you can.
 561         */
 562        if (ib_is_destroy_retryable(ret, why, uobj))
 563                return ret;
 564
 565        if (why == RDMA_REMOVE_ABORT)
 566                return 0;
 567
 568        ib_rdmacg_uncharge(&uobj->cg_obj, uobj->context->device,
 569                           RDMACG_RESOURCE_HCA_OBJECT);
 570
 571        return 0;
 572}
 573
 574static void remove_handle_idr_uobject(struct ib_uobject *uobj)
 575{
 576        xa_erase(&uobj->ufile->idr, uobj->id);
 577        /* Matches the kref in alloc_commit_idr_uobject */
 578        uverbs_uobject_put(uobj);
 579}
 580
 581static void alloc_abort_fd_uobject(struct ib_uobject *uobj)
 582{
 583        struct file *filp = uobj->object;
 584
 585        fput(filp);
 586        put_unused_fd(uobj->id);
 587}
 588
 589static int __must_check destroy_hw_fd_uobject(struct ib_uobject *uobj,
 590                                              enum rdma_remove_reason why,
 591                                              struct uverbs_attr_bundle *attrs)
 592{
 593        const struct uverbs_obj_fd_type *fd_type = container_of(
 594                uobj->uapi_object->type_attrs, struct uverbs_obj_fd_type, type);
 595        int ret = fd_type->destroy_object(uobj, why);
 596
 597        if (ib_is_destroy_retryable(ret, why, uobj))
 598                return ret;
 599
 600        return 0;
 601}
 602
 603static void remove_handle_fd_uobject(struct ib_uobject *uobj)
 604{
 605}
 606
 607static void alloc_commit_idr_uobject(struct ib_uobject *uobj)
 608{
 609        struct ib_uverbs_file *ufile = uobj->ufile;
 610        void *old;
 611
 612        /*
 613         * We already allocated this IDR with a NULL object, so
 614         * this shouldn't fail.
 615         *
 616         * NOTE: Storing the uobj transfers our kref on uobj to the XArray.
 617         * It will be put by remove_commit_idr_uobject()
 618         */
 619        old = xa_store(&ufile->idr, uobj->id, uobj, GFP_KERNEL);
 620        WARN_ON(old != NULL);
 621}
 622
 623static void alloc_commit_fd_uobject(struct ib_uobject *uobj)
 624{
 625        int fd = uobj->id;
 626        struct file *filp = uobj->object;
 627
 628        /* Matching put will be done in uverbs_uobject_fd_release() */
 629        kref_get(&uobj->ufile->ref);
 630
 631        /* This shouldn't be used anymore. Use the file object instead */
 632        uobj->id = 0;
 633
 634        /*
 635         * NOTE: Once we install the file we loose ownership of our kref on
 636         * uobj. It will be put by uverbs_uobject_fd_release()
 637         */
 638        filp->private_data = uobj;
 639        fd_install(fd, filp);
 640}
 641
 642/*
 643 * In all cases rdma_alloc_commit_uobject() consumes the kref to uobj and the
 644 * caller can no longer assume uobj is valid. If this function fails it
 645 * destroys the uboject, including the attached HW object.
 646 */
 647void rdma_alloc_commit_uobject(struct ib_uobject *uobj,
 648                               struct uverbs_attr_bundle *attrs)
 649{
 650        struct ib_uverbs_file *ufile = attrs->ufile;
 651
 652        /* kref is held so long as the uobj is on the uobj list. */
 653        uverbs_uobject_get(uobj);
 654        spin_lock_irq(&ufile->uobjects_lock);
 655        list_add(&uobj->list, &ufile->uobjects);
 656        spin_unlock_irq(&ufile->uobjects_lock);
 657
 658        /* matches atomic_set(-1) in alloc_uobj */
 659        atomic_set(&uobj->usecnt, 0);
 660
 661        /* alloc_commit consumes the uobj kref */
 662        uobj->uapi_object->type_class->alloc_commit(uobj);
 663
 664        /* Matches the down_read in rdma_alloc_begin_uobject */
 665        up_read(&ufile->hw_destroy_rwsem);
 666}
 667
 668/*
 669 * This consumes the kref for uobj. It is up to the caller to unwind the HW
 670 * object and anything else connected to uobj before calling this.
 671 */
 672void rdma_alloc_abort_uobject(struct ib_uobject *uobj,
 673                              struct uverbs_attr_bundle *attrs,
 674                              bool hw_obj_valid)
 675{
 676        struct ib_uverbs_file *ufile = uobj->ufile;
 677
 678        uverbs_destroy_uobject(uobj,
 679                               hw_obj_valid ? RDMA_REMOVE_ABORT_HWOBJ :
 680                                              RDMA_REMOVE_ABORT,
 681                               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->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}
 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