Lines Matching refs:irqfd
44 struct kvm_kernel_irqfd *irqfd =
46 struct kvm *kvm = irqfd->kvm;
48 if (!irqfd->resampler) {
49 kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 1,
51 kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, irqfd->gsi, 0,
55 irqfd->gsi, 1, false);
68 struct kvm_kernel_irqfd *irqfd;
80 list_for_each_entry_rcu(irqfd, &resampler->list, resampler_link)
81 eventfd_signal(irqfd->resamplefd, 1);
87 irqfd_resampler_shutdown(struct kvm_kernel_irqfd *irqfd)
89 struct kvm_kernel_irqfd_resampler *resampler = irqfd->resampler;
94 list_del_rcu(&irqfd->resampler_link);
114 struct kvm_kernel_irqfd *irqfd =
116 struct kvm *kvm = irqfd->kvm;
119 /* Make sure irqfd has been initialized in assign path. */
126 eventfd_ctx_remove_wait_queue(irqfd->eventfd, &irqfd->wait, &cnt);
132 flush_work(&irqfd->inject);
134 if (irqfd->resampler) {
135 irqfd_resampler_shutdown(irqfd);
136 eventfd_ctx_put(irqfd->resamplefd);
143 irq_bypass_unregister_consumer(&irqfd->consumer);
145 eventfd_ctx_put(irqfd->eventfd);
146 kfree(irqfd);
152 irqfd_is_active(struct kvm_kernel_irqfd *irqfd)
154 return list_empty(&irqfd->list) ? false : true;
158 * Mark the irqfd as inactive and schedule it for removal
163 irqfd_deactivate(struct kvm_kernel_irqfd *irqfd)
165 BUG_ON(!irqfd_is_active(irqfd));
167 list_del_init(&irqfd->list);
169 queue_work(irqfd_cleanup_wq, &irqfd->shutdown);
187 struct kvm_kernel_irqfd *irqfd =
191 struct kvm *kvm = irqfd->kvm;
198 seq = read_seqcount_begin(&irqfd->irq_entry_sc);
199 irq = irqfd->irq_entry;
200 } while (read_seqcount_retry(&irqfd->irq_entry_sc, seq));
205 schedule_work(&irqfd->inject);
216 * We must check if someone deactivated the irqfd before
221 * We cannot race against the irqfd going away since the
224 if (irqfd_is_active(irqfd))
225 irqfd_deactivate(irqfd);
237 struct kvm_kernel_irqfd *irqfd =
239 add_wait_queue(wqh, &irqfd->wait);
243 static void irqfd_update(struct kvm *kvm, struct kvm_kernel_irqfd *irqfd)
249 n_entries = kvm_irq_map_gsi(kvm, entries, irqfd->gsi);
251 write_seqcount_begin(&irqfd->irq_entry_sc);
255 irqfd->irq_entry = *e;
257 irqfd->irq_entry.type = 0;
259 write_seqcount_end(&irqfd->irq_entry_sc);
284 struct kvm_kernel_irqfd *irqfd, *tmp;
297 irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL_ACCOUNT);
298 if (!irqfd)
301 irqfd->kvm = kvm;
302 irqfd->gsi = args->gsi;
303 INIT_LIST_HEAD(&irqfd->list);
304 INIT_WORK(&irqfd->inject, irqfd_inject);
305 INIT_WORK(&irqfd->shutdown, irqfd_shutdown);
306 seqcount_spinlock_init(&irqfd->irq_entry_sc, &kvm->irqfds.lock);
320 irqfd->eventfd = eventfd;
331 irqfd->resamplefd = resamplefd;
332 INIT_LIST_HEAD(&irqfd->resampler_link);
338 if (resampler->notifier.gsi == irqfd->gsi) {
339 irqfd->resampler = resampler;
344 if (!irqfd->resampler) {
355 resampler->notifier.gsi = irqfd->gsi;
362 irqfd->resampler = resampler;
365 list_add_rcu(&irqfd->resampler_link, &irqfd->resampler->list);
375 init_waitqueue_func_entry(&irqfd->wait, irqfd_wakeup);
376 init_poll_funcptr(&irqfd->pt, irqfd_ptable_queue_proc);
382 if (irqfd->eventfd != tmp->eventfd)
391 irqfd_update(kvm, irqfd);
393 list_add_tail(&irqfd->list, &kvm->irqfds.items);
401 events = vfs_poll(f.file, &irqfd->pt);
404 schedule_work(&irqfd->inject);
408 irqfd->consumer.token = (void *)irqfd->eventfd;
409 irqfd->consumer.add_producer = kvm_arch_irq_bypass_add_producer;
410 irqfd->consumer.del_producer = kvm_arch_irq_bypass_del_producer;
411 irqfd->consumer.stop = kvm_arch_irq_bypass_stop;
412 irqfd->consumer.start = kvm_arch_irq_bypass_start;
413 ret = irq_bypass_register_consumer(&irqfd->consumer);
416 irqfd->consumer.token, ret);
423 * do not drop the file until the irqfd is fully initialized, otherwise
430 if (irqfd->resampler)
431 irqfd_resampler_shutdown(irqfd);
442 kfree(irqfd);
524 * shutdown any irqfd's that match fd+gsi
529 struct kvm_kernel_irqfd *irqfd, *tmp;
538 list_for_each_entry_safe(irqfd, tmp, &kvm->irqfds.items, list) {
539 if (irqfd->eventfd == eventfd && irqfd->gsi == args->gsi) {
546 write_seqcount_begin(&irqfd->irq_entry_sc);
547 irqfd->irq_entry.type = 0;
548 write_seqcount_end(&irqfd->irq_entry_sc);
549 irqfd_deactivate(irqfd);
585 struct kvm_kernel_irqfd *irqfd, *tmp;
589 list_for_each_entry_safe(irqfd, tmp, &kvm->irqfds.items, list)
590 irqfd_deactivate(irqfd);
608 struct kvm_kernel_irqfd *irqfd;
612 list_for_each_entry(irqfd, &kvm->irqfds.items, list) {
613 irqfd_update(kvm, irqfd);
616 if (irqfd->producer) {
618 irqfd->kvm, irqfd->producer->irq,
619 irqfd->gsi, 1);
635 irqfd_cleanup_wq = alloc_workqueue("kvm-irqfd-cleanup", 0, 0);