Lines Matching refs:irqfd

3  * ACRN HSM irqfd: use eventfd objects to inject virtual interrupts
22 * struct hsm_irqfd - Properties of HSM irqfd
41 static void acrn_irqfd_inject(struct hsm_irqfd *irqfd)
43 struct acrn_vm *vm = irqfd->vm;
45 acrn_msi_inject(vm, irqfd->msi.msi_addr,
46 irqfd->msi.msi_data);
49 static void hsm_irqfd_shutdown(struct hsm_irqfd *irqfd)
53 lockdep_assert_held(&irqfd->vm->irqfds_lock);
56 list_del_init(&irqfd->list);
57 eventfd_ctx_remove_wait_queue(irqfd->eventfd, &irqfd->wait, &cnt);
58 eventfd_ctx_put(irqfd->eventfd);
59 kfree(irqfd);
64 struct hsm_irqfd *irqfd;
67 irqfd = container_of(work, struct hsm_irqfd, shutdown);
68 vm = irqfd->vm;
70 if (!list_empty(&irqfd->list))
71 hsm_irqfd_shutdown(irqfd);
80 struct hsm_irqfd *irqfd;
83 irqfd = container_of(wait, struct hsm_irqfd, wait);
84 vm = irqfd->vm;
87 acrn_irqfd_inject(irqfd);
91 queue_work(vm->irqfd_wq, &irqfd->shutdown);
99 struct hsm_irqfd *irqfd;
101 irqfd = container_of(pt, struct hsm_irqfd, pt);
102 add_wait_queue(wqh, &irqfd->wait);
106 * Assign an eventfd to a VM and create a HSM irqfd associated with the
107 * eventfd. The properties of the HSM irqfd are built from a &struct
113 struct hsm_irqfd *irqfd, *tmp;
118 irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL);
119 if (!irqfd)
122 irqfd->vm = vm;
123 memcpy(&irqfd->msi, &args->msi, sizeof(args->msi));
124 INIT_LIST_HEAD(&irqfd->list);
125 INIT_WORK(&irqfd->shutdown, hsm_irqfd_shutdown_work);
139 irqfd->eventfd = eventfd;
145 init_waitqueue_func_entry(&irqfd->wait, hsm_irqfd_wakeup);
146 init_poll_funcptr(&irqfd->pt, hsm_irqfd_poll_func);
150 if (irqfd->eventfd != tmp->eventfd)
156 list_add_tail(&irqfd->list, &vm->irqfds);
160 events = vfs_poll(f.file, &irqfd->pt);
163 acrn_irqfd_inject(irqfd);
173 kfree(irqfd);
180 struct hsm_irqfd *irqfd, *tmp;
188 list_for_each_entry_safe(irqfd, tmp, &vm->irqfds, list) {
189 if (irqfd->eventfd == eventfd) {
190 hsm_irqfd_shutdown(irqfd);
220 dev_dbg(acrn_dev.this_device, "VM %u irqfd init.\n", vm->vmid);
226 struct hsm_irqfd *irqfd, *next;
228 dev_dbg(acrn_dev.this_device, "VM %u irqfd deinit.\n", vm->vmid);
231 list_for_each_entry_safe(irqfd, next, &vm->irqfds, list)
232 hsm_irqfd_shutdown(irqfd);