Lines Matching +full:mcast +full:- +full:groups
18 * - Redistributions of source code must retain the above
22 * - Redistributions in binary form must reproduce the above
69 IB_UVERBS_NUM_DYNAMIC_MINOR = IB_UVERBS_MAX_DEVICES - IB_UVERBS_NUM_FIXED_MINOR,
93 * Must be called with the ufile->device->disassociate_srcu held, and the lock
103 struct ib_ucontext *ucontext = smp_load_acquire(&ufile->ucontext); in ib_uverbs_get_ucontext_file()
105 if (!srcu_dereference(ufile->device->ib_dev, in ib_uverbs_get_ucontext_file()
106 &ufile->device->disassociate_srcu)) in ib_uverbs_get_ucontext_file()
107 return ERR_PTR(-EIO); in ib_uverbs_get_ucontext_file()
110 return ERR_PTR(-EINVAL); in ib_uverbs_get_ucontext_file()
118 struct ib_pd *pd = mw->pd; in uverbs_dealloc_mw()
121 ret = mw->device->ops.dealloc_mw(mw); in uverbs_dealloc_mw()
125 atomic_dec(&pd->usecnt); in uverbs_dealloc_mw()
135 uverbs_destroy_api(dev->uapi); in ib_uverbs_release_dev()
136 cleanup_srcu_struct(&dev->disassociate_srcu); in ib_uverbs_release_dev()
137 mutex_destroy(&dev->lists_mutex); in ib_uverbs_release_dev()
138 mutex_destroy(&dev->xrcd_tree_mutex); in ib_uverbs_release_dev()
148 spin_lock_irq(&ev_file->ev_queue.lock); in ib_uverbs_release_ucq()
149 list_for_each_entry_safe(evt, tmp, &uobj->comp_list, obj_list) { in ib_uverbs_release_ucq()
150 list_del(&evt->list); in ib_uverbs_release_ucq()
153 spin_unlock_irq(&ev_file->ev_queue.lock); in ib_uverbs_release_ucq()
155 uverbs_uobject_put(&ev_file->uobj); in ib_uverbs_release_ucq()
158 ib_uverbs_release_uevent(&uobj->uevent); in ib_uverbs_release_ucq()
163 struct ib_uverbs_async_event_file *async_file = uobj->event_file; in ib_uverbs_release_uevent()
169 spin_lock_irq(&async_file->ev_queue.lock); in ib_uverbs_release_uevent()
170 list_for_each_entry_safe(evt, tmp, &uobj->event_list, obj_list) { in ib_uverbs_release_uevent()
171 list_del(&evt->list); in ib_uverbs_release_uevent()
174 spin_unlock_irq(&async_file->ev_queue.lock); in ib_uverbs_release_uevent()
175 uverbs_uobject_put(&async_file->uobj); in ib_uverbs_release_uevent()
181 struct ib_uverbs_mcast_entry *mcast, *tmp; in ib_uverbs_detach_umcast() local
183 list_for_each_entry_safe(mcast, tmp, &uobj->mcast_list, list) { in ib_uverbs_detach_umcast()
184 ib_detach_mcast(qp, &mcast->gid, mcast->lid); in ib_uverbs_detach_umcast()
185 list_del(&mcast->list); in ib_uverbs_detach_umcast()
186 kfree(mcast); in ib_uverbs_detach_umcast()
192 complete(&dev->comp); in ib_uverbs_comp_dev()
204 srcu_key = srcu_read_lock(&file->device->disassociate_srcu); in ib_uverbs_release_file()
205 ib_dev = srcu_dereference(file->device->ib_dev, in ib_uverbs_release_file()
206 &file->device->disassociate_srcu); in ib_uverbs_release_file()
207 if (ib_dev && !ib_dev->ops.disassociate_ucontext) in ib_uverbs_release_file()
208 module_put(ib_dev->ops.owner); in ib_uverbs_release_file()
209 srcu_read_unlock(&file->device->disassociate_srcu, srcu_key); in ib_uverbs_release_file()
211 if (refcount_dec_and_test(&file->device->refcount)) in ib_uverbs_release_file()
212 ib_uverbs_comp_dev(file->device); in ib_uverbs_release_file()
214 if (file->default_async_file) in ib_uverbs_release_file()
215 uverbs_uobject_put(&file->default_async_file->uobj); in ib_uverbs_release_file()
216 put_device(&file->device->dev); in ib_uverbs_release_file()
218 if (file->disassociate_page) in ib_uverbs_release_file()
219 __free_pages(file->disassociate_page, 0); in ib_uverbs_release_file()
220 mutex_destroy(&file->umap_lock); in ib_uverbs_release_file()
221 mutex_destroy(&file->ucontext_lock); in ib_uverbs_release_file()
233 spin_lock_irq(&ev_queue->lock); in ib_uverbs_event_read()
235 while (list_empty(&ev_queue->event_list)) { in ib_uverbs_event_read()
236 if (ev_queue->is_closed) { in ib_uverbs_event_read()
237 spin_unlock_irq(&ev_queue->lock); in ib_uverbs_event_read()
238 return -EIO; in ib_uverbs_event_read()
241 spin_unlock_irq(&ev_queue->lock); in ib_uverbs_event_read()
242 if (filp->f_flags & O_NONBLOCK) in ib_uverbs_event_read()
243 return -EAGAIN; in ib_uverbs_event_read()
245 if (wait_event_interruptible(ev_queue->poll_wait, in ib_uverbs_event_read()
246 (!list_empty(&ev_queue->event_list) || in ib_uverbs_event_read()
247 ev_queue->is_closed))) in ib_uverbs_event_read()
248 return -ERESTARTSYS; in ib_uverbs_event_read()
250 spin_lock_irq(&ev_queue->lock); in ib_uverbs_event_read()
253 event = list_entry(ev_queue->event_list.next, struct ib_uverbs_event, list); in ib_uverbs_event_read()
256 ret = -EINVAL; in ib_uverbs_event_read()
259 list_del(ev_queue->event_list.next); in ib_uverbs_event_read()
260 if (event->counter) { in ib_uverbs_event_read()
261 ++(*event->counter); in ib_uverbs_event_read()
262 list_del(&event->obj_list); in ib_uverbs_event_read()
266 spin_unlock_irq(&ev_queue->lock); in ib_uverbs_event_read()
270 ret = -EFAULT; in ib_uverbs_event_read()
283 struct ib_uverbs_async_event_file *file = filp->private_data; in ib_uverbs_async_event_read()
285 return ib_uverbs_event_read(&file->ev_queue, filp, buf, count, pos, in ib_uverbs_async_event_read()
293 filp->private_data; in ib_uverbs_comp_event_read()
295 return ib_uverbs_event_read(&comp_ev_file->ev_queue, filp, buf, count, in ib_uverbs_comp_event_read()
306 poll_wait(filp, &ev_queue->poll_wait, wait); in ib_uverbs_event_poll()
308 spin_lock_irq(&ev_queue->lock); in ib_uverbs_event_poll()
309 if (!list_empty(&ev_queue->event_list)) in ib_uverbs_event_poll()
311 else if (ev_queue->is_closed) in ib_uverbs_event_poll()
313 spin_unlock_irq(&ev_queue->lock); in ib_uverbs_event_poll()
321 struct ib_uverbs_async_event_file *file = filp->private_data; in ib_uverbs_async_event_poll()
323 return ib_uverbs_event_poll(&file->ev_queue, filp, wait); in ib_uverbs_async_event_poll()
330 filp->private_data; in ib_uverbs_comp_event_poll()
332 return ib_uverbs_event_poll(&comp_ev_file->ev_queue, filp, wait); in ib_uverbs_comp_event_poll()
337 struct ib_uverbs_async_event_file *file = filp->private_data; in ib_uverbs_async_event_fasync()
339 return fasync_helper(fd, filp, on, &file->ev_queue.async_queue); in ib_uverbs_async_event_fasync()
345 filp->private_data; in ib_uverbs_comp_event_fasync()
347 return fasync_helper(fd, filp, on, &comp_ev_file->ev_queue.async_queue); in ib_uverbs_comp_event_fasync()
378 spin_lock_irqsave(&ev_queue->lock, flags); in ib_uverbs_comp_handler()
379 if (ev_queue->is_closed) { in ib_uverbs_comp_handler()
380 spin_unlock_irqrestore(&ev_queue->lock, flags); in ib_uverbs_comp_handler()
386 spin_unlock_irqrestore(&ev_queue->lock, flags); in ib_uverbs_comp_handler()
390 uobj = cq->uobject; in ib_uverbs_comp_handler()
392 entry->desc.comp.cq_handle = cq->uobject->uevent.uobject.user_handle; in ib_uverbs_comp_handler()
393 entry->counter = &uobj->comp_events_reported; in ib_uverbs_comp_handler()
395 list_add_tail(&entry->list, &ev_queue->event_list); in ib_uverbs_comp_handler()
396 list_add_tail(&entry->obj_list, &uobj->comp_list); in ib_uverbs_comp_handler()
397 spin_unlock_irqrestore(&ev_queue->lock, flags); in ib_uverbs_comp_handler()
399 wake_up_interruptible(&ev_queue->poll_wait); in ib_uverbs_comp_handler()
400 kill_fasync(&ev_queue->async_queue, SIGIO, POLL_IN); in ib_uverbs_comp_handler()
413 spin_lock_irqsave(&async_file->ev_queue.lock, flags); in ib_uverbs_async_handler()
414 if (async_file->ev_queue.is_closed) { in ib_uverbs_async_handler()
415 spin_unlock_irqrestore(&async_file->ev_queue.lock, flags); in ib_uverbs_async_handler()
421 spin_unlock_irqrestore(&async_file->ev_queue.lock, flags); in ib_uverbs_async_handler()
425 entry->desc.async.element = element; in ib_uverbs_async_handler()
426 entry->desc.async.event_type = event; in ib_uverbs_async_handler()
427 entry->desc.async.reserved = 0; in ib_uverbs_async_handler()
428 entry->counter = counter; in ib_uverbs_async_handler()
430 list_add_tail(&entry->list, &async_file->ev_queue.event_list); in ib_uverbs_async_handler()
432 list_add_tail(&entry->obj_list, obj_list); in ib_uverbs_async_handler()
433 spin_unlock_irqrestore(&async_file->ev_queue.lock, flags); in ib_uverbs_async_handler()
435 wake_up_interruptible(&async_file->ev_queue.poll_wait); in ib_uverbs_async_handler()
436 kill_fasync(&async_file->ev_queue.async_queue, SIGIO, POLL_IN); in ib_uverbs_async_handler()
442 ib_uverbs_async_handler(eobj->event_file, in uverbs_uobj_event()
443 eobj->uobject.user_handle, event->event, in uverbs_uobj_event()
444 &eobj->event_list, &eobj->events_reported); in uverbs_uobj_event()
449 uverbs_uobj_event(&event->element.cq->uobject->uevent, event); in ib_uverbs_cq_event_handler()
455 if (!event->element.qp->uobject) in ib_uverbs_qp_event_handler()
458 uverbs_uobj_event(&event->element.qp->uobject->uevent, event); in ib_uverbs_qp_event_handler()
463 uverbs_uobj_event(&event->element.wq->uobject->uevent, event); in ib_uverbs_wq_event_handler()
468 uverbs_uobj_event(&event->element.srq->uobject->uevent, event); in ib_uverbs_srq_event_handler()
477 event->element.port_num, event->event, NULL, NULL); in ib_uverbs_event_handler()
482 spin_lock_init(&ev_queue->lock); in ib_uverbs_init_event_queue()
483 INIT_LIST_HEAD(&ev_queue->event_list); in ib_uverbs_init_event_queue()
484 init_waitqueue_head(&ev_queue->poll_wait); in ib_uverbs_init_event_queue()
485 ev_queue->is_closed = 0; in ib_uverbs_init_event_queue()
486 ev_queue->async_queue = NULL; in ib_uverbs_init_event_queue()
492 struct ib_uverbs_file *uverbs_file = async_file->uobj.ufile; in ib_uverbs_init_async_event_file()
493 struct ib_device *ib_dev = async_file->uobj.context->device; in ib_uverbs_init_async_event_file()
495 ib_uverbs_init_event_queue(&async_file->ev_queue); in ib_uverbs_init_async_event_file()
498 mutex_lock(&uverbs_file->ucontext_lock); in ib_uverbs_init_async_event_file()
499 if (!uverbs_file->default_async_file) { in ib_uverbs_init_async_event_file()
501 uverbs_uobject_get(&async_file->uobj); in ib_uverbs_init_async_event_file()
502 smp_store_release(&uverbs_file->default_async_file, async_file); in ib_uverbs_init_async_event_file()
504 mutex_unlock(&uverbs_file->ucontext_lock); in ib_uverbs_init_async_event_file()
506 INIT_IB_EVENT_HANDLER(&async_file->event_handler, ib_dev, in ib_uverbs_init_async_event_file()
508 ib_register_event_handler(&async_file->event_handler); in ib_uverbs_init_async_event_file()
515 if (method_elm->is_ex) { in verify_hdr()
516 count -= sizeof(*hdr) + sizeof(*ex_hdr); in verify_hdr()
518 if ((hdr->in_words + ex_hdr->provider_in_words) * 8 != count) in verify_hdr()
519 return -EINVAL; in verify_hdr()
521 if (hdr->in_words * 8 < method_elm->req_size) in verify_hdr()
522 return -ENOSPC; in verify_hdr()
524 if (ex_hdr->cmd_hdr_reserved) in verify_hdr()
525 return -EINVAL; in verify_hdr()
527 if (ex_hdr->response) { in verify_hdr()
528 if (!hdr->out_words && !ex_hdr->provider_out_words) in verify_hdr()
529 return -EINVAL; in verify_hdr()
531 if (hdr->out_words * 8 < method_elm->resp_size) in verify_hdr()
532 return -ENOSPC; in verify_hdr()
534 if (!access_ok(u64_to_user_ptr(ex_hdr->response), in verify_hdr()
535 (hdr->out_words + ex_hdr->provider_out_words) * 8)) in verify_hdr()
536 return -EFAULT; in verify_hdr()
538 if (hdr->out_words || ex_hdr->provider_out_words) in verify_hdr()
539 return -EINVAL; in verify_hdr()
546 if (hdr->in_words * 4 != count) in verify_hdr()
547 return -EINVAL; in verify_hdr()
549 if (count < method_elm->req_size + sizeof(*hdr)) { in verify_hdr()
551 * rdma-core v18 and v19 have a bug where they send DESTROY_CQ in verify_hdr()
557 if (hdr->command == IB_USER_VERBS_CMD_DESTROY_CQ && in verify_hdr()
559 hdr->in_words = 6; in verify_hdr()
562 return -ENOSPC; in verify_hdr()
564 if (hdr->out_words * 4 < method_elm->resp_size) in verify_hdr()
565 return -ENOSPC; in verify_hdr()
573 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_write()
575 struct uverbs_api *uapi = file->device->uapi; in ib_uverbs_write()
584 task_tgid_vnr(current), current->comm); in ib_uverbs_write()
585 return -EACCES; in ib_uverbs_write()
589 return -EINVAL; in ib_uverbs_write()
592 return -EFAULT; in ib_uverbs_write()
598 if (method_elm->is_ex) { in ib_uverbs_write()
600 return -EINVAL; in ib_uverbs_write()
602 return -EFAULT; in ib_uverbs_write()
609 srcu_key = srcu_read_lock(&file->device->disassociate_srcu); in ib_uverbs_write()
617 if (!method_elm->is_ex) { in ib_uverbs_write()
618 size_t in_len = hdr.in_words * 4 - sizeof(hdr); in ib_uverbs_write()
622 if (method_elm->has_udata) { in ib_uverbs_write()
624 in_len - method_elm->req_size; in ib_uverbs_write()
625 in_len = method_elm->req_size; in ib_uverbs_write()
635 if (method_elm->has_resp) { in ib_uverbs_write()
645 if (method_elm->has_udata) { in ib_uverbs_write()
647 out_len - method_elm->resp_size; in ib_uverbs_write()
648 out_len = method_elm->resp_size; in ib_uverbs_write()
679 ret = method_elm->handler(&bundle); in ib_uverbs_write()
684 srcu_read_unlock(&file->device->disassociate_srcu, srcu_key); in ib_uverbs_write()
692 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_mmap()
697 srcu_key = srcu_read_lock(&file->device->disassociate_srcu); in ib_uverbs_mmap()
703 vma->vm_ops = &rdma_umap_ops; in ib_uverbs_mmap()
704 ret = ucontext->device->ops.mmap(ucontext, vma); in ib_uverbs_mmap()
706 srcu_read_unlock(&file->device->disassociate_srcu, srcu_key); in ib_uverbs_mmap()
716 struct ib_uverbs_file *ufile = vma->vm_file->private_data; in rdma_umap_open()
717 struct rdma_umap_priv *opriv = vma->vm_private_data; in rdma_umap_open()
724 if (!down_read_trylock(&ufile->hw_destroy_rwsem)) in rdma_umap_open()
729 if (!ufile->ucontext) in rdma_umap_open()
735 rdma_umap_priv_init(priv, vma, opriv->entry); in rdma_umap_open()
737 up_read(&ufile->hw_destroy_rwsem); in rdma_umap_open()
741 up_read(&ufile->hw_destroy_rwsem); in rdma_umap_open()
748 vma->vm_private_data = NULL; in rdma_umap_open()
749 zap_vma_ptes(vma, vma->vm_start, vma->vm_end - vma->vm_start); in rdma_umap_open()
754 struct ib_uverbs_file *ufile = vma->vm_file->private_data; in rdma_umap_close()
755 struct rdma_umap_priv *priv = vma->vm_private_data; in rdma_umap_close()
765 mutex_lock(&ufile->umap_lock); in rdma_umap_close()
766 if (priv->entry) in rdma_umap_close()
767 rdma_user_mmap_entry_put(priv->entry); in rdma_umap_close()
769 list_del(&priv->list); in rdma_umap_close()
770 mutex_unlock(&ufile->umap_lock); in rdma_umap_close()
780 struct ib_uverbs_file *ufile = vmf->vma->vm_file->private_data; in rdma_umap_fault()
781 struct rdma_umap_priv *priv = vmf->vma->vm_private_data; in rdma_umap_fault()
788 if (!(vmf->vma->vm_flags & (VM_WRITE | VM_MAYWRITE))) { in rdma_umap_fault()
789 vmf->page = ZERO_PAGE(vmf->address); in rdma_umap_fault()
790 get_page(vmf->page); in rdma_umap_fault()
794 mutex_lock(&ufile->umap_lock); in rdma_umap_fault()
795 if (!ufile->disassociate_page) in rdma_umap_fault()
796 ufile->disassociate_page = in rdma_umap_fault()
797 alloc_pages(vmf->gfp_mask | __GFP_ZERO, 0); in rdma_umap_fault()
799 if (ufile->disassociate_page) { in rdma_umap_fault()
804 vmf->page = ufile->disassociate_page; in rdma_umap_fault()
805 get_page(vmf->page); in rdma_umap_fault()
809 mutex_unlock(&ufile->umap_lock); in rdma_umap_fault()
824 lockdep_assert_held(&ufile->hw_destroy_rwsem); in uverbs_user_mmap_disassociate()
830 mutex_lock(&ufile->umap_lock); in uverbs_user_mmap_disassociate()
831 while (!list_empty(&ufile->umaps)) { in uverbs_user_mmap_disassociate()
834 priv = list_first_entry(&ufile->umaps, in uverbs_user_mmap_disassociate()
836 mm = priv->vma->vm_mm; in uverbs_user_mmap_disassociate()
839 list_del_init(&priv->list); in uverbs_user_mmap_disassociate()
840 if (priv->entry) { in uverbs_user_mmap_disassociate()
841 rdma_user_mmap_entry_put(priv->entry); in uverbs_user_mmap_disassociate()
842 priv->entry = NULL; in uverbs_user_mmap_disassociate()
849 mutex_unlock(&ufile->umap_lock); in uverbs_user_mmap_disassociate()
860 mutex_lock(&ufile->umap_lock); in uverbs_user_mmap_disassociate()
861 list_for_each_entry_safe (priv, next_priv, &ufile->umaps, in uverbs_user_mmap_disassociate()
863 struct vm_area_struct *vma = priv->vma; in uverbs_user_mmap_disassociate()
865 if (vma->vm_mm != mm) in uverbs_user_mmap_disassociate()
867 list_del_init(&priv->list); in uverbs_user_mmap_disassociate()
869 zap_vma_ptes(vma, vma->vm_start, in uverbs_user_mmap_disassociate()
870 vma->vm_end - vma->vm_start); in uverbs_user_mmap_disassociate()
872 if (priv->entry) { in uverbs_user_mmap_disassociate()
873 rdma_user_mmap_entry_put(priv->entry); in uverbs_user_mmap_disassociate()
874 priv->entry = NULL; in uverbs_user_mmap_disassociate()
877 mutex_unlock(&ufile->umap_lock); in uverbs_user_mmap_disassociate()
886 * - the ib_uverbs_device structures are properly reference counted and
889 * - there is no ioctl method to race against;
890 * - the open method will either immediately run -ENXIO, or all
902 dev = container_of(inode->i_cdev, struct ib_uverbs_device, cdev); in ib_uverbs_open()
903 if (!refcount_inc_not_zero(&dev->refcount)) in ib_uverbs_open()
904 return -ENXIO; in ib_uverbs_open()
906 get_device(&dev->dev); in ib_uverbs_open()
907 srcu_key = srcu_read_lock(&dev->disassociate_srcu); in ib_uverbs_open()
908 mutex_lock(&dev->lists_mutex); in ib_uverbs_open()
909 ib_dev = srcu_dereference(dev->ib_dev, in ib_uverbs_open()
910 &dev->disassociate_srcu); in ib_uverbs_open()
912 ret = -EIO; in ib_uverbs_open()
916 if (!rdma_dev_access_netns(ib_dev, current->nsproxy->net_ns)) { in ib_uverbs_open()
917 ret = -EPERM; in ib_uverbs_open()
924 module_dependent = !(ib_dev->ops.disassociate_ucontext); in ib_uverbs_open()
927 if (!try_module_get(ib_dev->ops.owner)) { in ib_uverbs_open()
928 ret = -ENODEV; in ib_uverbs_open()
935 ret = -ENOMEM; in ib_uverbs_open()
942 file->device = dev; in ib_uverbs_open()
943 kref_init(&file->ref); in ib_uverbs_open()
944 mutex_init(&file->ucontext_lock); in ib_uverbs_open()
946 spin_lock_init(&file->uobjects_lock); in ib_uverbs_open()
947 INIT_LIST_HEAD(&file->uobjects); in ib_uverbs_open()
948 init_rwsem(&file->hw_destroy_rwsem); in ib_uverbs_open()
949 mutex_init(&file->umap_lock); in ib_uverbs_open()
950 INIT_LIST_HEAD(&file->umaps); in ib_uverbs_open()
952 filp->private_data = file; in ib_uverbs_open()
953 list_add_tail(&file->list, &dev->uverbs_file_list); in ib_uverbs_open()
954 mutex_unlock(&dev->lists_mutex); in ib_uverbs_open()
955 srcu_read_unlock(&dev->disassociate_srcu, srcu_key); in ib_uverbs_open()
962 module_put(ib_dev->ops.owner); in ib_uverbs_open()
965 mutex_unlock(&dev->lists_mutex); in ib_uverbs_open()
966 srcu_read_unlock(&dev->disassociate_srcu, srcu_key); in ib_uverbs_open()
967 if (refcount_dec_and_test(&dev->refcount)) in ib_uverbs_open()
970 put_device(&dev->dev); in ib_uverbs_open()
976 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_close()
980 mutex_lock(&file->device->lists_mutex); in ib_uverbs_close()
981 list_del_init(&file->list); in ib_uverbs_close()
982 mutex_unlock(&file->device->lists_mutex); in ib_uverbs_close()
984 kref_put(&file->ref, ib_uverbs_release_file); in ib_uverbs_close()
1016 if (res->port != -1) in ib_uverbs_get_nl_info()
1017 return -EINVAL; in ib_uverbs_get_nl_info()
1019 res->abi = ibdev->ops.uverbs_abi_ver; in ib_uverbs_get_nl_info()
1020 res->cdev = &uverbs_dev->dev; in ib_uverbs_get_nl_info()
1028 if (!ibdev->ops.uverbs_no_driver_id_binding) { in ib_uverbs_get_nl_info()
1029 ret = nla_put_u32(res->nl_msg, RDMA_NLDEV_ATTR_UVERBS_DRIVER_ID, in ib_uverbs_get_nl_info()
1030 ibdev->ops.driver_id); in ib_uverbs_get_nl_info()
1051 int ret = -ENODEV; in ibdev_show()
1055 srcu_key = srcu_read_lock(&dev->disassociate_srcu); in ibdev_show()
1056 ib_dev = srcu_dereference(dev->ib_dev, &dev->disassociate_srcu); in ibdev_show()
1058 ret = sysfs_emit(buf, "%s\n", dev_name(&ib_dev->dev)); in ibdev_show()
1059 srcu_read_unlock(&dev->disassociate_srcu, srcu_key); in ibdev_show()
1070 int ret = -ENODEV; in abi_version_show()
1074 srcu_key = srcu_read_lock(&dev->disassociate_srcu); in abi_version_show()
1075 ib_dev = srcu_dereference(dev->ib_dev, &dev->disassociate_srcu); in abi_version_show()
1077 ret = sysfs_emit(buf, "%u\n", ib_dev->ops.uverbs_abi_ver); in abi_version_show()
1078 srcu_read_unlock(&dev->disassociate_srcu, srcu_key); in abi_version_show()
1106 uverbs_dev->uapi = uapi; in ib_uverbs_create_uapi()
1117 if (!device->ops.alloc_ucontext) in ib_uverbs_add_one()
1118 return -EOPNOTSUPP; in ib_uverbs_add_one()
1122 return -ENOMEM; in ib_uverbs_add_one()
1124 ret = init_srcu_struct(&uverbs_dev->disassociate_srcu); in ib_uverbs_add_one()
1127 return -ENOMEM; in ib_uverbs_add_one()
1130 device_initialize(&uverbs_dev->dev); in ib_uverbs_add_one()
1131 uverbs_dev->dev.class = &uverbs_class; in ib_uverbs_add_one()
1132 uverbs_dev->dev.parent = device->dev.parent; in ib_uverbs_add_one()
1133 uverbs_dev->dev.release = ib_uverbs_release_dev; in ib_uverbs_add_one()
1134 uverbs_dev->groups[0] = &dev_attr_group; in ib_uverbs_add_one()
1135 uverbs_dev->dev.groups = uverbs_dev->groups; in ib_uverbs_add_one()
1136 refcount_set(&uverbs_dev->refcount, 1); in ib_uverbs_add_one()
1137 init_completion(&uverbs_dev->comp); in ib_uverbs_add_one()
1138 uverbs_dev->xrcd_tree = RB_ROOT; in ib_uverbs_add_one()
1139 mutex_init(&uverbs_dev->xrcd_tree_mutex); in ib_uverbs_add_one()
1140 mutex_init(&uverbs_dev->lists_mutex); in ib_uverbs_add_one()
1141 INIT_LIST_HEAD(&uverbs_dev->uverbs_file_list); in ib_uverbs_add_one()
1142 rcu_assign_pointer(uverbs_dev->ib_dev, device); in ib_uverbs_add_one()
1143 uverbs_dev->num_comp_vectors = device->num_comp_vectors; in ib_uverbs_add_one()
1145 devnum = ida_alloc_max(&uverbs_ida, IB_UVERBS_MAX_DEVICES - 1, in ib_uverbs_add_one()
1148 ret = -ENOMEM; in ib_uverbs_add_one()
1151 uverbs_dev->devnum = devnum; in ib_uverbs_add_one()
1153 base = dynamic_uverbs_dev + devnum - IB_UVERBS_NUM_FIXED_MINOR; in ib_uverbs_add_one()
1161 uverbs_dev->dev.devt = base; in ib_uverbs_add_one()
1162 dev_set_name(&uverbs_dev->dev, "uverbs%d", uverbs_dev->devnum); in ib_uverbs_add_one()
1164 cdev_init(&uverbs_dev->cdev, in ib_uverbs_add_one()
1165 device->ops.mmap ? &uverbs_mmap_fops : &uverbs_fops); in ib_uverbs_add_one()
1166 uverbs_dev->cdev.owner = THIS_MODULE; in ib_uverbs_add_one()
1168 ret = cdev_device_add(&uverbs_dev->cdev, &uverbs_dev->dev); in ib_uverbs_add_one()
1178 if (refcount_dec_and_test(&uverbs_dev->refcount)) in ib_uverbs_add_one()
1180 wait_for_completion(&uverbs_dev->comp); in ib_uverbs_add_one()
1181 put_device(&uverbs_dev->dev); in ib_uverbs_add_one()
1193 mutex_lock(&uverbs_dev->lists_mutex); in ib_uverbs_free_hw_resources()
1194 while (!list_empty(&uverbs_dev->uverbs_file_list)) { in ib_uverbs_free_hw_resources()
1195 file = list_first_entry(&uverbs_dev->uverbs_file_list, in ib_uverbs_free_hw_resources()
1197 list_del_init(&file->list); in ib_uverbs_free_hw_resources()
1198 kref_get(&file->ref); in ib_uverbs_free_hw_resources()
1205 mutex_unlock(&uverbs_dev->lists_mutex); in ib_uverbs_free_hw_resources()
1208 kref_put(&file->ref, ib_uverbs_release_file); in ib_uverbs_free_hw_resources()
1210 mutex_lock(&uverbs_dev->lists_mutex); in ib_uverbs_free_hw_resources()
1212 mutex_unlock(&uverbs_dev->lists_mutex); in ib_uverbs_free_hw_resources()
1214 uverbs_disassociate_api(uverbs_dev->uapi); in ib_uverbs_free_hw_resources()
1222 cdev_device_del(&uverbs_dev->cdev, &uverbs_dev->dev); in ib_uverbs_remove_one()
1223 ida_free(&uverbs_ida, uverbs_dev->devnum); in ib_uverbs_remove_one()
1225 if (device->ops.disassociate_ucontext) { in ib_uverbs_remove_one()
1241 if (refcount_dec_and_test(&uverbs_dev->refcount)) in ib_uverbs_remove_one()
1244 wait_for_completion(&uverbs_dev->comp); in ib_uverbs_remove_one()
1246 put_device(&uverbs_dev->dev); in ib_uverbs_remove_one()