linux/drivers/infiniband/core/uverbs_main.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005 Topspin Communications.  All rights reserved.
   3 * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved.
   4 * Copyright (c) 2005 Mellanox Technologies. All rights reserved.
   5 * Copyright (c) 2005 Voltaire, Inc. All rights reserved.
   6 * Copyright (c) 2005 PathScale, Inc. All rights reserved.
   7 *
   8 * This software is available to you under a choice of one of two
   9 * licenses.  You may choose to be licensed under the terms of the GNU
  10 * General Public License (GPL) Version 2, available from the file
  11 * COPYING in the main directory of this source tree, or the
  12 * OpenIB.org BSD license below:
  13 *
  14 *     Redistribution and use in source and binary forms, with or
  15 *     without modification, are permitted provided that the following
  16 *     conditions are met:
  17 *
  18 *      - Redistributions of source code must retain the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer.
  21 *
  22 *      - Redistributions in binary form must reproduce the above
  23 *        copyright notice, this list of conditions and the following
  24 *        disclaimer in the documentation and/or other materials
  25 *        provided with the distribution.
  26 *
  27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  28 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  29 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  30 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  31 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  32 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  33 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  34 * SOFTWARE.
  35 *
  36 * $Id: uverbs_main.c 2733 2005-06-28 19:14:34Z roland $
  37 */
  38
  39#include <linux/module.h>
  40#include <linux/init.h>
  41#include <linux/device.h>
  42#include <linux/err.h>
  43#include <linux/fs.h>
  44#include <linux/poll.h>
  45#include <linux/file.h>
  46#include <linux/mount.h>
  47#include <linux/cdev.h>
  48
  49#include <asm/uaccess.h>
  50
  51#include "uverbs.h"
  52
  53MODULE_AUTHOR("Roland Dreier");
  54MODULE_DESCRIPTION("InfiniBand userspace verbs access");
  55MODULE_LICENSE("Dual BSD/GPL");
  56
  57#define INFINIBANDEVENTFS_MAGIC 0x49426576      /* "IBev" */
  58
  59enum {
  60        IB_UVERBS_MAJOR       = 231,
  61        IB_UVERBS_BASE_MINOR  = 192,
  62        IB_UVERBS_MAX_DEVICES = 32
  63};
  64
  65#define IB_UVERBS_BASE_DEV      MKDEV(IB_UVERBS_MAJOR, IB_UVERBS_BASE_MINOR)
  66
  67static struct class *uverbs_class;
  68
  69DEFINE_SPINLOCK(ib_uverbs_idr_lock);
  70DEFINE_IDR(ib_uverbs_pd_idr);
  71DEFINE_IDR(ib_uverbs_mr_idr);
  72DEFINE_IDR(ib_uverbs_mw_idr);
  73DEFINE_IDR(ib_uverbs_ah_idr);
  74DEFINE_IDR(ib_uverbs_cq_idr);
  75DEFINE_IDR(ib_uverbs_qp_idr);
  76DEFINE_IDR(ib_uverbs_srq_idr);
  77
  78static spinlock_t map_lock;
  79static struct ib_uverbs_device *dev_table[IB_UVERBS_MAX_DEVICES];
  80static DECLARE_BITMAP(dev_map, IB_UVERBS_MAX_DEVICES);
  81
  82static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file,
  83                                     const char __user *buf, int in_len,
  84                                     int out_len) = {
  85        [IB_USER_VERBS_CMD_GET_CONTEXT]         = ib_uverbs_get_context,
  86        [IB_USER_VERBS_CMD_QUERY_DEVICE]        = ib_uverbs_query_device,
  87        [IB_USER_VERBS_CMD_QUERY_PORT]          = ib_uverbs_query_port,
  88        [IB_USER_VERBS_CMD_ALLOC_PD]            = ib_uverbs_alloc_pd,
  89        [IB_USER_VERBS_CMD_DEALLOC_PD]          = ib_uverbs_dealloc_pd,
  90        [IB_USER_VERBS_CMD_REG_MR]              = ib_uverbs_reg_mr,
  91        [IB_USER_VERBS_CMD_DEREG_MR]            = ib_uverbs_dereg_mr,
  92        [IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL] = ib_uverbs_create_comp_channel,
  93        [IB_USER_VERBS_CMD_CREATE_CQ]           = ib_uverbs_create_cq,
  94        [IB_USER_VERBS_CMD_RESIZE_CQ]           = ib_uverbs_resize_cq,
  95        [IB_USER_VERBS_CMD_POLL_CQ]             = ib_uverbs_poll_cq,
  96        [IB_USER_VERBS_CMD_REQ_NOTIFY_CQ]       = ib_uverbs_req_notify_cq,
  97        [IB_USER_VERBS_CMD_DESTROY_CQ]          = ib_uverbs_destroy_cq,
  98        [IB_USER_VERBS_CMD_CREATE_QP]           = ib_uverbs_create_qp,
  99        [IB_USER_VERBS_CMD_QUERY_QP]            = ib_uverbs_query_qp,
 100        [IB_USER_VERBS_CMD_MODIFY_QP]           = ib_uverbs_modify_qp,
 101        [IB_USER_VERBS_CMD_DESTROY_QP]          = ib_uverbs_destroy_qp,
 102        [IB_USER_VERBS_CMD_POST_SEND]           = ib_uverbs_post_send,
 103        [IB_USER_VERBS_CMD_POST_RECV]           = ib_uverbs_post_recv,
 104        [IB_USER_VERBS_CMD_POST_SRQ_RECV]       = ib_uverbs_post_srq_recv,
 105        [IB_USER_VERBS_CMD_CREATE_AH]           = ib_uverbs_create_ah,
 106        [IB_USER_VERBS_CMD_DESTROY_AH]          = ib_uverbs_destroy_ah,
 107        [IB_USER_VERBS_CMD_ATTACH_MCAST]        = ib_uverbs_attach_mcast,
 108        [IB_USER_VERBS_CMD_DETACH_MCAST]        = ib_uverbs_detach_mcast,
 109        [IB_USER_VERBS_CMD_CREATE_SRQ]          = ib_uverbs_create_srq,
 110        [IB_USER_VERBS_CMD_MODIFY_SRQ]          = ib_uverbs_modify_srq,
 111        [IB_USER_VERBS_CMD_QUERY_SRQ]           = ib_uverbs_query_srq,
 112        [IB_USER_VERBS_CMD_DESTROY_SRQ]         = ib_uverbs_destroy_srq,
 113};
 114
 115static struct vfsmount *uverbs_event_mnt;
 116
 117static void ib_uverbs_add_one(struct ib_device *device);
 118static void ib_uverbs_remove_one(struct ib_device *device);
 119
 120static void ib_uverbs_release_dev(struct kref *ref)
 121{
 122        struct ib_uverbs_device *dev =
 123                container_of(ref, struct ib_uverbs_device, ref);
 124
 125        complete(&dev->comp);
 126}
 127
 128static void ib_uverbs_release_event_file(struct kref *ref)
 129{
 130        struct ib_uverbs_event_file *file =
 131                container_of(ref, struct ib_uverbs_event_file, ref);
 132
 133        kfree(file);
 134}
 135
 136void ib_uverbs_release_ucq(struct ib_uverbs_file *file,
 137                          struct ib_uverbs_event_file *ev_file,
 138                          struct ib_ucq_object *uobj)
 139{
 140        struct ib_uverbs_event *evt, *tmp;
 141
 142        if (ev_file) {
 143                spin_lock_irq(&ev_file->lock);
 144                list_for_each_entry_safe(evt, tmp, &uobj->comp_list, obj_list) {
 145                        list_del(&evt->list);
 146                        kfree(evt);
 147                }
 148                spin_unlock_irq(&ev_file->lock);
 149
 150                kref_put(&ev_file->ref, ib_uverbs_release_event_file);
 151        }
 152
 153        spin_lock_irq(&file->async_file->lock);
 154        list_for_each_entry_safe(evt, tmp, &uobj->async_list, obj_list) {
 155                list_del(&evt->list);
 156                kfree(evt);
 157        }
 158        spin_unlock_irq(&file->async_file->lock);
 159}
 160
 161void ib_uverbs_release_uevent(struct ib_uverbs_file *file,
 162                              struct ib_uevent_object *uobj)
 163{
 164        struct ib_uverbs_event *evt, *tmp;
 165
 166        spin_lock_irq(&file->async_file->lock);
 167        list_for_each_entry_safe(evt, tmp, &uobj->event_list, obj_list) {
 168                list_del(&evt->list);
 169                kfree(evt);
 170        }
 171        spin_unlock_irq(&file->async_file->lock);
 172}
 173
 174static void ib_uverbs_detach_umcast(struct ib_qp *qp,
 175                                    struct ib_uqp_object *uobj)
 176{
 177        struct ib_uverbs_mcast_entry *mcast, *tmp;
 178
 179        list_for_each_entry_safe(mcast, tmp, &uobj->mcast_list, list) {
 180                ib_detach_mcast(qp, &mcast->gid, mcast->lid);
 181                list_del(&mcast->list);
 182                kfree(mcast);
 183        }
 184}
 185
 186static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,
 187                                      struct ib_ucontext *context)
 188{
 189        struct ib_uobject *uobj, *tmp;
 190
 191        if (!context)
 192                return 0;
 193
 194        context->closing = 1;
 195
 196        list_for_each_entry_safe(uobj, tmp, &context->ah_list, list) {
 197                struct ib_ah *ah = uobj->object;
 198
 199                idr_remove_uobj(&ib_uverbs_ah_idr, uobj);
 200                ib_destroy_ah(ah);
 201                kfree(uobj);
 202        }
 203
 204        list_for_each_entry_safe(uobj, tmp, &context->qp_list, list) {
 205                struct ib_qp *qp = uobj->object;
 206                struct ib_uqp_object *uqp =
 207                        container_of(uobj, struct ib_uqp_object, uevent.uobject);
 208
 209                idr_remove_uobj(&ib_uverbs_qp_idr, uobj);
 210                ib_uverbs_detach_umcast(qp, uqp);
 211                ib_destroy_qp(qp);
 212                ib_uverbs_release_uevent(file, &uqp->uevent);
 213                kfree(uqp);
 214        }
 215
 216        list_for_each_entry_safe(uobj, tmp, &context->cq_list, list) {
 217                struct ib_cq *cq = uobj->object;
 218                struct ib_uverbs_event_file *ev_file = cq->cq_context;
 219                struct ib_ucq_object *ucq =
 220                        container_of(uobj, struct ib_ucq_object, uobject);
 221
 222                idr_remove_uobj(&ib_uverbs_cq_idr, uobj);
 223                ib_destroy_cq(cq);
 224                ib_uverbs_release_ucq(file, ev_file, ucq);
 225                kfree(ucq);
 226        }
 227
 228        list_for_each_entry_safe(uobj, tmp, &context->srq_list, list) {
 229                struct ib_srq *srq = uobj->object;
 230                struct ib_uevent_object *uevent =
 231                        container_of(uobj, struct ib_uevent_object, uobject);
 232
 233                idr_remove_uobj(&ib_uverbs_srq_idr, uobj);
 234                ib_destroy_srq(srq);
 235                ib_uverbs_release_uevent(file, uevent);
 236                kfree(uevent);
 237        }
 238
 239        /* XXX Free MWs */
 240
 241        list_for_each_entry_safe(uobj, tmp, &context->mr_list, list) {
 242                struct ib_mr *mr = uobj->object;
 243
 244                idr_remove_uobj(&ib_uverbs_mr_idr, uobj);
 245                ib_dereg_mr(mr);
 246                kfree(uobj);
 247        }
 248
 249        list_for_each_entry_safe(uobj, tmp, &context->pd_list, list) {
 250                struct ib_pd *pd = uobj->object;
 251
 252                idr_remove_uobj(&ib_uverbs_pd_idr, uobj);
 253                ib_dealloc_pd(pd);
 254                kfree(uobj);
 255        }
 256
 257        return context->device->dealloc_ucontext(context);
 258}
 259
 260static void ib_uverbs_release_file(struct kref *ref)
 261{
 262        struct ib_uverbs_file *file =
 263                container_of(ref, struct ib_uverbs_file, ref);
 264
 265        module_put(file->device->ib_dev->owner);
 266        kref_put(&file->device->ref, ib_uverbs_release_dev);
 267
 268        kfree(file);
 269}
 270
 271static ssize_t ib_uverbs_event_read(struct file *filp, char __user *buf,
 272                                    size_t count, loff_t *pos)
 273{
 274        struct ib_uverbs_event_file *file = filp->private_data;
 275        struct ib_uverbs_event *event;
 276        int eventsz;
 277        int ret = 0;
 278
 279        spin_lock_irq(&file->lock);
 280
 281        while (list_empty(&file->event_list)) {
 282                spin_unlock_irq(&file->lock);
 283
 284                if (filp->f_flags & O_NONBLOCK)
 285                        return -EAGAIN;
 286
 287                if (wait_event_interruptible(file->poll_wait,
 288                                             !list_empty(&file->event_list)))
 289                        return -ERESTARTSYS;
 290
 291                spin_lock_irq(&file->lock);
 292        }
 293
 294        event = list_entry(file->event_list.next, struct ib_uverbs_event, list);
 295
 296        if (file->is_async)
 297                eventsz = sizeof (struct ib_uverbs_async_event_desc);
 298        else
 299                eventsz = sizeof (struct ib_uverbs_comp_event_desc);
 300
 301        if (eventsz > count) {
 302                ret   = -EINVAL;
 303                event = NULL;
 304        } else {
 305                list_del(file->event_list.next);
 306                if (event->counter) {
 307                        ++(*event->counter);
 308                        list_del(&event->obj_list);
 309                }
 310        }
 311
 312        spin_unlock_irq(&file->lock);
 313
 314        if (event) {
 315                if (copy_to_user(buf, event, eventsz))
 316                        ret = -EFAULT;
 317                else
 318                        ret = eventsz;
 319        }
 320
 321        kfree(event);
 322
 323        return ret;
 324}
 325
 326static unsigned int ib_uverbs_event_poll(struct file *filp,
 327                                         struct poll_table_struct *wait)
 328{
 329        unsigned int pollflags = 0;
 330        struct ib_uverbs_event_file *file = filp->private_data;
 331
 332        poll_wait(filp, &file->poll_wait, wait);
 333
 334        spin_lock_irq(&file->lock);
 335        if (!list_empty(&file->event_list))
 336                pollflags = POLLIN | POLLRDNORM;
 337        spin_unlock_irq(&file->lock);
 338
 339        return pollflags;
 340}
 341
 342static int ib_uverbs_event_fasync(int fd, struct file *filp, int on)
 343{
 344        struct ib_uverbs_event_file *file = filp->private_data;
 345
 346        return fasync_helper(fd, filp, on, &file->async_queue);
 347}
 348
 349static int ib_uverbs_event_close(struct inode *inode, struct file *filp)
 350{
 351        struct ib_uverbs_event_file *file = filp->private_data;
 352        struct ib_uverbs_event *entry, *tmp;
 353
 354        spin_lock_irq(&file->lock);
 355        file->file = NULL;
 356        list_for_each_entry_safe(entry, tmp, &file->event_list, list) {
 357                if (entry->counter)
 358                        list_del(&entry->obj_list);
 359                kfree(entry);
 360        }
 361        spin_unlock_irq(&file->lock);
 362
 363        ib_uverbs_event_fasync(-1, filp, 0);
 364
 365        if (file->is_async) {
 366                ib_unregister_event_handler(&file->uverbs_file->event_handler);
 367                kref_put(&file->uverbs_file->ref, ib_uverbs_release_file);
 368        }
 369        kref_put(&file->ref, ib_uverbs_release_event_file);
 370
 371        return 0;
 372}
 373
 374static const struct file_operations uverbs_event_fops = {
 375        .owner   = THIS_MODULE,
 376        .read    = ib_uverbs_event_read,
 377        .poll    = ib_uverbs_event_poll,
 378        .release = ib_uverbs_event_close,
 379        .fasync  = ib_uverbs_event_fasync
 380};
 381
 382void ib_uverbs_comp_handler(struct ib_cq *cq, void *cq_context)
 383{
 384        struct ib_uverbs_event_file    *file = cq_context;
 385        struct ib_ucq_object           *uobj;
 386        struct ib_uverbs_event         *entry;
 387        unsigned long                   flags;
 388
 389        if (!file)
 390                return;
 391
 392        spin_lock_irqsave(&file->lock, flags);
 393        if (!file->file) {
 394                spin_unlock_irqrestore(&file->lock, flags);
 395                return;
 396        }
 397
 398        entry = kmalloc(sizeof *entry, GFP_ATOMIC);
 399        if (!entry) {
 400                spin_unlock_irqrestore(&file->lock, flags);
 401                return;
 402        }
 403
 404        uobj = container_of(cq->uobject, struct ib_ucq_object, uobject);
 405
 406        entry->desc.comp.cq_handle = cq->uobject->user_handle;
 407        entry->counter             = &uobj->comp_events_reported;
 408
 409        list_add_tail(&entry->list, &file->event_list);
 410        list_add_tail(&entry->obj_list, &uobj->comp_list);
 411        spin_unlock_irqrestore(&file->lock, flags);
 412
 413        wake_up_interruptible(&file->poll_wait);
 414        kill_fasync(&file->async_queue, SIGIO, POLL_IN);
 415}
 416
 417static void ib_uverbs_async_handler(struct ib_uverbs_file *file,
 418                                    __u64 element, __u64 event,
 419                                    struct list_head *obj_list,
 420                                    u32 *counter)
 421{
 422        struct ib_uverbs_event *entry;
 423        unsigned long flags;
 424
 425        spin_lock_irqsave(&file->async_file->lock, flags);
 426        if (!file->async_file->file) {
 427                spin_unlock_irqrestore(&file->async_file->lock, flags);
 428                return;
 429        }
 430
 431        entry = kmalloc(sizeof *entry, GFP_ATOMIC);
 432        if (!entry) {
 433                spin_unlock_irqrestore(&file->async_file->lock, flags);
 434                return;
 435        }
 436
 437        entry->desc.async.element    = element;
 438        entry->desc.async.event_type = event;
 439        entry->counter               = counter;
 440
 441        list_add_tail(&entry->list, &file->async_file->event_list);
 442        if (obj_list)
 443                list_add_tail(&entry->obj_list, obj_list);
 444        spin_unlock_irqrestore(&file->async_file->lock, flags);
 445
 446        wake_up_interruptible(&file->async_file->poll_wait);
 447        kill_fasync(&file->async_file->async_queue, SIGIO, POLL_IN);
 448}
 449
 450void ib_uverbs_cq_event_handler(struct ib_event *event, void *context_ptr)
 451{
 452        struct ib_ucq_object *uobj = container_of(event->element.cq->uobject,
 453                                                  struct ib_ucq_object, uobject);
 454
 455        ib_uverbs_async_handler(uobj->uverbs_file, uobj->uobject.user_handle,
 456                                event->event, &uobj->async_list,
 457                                &uobj->async_events_reported);
 458}
 459
 460void ib_uverbs_qp_event_handler(struct ib_event *event, void *context_ptr)
 461{
 462        struct ib_uevent_object *uobj;
 463
 464        uobj = container_of(event->element.qp->uobject,
 465                            struct ib_uevent_object, uobject);
 466
 467        ib_uverbs_async_handler(context_ptr, uobj->uobject.user_handle,
 468                                event->event, &uobj->event_list,
 469                                &uobj->events_reported);
 470}
 471
 472void ib_uverbs_srq_event_handler(struct ib_event *event, void *context_ptr)
 473{
 474        struct ib_uevent_object *uobj;
 475
 476        uobj = container_of(event->element.srq->uobject,
 477                            struct ib_uevent_object, uobject);
 478
 479        ib_uverbs_async_handler(context_ptr, uobj->uobject.user_handle,
 480                                event->event, &uobj->event_list,
 481                                &uobj->events_reported);
 482}
 483
 484void ib_uverbs_event_handler(struct ib_event_handler *handler,
 485                             struct ib_event *event)
 486{
 487        struct ib_uverbs_file *file =
 488                container_of(handler, struct ib_uverbs_file, event_handler);
 489
 490        ib_uverbs_async_handler(file, event->element.port_num, event->event,
 491                                NULL, NULL);
 492}
 493
 494struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file,
 495                                        int is_async, int *fd)
 496{
 497        struct ib_uverbs_event_file *ev_file;
 498        struct file *filp;
 499        int ret;
 500
 501        ev_file = kmalloc(sizeof *ev_file, GFP_KERNEL);
 502        if (!ev_file)
 503                return ERR_PTR(-ENOMEM);
 504
 505        kref_init(&ev_file->ref);
 506        spin_lock_init(&ev_file->lock);
 507        INIT_LIST_HEAD(&ev_file->event_list);
 508        init_waitqueue_head(&ev_file->poll_wait);
 509        ev_file->uverbs_file = uverbs_file;
 510        ev_file->async_queue = NULL;
 511        ev_file->is_async    = is_async;
 512
 513        *fd = get_unused_fd();
 514        if (*fd < 0) {
 515                ret = *fd;
 516                goto err;
 517        }
 518
 519        filp = get_empty_filp();
 520        if (!filp) {
 521                ret = -ENFILE;
 522                goto err_fd;
 523        }
 524
 525        ev_file->file      = filp;
 526
 527        /*
 528         * fops_get() can't fail here, because we're coming from a
 529         * system call on a uverbs file, which will already have a
 530         * module reference.
 531         */
 532        filp->f_op         = fops_get(&uverbs_event_fops);
 533        filp->f_path.mnt           = mntget(uverbs_event_mnt);
 534        filp->f_path.dentry        = dget(uverbs_event_mnt->mnt_root);
 535        filp->f_mapping    = filp->f_path.dentry->d_inode->i_mapping;
 536        filp->f_flags      = O_RDONLY;
 537        filp->f_mode       = FMODE_READ;
 538        filp->private_data = ev_file;
 539
 540        return filp;
 541
 542err_fd:
 543        put_unused_fd(*fd);
 544
 545err:
 546        kfree(ev_file);
 547        return ERR_PTR(ret);
 548}
 549
 550/*
 551 * Look up a completion event file by FD.  If lookup is successful,
 552 * takes a ref to the event file struct that it returns; if
 553 * unsuccessful, returns NULL.
 554 */
 555struct ib_uverbs_event_file *ib_uverbs_lookup_comp_file(int fd)
 556{
 557        struct ib_uverbs_event_file *ev_file = NULL;
 558        struct file *filp;
 559
 560        filp = fget(fd);
 561        if (!filp)
 562                return NULL;
 563
 564        if (filp->f_op != &uverbs_event_fops)
 565                goto out;
 566
 567        ev_file = filp->private_data;
 568        if (ev_file->is_async) {
 569                ev_file = NULL;
 570                goto out;
 571        }
 572
 573        kref_get(&ev_file->ref);
 574
 575out:
 576        fput(filp);
 577        return ev_file;
 578}
 579
 580static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf,
 581                             size_t count, loff_t *pos)
 582{
 583        struct ib_uverbs_file *file = filp->private_data;
 584        struct ib_uverbs_cmd_hdr hdr;
 585
 586        if (count < sizeof hdr)
 587                return -EINVAL;
 588
 589        if (copy_from_user(&hdr, buf, sizeof hdr))
 590                return -EFAULT;
 591
 592        if (hdr.in_words * 4 != count)
 593                return -EINVAL;
 594
 595        if (hdr.command < 0                             ||
 596            hdr.command >= ARRAY_SIZE(uverbs_cmd_table) ||
 597            !uverbs_cmd_table[hdr.command]              ||
 598            !(file->device->ib_dev->uverbs_cmd_mask & (1ull << hdr.command)))
 599                return -EINVAL;
 600
 601        if (!file->ucontext &&
 602            hdr.command != IB_USER_VERBS_CMD_GET_CONTEXT)
 603                return -EINVAL;
 604
 605        return uverbs_cmd_table[hdr.command](file, buf + sizeof hdr,
 606                                             hdr.in_words * 4, hdr.out_words * 4);
 607}
 608
 609static int ib_uverbs_mmap(struct file *filp, struct vm_area_struct *vma)
 610{
 611        struct ib_uverbs_file *file = filp->private_data;
 612
 613        if (!file->ucontext)
 614                return -ENODEV;
 615        else
 616                return file->device->ib_dev->mmap(file->ucontext, vma);
 617}
 618
 619static int ib_uverbs_open(struct inode *inode, struct file *filp)
 620{
 621        struct ib_uverbs_device *dev;
 622        struct ib_uverbs_file *file;
 623        int ret;
 624
 625        spin_lock(&map_lock);
 626        dev = dev_table[iminor(inode) - IB_UVERBS_BASE_MINOR];
 627        if (dev)
 628                kref_get(&dev->ref);
 629        spin_unlock(&map_lock);
 630
 631        if (!dev)
 632                return -ENXIO;
 633
 634        if (!try_module_get(dev->ib_dev->owner)) {
 635                ret = -ENODEV;
 636                goto err;
 637        }
 638
 639        file = kmalloc(sizeof *file, GFP_KERNEL);
 640        if (!file) {
 641                ret = -ENOMEM;
 642                goto err_module;
 643        }
 644
 645        file->device     = dev;
 646        file->ucontext   = NULL;
 647        file->async_file = NULL;
 648        kref_init(&file->ref);
 649        mutex_init(&file->mutex);
 650
 651        filp->private_data = file;
 652
 653        return 0;
 654
 655err_module:
 656        module_put(dev->ib_dev->owner);
 657
 658err:
 659        kref_put(&dev->ref, ib_uverbs_release_dev);
 660
 661        return ret;
 662}
 663
 664static int ib_uverbs_close(struct inode *inode, struct file *filp)
 665{
 666        struct ib_uverbs_file *file = filp->private_data;
 667
 668        ib_uverbs_cleanup_ucontext(file, file->ucontext);
 669
 670        if (file->async_file)
 671                kref_put(&file->async_file->ref, ib_uverbs_release_event_file);
 672
 673        kref_put(&file->ref, ib_uverbs_release_file);
 674
 675        return 0;
 676}
 677
 678static const struct file_operations uverbs_fops = {
 679        .owner   = THIS_MODULE,
 680        .write   = ib_uverbs_write,
 681        .open    = ib_uverbs_open,
 682        .release = ib_uverbs_close
 683};
 684
 685static const struct file_operations uverbs_mmap_fops = {
 686        .owner   = THIS_MODULE,
 687        .write   = ib_uverbs_write,
 688        .mmap    = ib_uverbs_mmap,
 689        .open    = ib_uverbs_open,
 690        .release = ib_uverbs_close
 691};
 692
 693static struct ib_client uverbs_client = {
 694        .name   = "uverbs",
 695        .add    = ib_uverbs_add_one,
 696        .remove = ib_uverbs_remove_one
 697};
 698
 699static ssize_t show_ibdev(struct class_device *class_dev, char *buf)
 700{
 701        struct ib_uverbs_device *dev = class_get_devdata(class_dev);
 702
 703        if (!dev)
 704                return -ENODEV;
 705
 706        return sprintf(buf, "%s\n", dev->ib_dev->name);
 707}
 708static CLASS_DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL);
 709
 710static ssize_t show_dev_abi_version(struct class_device *class_dev, char *buf)
 711{
 712        struct ib_uverbs_device *dev = class_get_devdata(class_dev);
 713
 714        if (!dev)
 715                return -ENODEV;
 716
 717        return sprintf(buf, "%d\n", dev->ib_dev->uverbs_abi_ver);
 718}
 719static CLASS_DEVICE_ATTR(abi_version, S_IRUGO, show_dev_abi_version, NULL);
 720
 721static ssize_t show_abi_version(struct class *class, char *buf)
 722{
 723        return sprintf(buf, "%d\n", IB_USER_VERBS_ABI_VERSION);
 724}
 725static CLASS_ATTR(abi_version, S_IRUGO, show_abi_version, NULL);
 726
 727static void ib_uverbs_add_one(struct ib_device *device)
 728{
 729        struct ib_uverbs_device *uverbs_dev;
 730
 731        if (!device->alloc_ucontext)
 732                return;
 733
 734        uverbs_dev = kzalloc(sizeof *uverbs_dev, GFP_KERNEL);
 735        if (!uverbs_dev)
 736                return;
 737
 738        kref_init(&uverbs_dev->ref);
 739        init_completion(&uverbs_dev->comp);
 740
 741        spin_lock(&map_lock);
 742        uverbs_dev->devnum = find_first_zero_bit(dev_map, IB_UVERBS_MAX_DEVICES);
 743        if (uverbs_dev->devnum >= IB_UVERBS_MAX_DEVICES) {
 744                spin_unlock(&map_lock);
 745                goto err;
 746        }
 747        set_bit(uverbs_dev->devnum, dev_map);
 748        spin_unlock(&map_lock);
 749
 750        uverbs_dev->ib_dev           = device;
 751        uverbs_dev->num_comp_vectors = device->num_comp_vectors;
 752
 753        uverbs_dev->dev = cdev_alloc();
 754        if (!uverbs_dev->dev)
 755                goto err;
 756        uverbs_dev->dev->owner = THIS_MODULE;
 757        uverbs_dev->dev->ops = device->mmap ? &uverbs_mmap_fops : &uverbs_fops;
 758        kobject_set_name(&uverbs_dev->dev->kobj, "uverbs%d", uverbs_dev->devnum);
 759        if (cdev_add(uverbs_dev->dev, IB_UVERBS_BASE_DEV + uverbs_dev->devnum, 1))
 760                goto err_cdev;
 761
 762        uverbs_dev->class_dev = class_device_create(uverbs_class, NULL,
 763                                                    uverbs_dev->dev->dev,
 764                                                    device->dma_device,
 765                                                    "uverbs%d", uverbs_dev->devnum);
 766        if (IS_ERR(uverbs_dev->class_dev))
 767                goto err_cdev;
 768
 769        class_set_devdata(uverbs_dev->class_dev, uverbs_dev);
 770
 771        if (class_device_create_file(uverbs_dev->class_dev, &class_device_attr_ibdev))
 772                goto err_class;
 773        if (class_device_create_file(uverbs_dev->class_dev, &class_device_attr_abi_version))
 774                goto err_class;
 775
 776        spin_lock(&map_lock);
 777        dev_table[uverbs_dev->devnum] = uverbs_dev;
 778        spin_unlock(&map_lock);
 779
 780        ib_set_client_data(device, &uverbs_client, uverbs_dev);
 781
 782        return;
 783
 784err_class:
 785        class_device_destroy(uverbs_class, uverbs_dev->dev->dev);
 786
 787err_cdev:
 788        cdev_del(uverbs_dev->dev);
 789        clear_bit(uverbs_dev->devnum, dev_map);
 790
 791err:
 792        kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
 793        wait_for_completion(&uverbs_dev->comp);
 794        kfree(uverbs_dev);
 795        return;
 796}
 797
 798static void ib_uverbs_remove_one(struct ib_device *device)
 799{
 800        struct ib_uverbs_device *uverbs_dev = ib_get_client_data(device, &uverbs_client);
 801
 802        if (!uverbs_dev)
 803                return;
 804
 805        class_set_devdata(uverbs_dev->class_dev, NULL);
 806        class_device_destroy(uverbs_class, uverbs_dev->dev->dev);
 807        cdev_del(uverbs_dev->dev);
 808
 809        spin_lock(&map_lock);
 810        dev_table[uverbs_dev->devnum] = NULL;
 811        spin_unlock(&map_lock);
 812
 813        clear_bit(uverbs_dev->devnum, dev_map);
 814
 815        kref_put(&uverbs_dev->ref, ib_uverbs_release_dev);
 816        wait_for_completion(&uverbs_dev->comp);
 817        kfree(uverbs_dev);
 818}
 819
 820static int uverbs_event_get_sb(struct file_system_type *fs_type, int flags,
 821                               const char *dev_name, void *data,
 822                               struct vfsmount *mnt)
 823{
 824        return get_sb_pseudo(fs_type, "infinibandevent:", NULL,
 825                             INFINIBANDEVENTFS_MAGIC, mnt);
 826}
 827
 828static struct file_system_type uverbs_event_fs = {
 829        /* No owner field so module can be unloaded */
 830        .name    = "infinibandeventfs",
 831        .get_sb  = uverbs_event_get_sb,
 832        .kill_sb = kill_litter_super
 833};
 834
 835static int __init ib_uverbs_init(void)
 836{
 837        int ret;
 838
 839        spin_lock_init(&map_lock);
 840
 841        ret = register_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES,
 842                                     "infiniband_verbs");
 843        if (ret) {
 844                printk(KERN_ERR "user_verbs: couldn't register device number\n");
 845                goto out;
 846        }
 847
 848        uverbs_class = class_create(THIS_MODULE, "infiniband_verbs");
 849        if (IS_ERR(uverbs_class)) {
 850                ret = PTR_ERR(uverbs_class);
 851                printk(KERN_ERR "user_verbs: couldn't create class infiniband_verbs\n");
 852                goto out_chrdev;
 853        }
 854
 855        ret = class_create_file(uverbs_class, &class_attr_abi_version);
 856        if (ret) {
 857                printk(KERN_ERR "user_verbs: couldn't create abi_version attribute\n");
 858                goto out_class;
 859        }
 860
 861        ret = register_filesystem(&uverbs_event_fs);
 862        if (ret) {
 863                printk(KERN_ERR "user_verbs: couldn't register infinibandeventfs\n");
 864                goto out_class;
 865        }
 866
 867        uverbs_event_mnt = kern_mount(&uverbs_event_fs);
 868        if (IS_ERR(uverbs_event_mnt)) {
 869                ret = PTR_ERR(uverbs_event_mnt);
 870                printk(KERN_ERR "user_verbs: couldn't mount infinibandeventfs\n");
 871                goto out_fs;
 872        }
 873
 874        ret = ib_register_client(&uverbs_client);
 875        if (ret) {
 876                printk(KERN_ERR "user_verbs: couldn't register client\n");
 877                goto out_mnt;
 878        }
 879
 880        return 0;
 881
 882out_mnt:
 883        mntput(uverbs_event_mnt);
 884
 885out_fs:
 886        unregister_filesystem(&uverbs_event_fs);
 887
 888out_class:
 889        class_destroy(uverbs_class);
 890
 891out_chrdev:
 892        unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES);
 893
 894out:
 895        return ret;
 896}
 897
 898static void __exit ib_uverbs_cleanup(void)
 899{
 900        ib_unregister_client(&uverbs_client);
 901        mntput(uverbs_event_mnt);
 902        unregister_filesystem(&uverbs_event_fs);
 903        class_destroy(uverbs_class);
 904        unregister_chrdev_region(IB_UVERBS_BASE_DEV, IB_UVERBS_MAX_DEVICES);
 905        idr_destroy(&ib_uverbs_pd_idr);
 906        idr_destroy(&ib_uverbs_mr_idr);
 907        idr_destroy(&ib_uverbs_mw_idr);
 908        idr_destroy(&ib_uverbs_ah_idr);
 909        idr_destroy(&ib_uverbs_cq_idr);
 910        idr_destroy(&ib_uverbs_qp_idr);
 911        idr_destroy(&ib_uverbs_srq_idr);
 912}
 913
 914module_init(ib_uverbs_init);
 915module_exit(ib_uverbs_cleanup);
 916