Lines Matching refs:file

83 static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file,
124 static int (*uverbs_ex_cmd_table[])(struct ib_uverbs_file *file,
153 struct ib_uverbs_event_file *file = in ib_uverbs_release_event_file() local
156 kfree(file); in ib_uverbs_release_event_file()
159 void ib_uverbs_release_ucq(struct ib_uverbs_file *file, in ib_uverbs_release_ucq() argument
176 spin_lock_irq(&file->async_file->lock); in ib_uverbs_release_ucq()
181 spin_unlock_irq(&file->async_file->lock); in ib_uverbs_release_ucq()
184 void ib_uverbs_release_uevent(struct ib_uverbs_file *file, in ib_uverbs_release_uevent() argument
189 spin_lock_irq(&file->async_file->lock); in ib_uverbs_release_uevent()
194 spin_unlock_irq(&file->async_file->lock); in ib_uverbs_release_uevent()
209 static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file, in ib_uverbs_cleanup_ucontext() argument
253 ib_uverbs_release_uevent(file, &uqp->uevent); in ib_uverbs_cleanup_ucontext()
264 ib_uverbs_release_uevent(file, uevent); in ib_uverbs_cleanup_ucontext()
276 ib_uverbs_release_ucq(file, ev_file, ucq); in ib_uverbs_cleanup_ucontext()
288 mutex_lock(&file->device->xrcd_tree_mutex); in ib_uverbs_cleanup_ucontext()
295 ib_uverbs_dealloc_xrcd(file->device, xrcd); in ib_uverbs_cleanup_ucontext()
298 mutex_unlock(&file->device->xrcd_tree_mutex); in ib_uverbs_cleanup_ucontext()
320 struct ib_uverbs_file *file = in ib_uverbs_release_file() local
325 srcu_key = srcu_read_lock(&file->device->disassociate_srcu); in ib_uverbs_release_file()
326 ib_dev = srcu_dereference(file->device->ib_dev, in ib_uverbs_release_file()
327 &file->device->disassociate_srcu); in ib_uverbs_release_file()
330 srcu_read_unlock(&file->device->disassociate_srcu, srcu_key); in ib_uverbs_release_file()
332 if (atomic_dec_and_test(&file->device->refcount)) in ib_uverbs_release_file()
333 ib_uverbs_comp_dev(file->device); in ib_uverbs_release_file()
335 kfree(file); in ib_uverbs_release_file()
338 static ssize_t ib_uverbs_event_read(struct file *filp, char __user *buf, in ib_uverbs_event_read()
341 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_read() local
346 spin_lock_irq(&file->lock); in ib_uverbs_event_read()
348 while (list_empty(&file->event_list)) { in ib_uverbs_event_read()
349 spin_unlock_irq(&file->lock); in ib_uverbs_event_read()
354 if (wait_event_interruptible(file->poll_wait, in ib_uverbs_event_read()
355 (!list_empty(&file->event_list) || in ib_uverbs_event_read()
360 !file->uverbs_file->device->ib_dev))) in ib_uverbs_event_read()
364 if (list_empty(&file->event_list) && in ib_uverbs_event_read()
365 !file->uverbs_file->device->ib_dev) in ib_uverbs_event_read()
368 spin_lock_irq(&file->lock); in ib_uverbs_event_read()
371 event = list_entry(file->event_list.next, struct ib_uverbs_event, list); in ib_uverbs_event_read()
373 if (file->is_async) in ib_uverbs_event_read()
382 list_del(file->event_list.next); in ib_uverbs_event_read()
389 spin_unlock_irq(&file->lock); in ib_uverbs_event_read()
403 static unsigned int ib_uverbs_event_poll(struct file *filp, in ib_uverbs_event_poll()
407 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_poll() local
409 poll_wait(filp, &file->poll_wait, wait); in ib_uverbs_event_poll()
411 spin_lock_irq(&file->lock); in ib_uverbs_event_poll()
412 if (!list_empty(&file->event_list)) in ib_uverbs_event_poll()
414 spin_unlock_irq(&file->lock); in ib_uverbs_event_poll()
419 static int ib_uverbs_event_fasync(int fd, struct file *filp, int on) in ib_uverbs_event_fasync()
421 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_fasync() local
423 return fasync_helper(fd, filp, on, &file->async_queue); in ib_uverbs_event_fasync()
426 static int ib_uverbs_event_close(struct inode *inode, struct file *filp) in ib_uverbs_event_close()
428 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_close() local
432 mutex_lock(&file->uverbs_file->device->lists_mutex); in ib_uverbs_event_close()
433 spin_lock_irq(&file->lock); in ib_uverbs_event_close()
434 closed_already = file->is_closed; in ib_uverbs_event_close()
435 file->is_closed = 1; in ib_uverbs_event_close()
436 list_for_each_entry_safe(entry, tmp, &file->event_list, list) { in ib_uverbs_event_close()
441 spin_unlock_irq(&file->lock); in ib_uverbs_event_close()
443 list_del(&file->list); in ib_uverbs_event_close()
444 if (file->is_async) in ib_uverbs_event_close()
445 ib_unregister_event_handler(&file->uverbs_file-> in ib_uverbs_event_close()
448 mutex_unlock(&file->uverbs_file->device->lists_mutex); in ib_uverbs_event_close()
450 kref_put(&file->uverbs_file->ref, ib_uverbs_release_file); in ib_uverbs_event_close()
451 kref_put(&file->ref, ib_uverbs_release_event_file); in ib_uverbs_event_close()
467 struct ib_uverbs_event_file *file = cq_context; in ib_uverbs_comp_handler() local
472 if (!file) in ib_uverbs_comp_handler()
475 spin_lock_irqsave(&file->lock, flags); in ib_uverbs_comp_handler()
476 if (file->is_closed) { in ib_uverbs_comp_handler()
477 spin_unlock_irqrestore(&file->lock, flags); in ib_uverbs_comp_handler()
483 spin_unlock_irqrestore(&file->lock, flags); in ib_uverbs_comp_handler()
492 list_add_tail(&entry->list, &file->event_list); in ib_uverbs_comp_handler()
494 spin_unlock_irqrestore(&file->lock, flags); in ib_uverbs_comp_handler()
496 wake_up_interruptible(&file->poll_wait); in ib_uverbs_comp_handler()
497 kill_fasync(&file->async_queue, SIGIO, POLL_IN); in ib_uverbs_comp_handler()
500 static void ib_uverbs_async_handler(struct ib_uverbs_file *file, in ib_uverbs_async_handler() argument
508 spin_lock_irqsave(&file->async_file->lock, flags); in ib_uverbs_async_handler()
509 if (file->async_file->is_closed) { in ib_uverbs_async_handler()
510 spin_unlock_irqrestore(&file->async_file->lock, flags); in ib_uverbs_async_handler()
516 spin_unlock_irqrestore(&file->async_file->lock, flags); in ib_uverbs_async_handler()
525 list_add_tail(&entry->list, &file->async_file->event_list); in ib_uverbs_async_handler()
528 spin_unlock_irqrestore(&file->async_file->lock, flags); in ib_uverbs_async_handler()
530 wake_up_interruptible(&file->async_file->poll_wait); in ib_uverbs_async_handler()
531 kill_fasync(&file->async_file->async_queue, SIGIO, POLL_IN); in ib_uverbs_async_handler()
575 struct ib_uverbs_file *file = in ib_uverbs_event_handler() local
578 ib_uverbs_async_handler(file, event->element.port_num, event->event, in ib_uverbs_event_handler()
582 void ib_uverbs_free_async_event_file(struct ib_uverbs_file *file) in ib_uverbs_free_async_event_file() argument
584 kref_put(&file->async_file->ref, ib_uverbs_release_event_file); in ib_uverbs_free_async_event_file()
585 file->async_file = NULL; in ib_uverbs_free_async_event_file()
588 struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, in ib_uverbs_alloc_event_file()
593 struct file *filp; in ib_uverbs_alloc_event_file()
658 if (!f.file) in ib_uverbs_lookup_comp_file()
661 if (f.file->f_op != &uverbs_event_fops) in ib_uverbs_lookup_comp_file()
664 ev_file = f.file->private_data; in ib_uverbs_lookup_comp_file()
677 static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, in ib_uverbs_write()
680 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_write() local
696 srcu_key = srcu_read_lock(&file->device->disassociate_srcu); in ib_uverbs_write()
697 ib_dev = srcu_dereference(file->device->ib_dev, in ib_uverbs_write()
698 &file->device->disassociate_srcu); in ib_uverbs_write()
724 if (!file->ucontext && in ib_uverbs_write()
740 ret = uverbs_cmd_table[command](file, ib_dev, in ib_uverbs_write()
767 if (!file->ucontext) { in ib_uverbs_write()
828 ret = uverbs_ex_cmd_table[command](file, in ib_uverbs_write()
839 srcu_read_unlock(&file->device->disassociate_srcu, srcu_key); in ib_uverbs_write()
843 static int ib_uverbs_mmap(struct file *filp, struct vm_area_struct *vma) in ib_uverbs_mmap()
845 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_mmap() local
850 srcu_key = srcu_read_lock(&file->device->disassociate_srcu); in ib_uverbs_mmap()
851 ib_dev = srcu_dereference(file->device->ib_dev, in ib_uverbs_mmap()
852 &file->device->disassociate_srcu); in ib_uverbs_mmap()
858 if (!file->ucontext) in ib_uverbs_mmap()
861 ret = ib_dev->mmap(file->ucontext, vma); in ib_uverbs_mmap()
863 srcu_read_unlock(&file->device->disassociate_srcu, srcu_key); in ib_uverbs_mmap()
877 static int ib_uverbs_open(struct inode *inode, struct file *filp) in ib_uverbs_open()
880 struct ib_uverbs_file *file; in ib_uverbs_open() local
911 file = kzalloc(sizeof(*file), GFP_KERNEL); in ib_uverbs_open()
912 if (!file) { in ib_uverbs_open()
920 file->device = dev; in ib_uverbs_open()
921 file->ucontext = NULL; in ib_uverbs_open()
922 file->async_file = NULL; in ib_uverbs_open()
923 kref_init(&file->ref); in ib_uverbs_open()
924 mutex_init(&file->mutex); in ib_uverbs_open()
926 filp->private_data = file; in ib_uverbs_open()
928 list_add_tail(&file->list, &dev->uverbs_file_list); in ib_uverbs_open()
946 static int ib_uverbs_close(struct inode *inode, struct file *filp) in ib_uverbs_close()
948 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_close() local
949 struct ib_uverbs_device *dev = file->device; in ib_uverbs_close()
952 mutex_lock(&file->device->lists_mutex); in ib_uverbs_close()
953 ucontext = file->ucontext; in ib_uverbs_close()
954 file->ucontext = NULL; in ib_uverbs_close()
955 if (!file->is_closed) { in ib_uverbs_close()
956 list_del(&file->list); in ib_uverbs_close()
957 file->is_closed = 1; in ib_uverbs_close()
959 mutex_unlock(&file->device->lists_mutex); in ib_uverbs_close()
961 ib_uverbs_cleanup_ucontext(file, ucontext); in ib_uverbs_close()
963 if (file->async_file) in ib_uverbs_close()
964 kref_put(&file->async_file->ref, ib_uverbs_release_event_file); in ib_uverbs_close()
966 kref_put(&file->ref, ib_uverbs_release_file); in ib_uverbs_close()
1162 struct ib_uverbs_file *file; in ib_uverbs_free_hw_resources() local
1176 file = list_first_entry(&uverbs_dev->uverbs_file_list, in ib_uverbs_free_hw_resources()
1178 file->is_closed = 1; in ib_uverbs_free_hw_resources()
1179 ucontext = file->ucontext; in ib_uverbs_free_hw_resources()
1180 list_del(&file->list); in ib_uverbs_free_hw_resources()
1181 file->ucontext = NULL; in ib_uverbs_free_hw_resources()
1182 kref_get(&file->ref); in ib_uverbs_free_hw_resources()
1189 ib_uverbs_event_handler(&file->event_handler, &event); in ib_uverbs_free_hw_resources()
1192 ib_uverbs_cleanup_ucontext(file, ucontext); in ib_uverbs_free_hw_resources()
1196 kref_put(&file->ref, ib_uverbs_release_file); in ib_uverbs_free_hw_resources()