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