1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * 4 * irqfd: Allows an fd to be used to inject an interrupt to the guest 5 * Credit goes to Avi Kivity for the original idea. 6 */ 7 8 #ifndef __LINUX_KVM_IRQFD_H 9 #define __LINUX_KVM_IRQFD_H 10 11 #include <linux/kvm_host.h> 12 #include <linux/poll.h> 13 14 /* 15 * Resampling irqfds are a special variety of irqfds used to emulate 16 * level triggered interrupts. The interrupt is asserted on eventfd 17 * trigger. On acknowledgment through the irq ack notifier, the 18 * interrupt is de-asserted and userspace is notified through the 19 * resamplefd. All resamplers on the same gsi are de-asserted 20 * together, so we don't need to track the state of each individual 21 * user. We can also therefore share the same irq source ID. 22 */ 23 struct kvm_kernel_irqfd_resampler { 24 struct kvm *kvm; 25 /* 26 * List of resampling struct _irqfd objects sharing this gsi. 27 * RCU list modified under kvm->irqfds.resampler_lock 28 */ 29 struct list_head list; 30 struct kvm_irq_ack_notifier notifier; 31 /* 32 * Entry in list of kvm->irqfd.resampler_list. Use for sharing 33 * resamplers among irqfds on the same gsi. 34 * RCU list modified under kvm->irqfds.resampler_lock 35 */ 36 struct list_head link; 37 }; 38 39 struct kvm_kernel_irqfd { 40 /* Used for MSI fast-path */ 41 struct kvm *kvm; 42 wait_queue_entry_t wait; 43 /* Update side is protected by irqfds.lock */ 44 struct kvm_kernel_irq_routing_entry irq_entry; 45 seqcount_spinlock_t irq_entry_sc; 46 /* Used for level IRQ fast-path */ 47 int gsi; 48 struct work_struct inject; 49 /* The resampler used by this irqfd (resampler-only) */ 50 struct kvm_kernel_irqfd_resampler *resampler; 51 /* Eventfd notified on resample (resampler-only) */ 52 struct eventfd_ctx *resamplefd; 53 /* Entry in list of irqfds for a resampler (resampler-only) */ 54 struct list_head resampler_link; 55 /* Used for setup/shutdown */ 56 struct eventfd_ctx *eventfd; 57 struct list_head list; 58 poll_table pt; 59 struct work_struct shutdown; 60 struct irq_bypass_consumer consumer; 61 struct irq_bypass_producer *producer; 62 }; 63 64 #endif /* __LINUX_KVM_IRQFD_H */ 65