Lines Matching refs:file

83 static ssize_t (*uverbs_cmd_table[])(struct ib_uverbs_file *file,
123 static int (*uverbs_ex_cmd_table[])(struct ib_uverbs_file *file,
148 struct ib_uverbs_event_file *file = in ib_uverbs_release_event_file() local
151 kfree(file); in ib_uverbs_release_event_file()
154 void ib_uverbs_release_ucq(struct ib_uverbs_file *file, in ib_uverbs_release_ucq() argument
171 spin_lock_irq(&file->async_file->lock); in ib_uverbs_release_ucq()
176 spin_unlock_irq(&file->async_file->lock); in ib_uverbs_release_ucq()
179 void ib_uverbs_release_uevent(struct ib_uverbs_file *file, in ib_uverbs_release_uevent() argument
184 spin_lock_irq(&file->async_file->lock); in ib_uverbs_release_uevent()
189 spin_unlock_irq(&file->async_file->lock); in ib_uverbs_release_uevent()
204 static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file, in ib_uverbs_cleanup_ucontext() argument
251 ib_uverbs_release_uevent(file, &uqp->uevent); in ib_uverbs_cleanup_ucontext()
262 ib_uverbs_release_uevent(file, uevent); in ib_uverbs_cleanup_ucontext()
274 ib_uverbs_release_ucq(file, ev_file, ucq); in ib_uverbs_cleanup_ucontext()
286 mutex_lock(&file->device->xrcd_tree_mutex); in ib_uverbs_cleanup_ucontext()
293 ib_uverbs_dealloc_xrcd(file->device, xrcd); in ib_uverbs_cleanup_ucontext()
296 mutex_unlock(&file->device->xrcd_tree_mutex); in ib_uverbs_cleanup_ucontext()
318 struct ib_uverbs_file *file = in ib_uverbs_release_file() local
321 module_put(file->device->ib_dev->owner); in ib_uverbs_release_file()
322 if (atomic_dec_and_test(&file->device->refcount)) in ib_uverbs_release_file()
323 ib_uverbs_comp_dev(file->device); in ib_uverbs_release_file()
325 kfree(file); in ib_uverbs_release_file()
328 static ssize_t ib_uverbs_event_read(struct file *filp, char __user *buf, in ib_uverbs_event_read()
331 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_read() local
336 spin_lock_irq(&file->lock); in ib_uverbs_event_read()
338 while (list_empty(&file->event_list)) { in ib_uverbs_event_read()
339 spin_unlock_irq(&file->lock); in ib_uverbs_event_read()
344 if (wait_event_interruptible(file->poll_wait, in ib_uverbs_event_read()
345 !list_empty(&file->event_list))) in ib_uverbs_event_read()
348 spin_lock_irq(&file->lock); in ib_uverbs_event_read()
351 event = list_entry(file->event_list.next, struct ib_uverbs_event, list); in ib_uverbs_event_read()
353 if (file->is_async) in ib_uverbs_event_read()
362 list_del(file->event_list.next); in ib_uverbs_event_read()
369 spin_unlock_irq(&file->lock); in ib_uverbs_event_read()
383 static unsigned int ib_uverbs_event_poll(struct file *filp, in ib_uverbs_event_poll()
387 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_poll() local
389 poll_wait(filp, &file->poll_wait, wait); in ib_uverbs_event_poll()
391 spin_lock_irq(&file->lock); in ib_uverbs_event_poll()
392 if (!list_empty(&file->event_list)) in ib_uverbs_event_poll()
394 spin_unlock_irq(&file->lock); in ib_uverbs_event_poll()
399 static int ib_uverbs_event_fasync(int fd, struct file *filp, int on) in ib_uverbs_event_fasync()
401 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_fasync() local
403 return fasync_helper(fd, filp, on, &file->async_queue); in ib_uverbs_event_fasync()
406 static int ib_uverbs_event_close(struct inode *inode, struct file *filp) in ib_uverbs_event_close()
408 struct ib_uverbs_event_file *file = filp->private_data; in ib_uverbs_event_close() local
411 spin_lock_irq(&file->lock); in ib_uverbs_event_close()
412 file->is_closed = 1; in ib_uverbs_event_close()
413 list_for_each_entry_safe(entry, tmp, &file->event_list, list) { in ib_uverbs_event_close()
418 spin_unlock_irq(&file->lock); in ib_uverbs_event_close()
420 if (file->is_async) { in ib_uverbs_event_close()
421 ib_unregister_event_handler(&file->uverbs_file->event_handler); in ib_uverbs_event_close()
422 kref_put(&file->uverbs_file->ref, ib_uverbs_release_file); in ib_uverbs_event_close()
424 kref_put(&file->ref, ib_uverbs_release_event_file); in ib_uverbs_event_close()
440 struct ib_uverbs_event_file *file = cq_context; in ib_uverbs_comp_handler() local
445 if (!file) in ib_uverbs_comp_handler()
448 spin_lock_irqsave(&file->lock, flags); in ib_uverbs_comp_handler()
449 if (file->is_closed) { in ib_uverbs_comp_handler()
450 spin_unlock_irqrestore(&file->lock, flags); in ib_uverbs_comp_handler()
456 spin_unlock_irqrestore(&file->lock, flags); in ib_uverbs_comp_handler()
465 list_add_tail(&entry->list, &file->event_list); in ib_uverbs_comp_handler()
467 spin_unlock_irqrestore(&file->lock, flags); in ib_uverbs_comp_handler()
469 wake_up_interruptible(&file->poll_wait); in ib_uverbs_comp_handler()
470 kill_fasync(&file->async_queue, SIGIO, POLL_IN); in ib_uverbs_comp_handler()
473 static void ib_uverbs_async_handler(struct ib_uverbs_file *file, in ib_uverbs_async_handler() argument
481 spin_lock_irqsave(&file->async_file->lock, flags); in ib_uverbs_async_handler()
482 if (file->async_file->is_closed) { in ib_uverbs_async_handler()
483 spin_unlock_irqrestore(&file->async_file->lock, flags); in ib_uverbs_async_handler()
489 spin_unlock_irqrestore(&file->async_file->lock, flags); in ib_uverbs_async_handler()
498 list_add_tail(&entry->list, &file->async_file->event_list); in ib_uverbs_async_handler()
501 spin_unlock_irqrestore(&file->async_file->lock, flags); in ib_uverbs_async_handler()
503 wake_up_interruptible(&file->async_file->poll_wait); in ib_uverbs_async_handler()
504 kill_fasync(&file->async_file->async_queue, SIGIO, POLL_IN); in ib_uverbs_async_handler()
548 struct ib_uverbs_file *file = in ib_uverbs_event_handler() local
551 ib_uverbs_async_handler(file, event->element.port_num, event->event, in ib_uverbs_event_handler()
555 struct file *ib_uverbs_alloc_event_file(struct ib_uverbs_file *uverbs_file, in ib_uverbs_alloc_event_file()
559 struct file *filp; in ib_uverbs_alloc_event_file()
592 if (!f.file) in ib_uverbs_lookup_comp_file()
595 if (f.file->f_op != &uverbs_event_fops) in ib_uverbs_lookup_comp_file()
598 ev_file = f.file->private_data; in ib_uverbs_lookup_comp_file()
611 static ssize_t ib_uverbs_write(struct file *filp, const char __user *buf, in ib_uverbs_write()
614 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_write() local
643 if (!file->ucontext && in ib_uverbs_write()
647 if (!(file->device->ib_dev->uverbs_cmd_mask & (1ull << command))) in ib_uverbs_write()
653 return uverbs_cmd_table[command](file, in ib_uverbs_write()
677 if (!file->ucontext) in ib_uverbs_write()
680 if (!(file->device->ib_dev->uverbs_ex_cmd_mask & (1ull << command))) in ib_uverbs_write()
720 err = uverbs_ex_cmd_table[command](file, in ib_uverbs_write()
733 static int ib_uverbs_mmap(struct file *filp, struct vm_area_struct *vma) in ib_uverbs_mmap()
735 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_mmap() local
737 if (!file->ucontext) in ib_uverbs_mmap()
740 return file->device->ib_dev->mmap(file->ucontext, vma); in ib_uverbs_mmap()
753 static int ib_uverbs_open(struct inode *inode, struct file *filp) in ib_uverbs_open()
756 struct ib_uverbs_file *file; in ib_uverbs_open() local
768 file = kmalloc(sizeof *file, GFP_KERNEL); in ib_uverbs_open()
769 if (!file) { in ib_uverbs_open()
774 file->device = dev; in ib_uverbs_open()
775 file->ucontext = NULL; in ib_uverbs_open()
776 file->async_file = NULL; in ib_uverbs_open()
777 kref_init(&file->ref); in ib_uverbs_open()
778 mutex_init(&file->mutex); in ib_uverbs_open()
780 filp->private_data = file; in ib_uverbs_open()
795 static int ib_uverbs_close(struct inode *inode, struct file *filp) in ib_uverbs_close()
797 struct ib_uverbs_file *file = filp->private_data; in ib_uverbs_close() local
798 struct ib_uverbs_device *dev = file->device; in ib_uverbs_close()
800 ib_uverbs_cleanup_ucontext(file, file->ucontext); in ib_uverbs_close()
802 if (file->async_file) in ib_uverbs_close()
803 kref_put(&file->async_file->ref, ib_uverbs_release_event_file); in ib_uverbs_close()
805 kref_put(&file->ref, ib_uverbs_release_file); in ib_uverbs_close()