1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * irqfd: Allows an fd to be used to inject an interrupt to the guest. 4 * ioeventfd: Allow an fd to be used to receive a signal from the guest. 5 * All credit goes to kvm developers. 6 */ 7 8 #ifndef __LINUX_MSHV_EVENTFD_H 9 #define __LINUX_MSHV_EVENTFD_H 10 11 #include <linux/poll.h> 12 13 #include "mshv.h" 14 #include "mshv_root.h" 15 16 /* struct to contain list of irqfds sharing an irq. Updates are protected by 17 * partition.irqfds.resampler_lock 18 */ 19 struct mshv_irqfd_resampler { 20 struct mshv_partition *rsmplr_partn; 21 struct hlist_head rsmplr_irqfd_list; 22 struct mshv_irq_ack_notifier rsmplr_notifier; 23 struct hlist_node rsmplr_hnode; 24 }; 25 26 struct mshv_irqfd { 27 struct mshv_partition *irqfd_partn; 28 struct eventfd_ctx *irqfd_eventfd_ctx; 29 struct mshv_guest_irq_ent irqfd_girq_ent; 30 seqcount_spinlock_t irqfd_irqe_sc; 31 u32 irqfd_irqnum; 32 struct mshv_lapic_irq irqfd_lapic_irq; 33 struct hlist_node irqfd_hnode; 34 poll_table irqfd_polltbl; 35 wait_queue_head_t *irqfd_wqh; 36 wait_queue_entry_t irqfd_wait; 37 struct work_struct irqfd_shutdown; 38 struct mshv_irqfd_resampler *irqfd_resampler; 39 struct eventfd_ctx *irqfd_resamplefd; 40 struct hlist_node irqfd_resampler_hnode; 41 }; 42 43 void mshv_eventfd_init(struct mshv_partition *partition); 44 void mshv_eventfd_release(struct mshv_partition *partition); 45 46 void mshv_register_irq_ack_notifier(struct mshv_partition *partition, 47 struct mshv_irq_ack_notifier *mian); 48 void mshv_unregister_irq_ack_notifier(struct mshv_partition *partition, 49 struct mshv_irq_ack_notifier *mian); 50 bool mshv_notify_acked_gsi(struct mshv_partition *partition, int gsi); 51 52 int mshv_set_unset_irqfd(struct mshv_partition *partition, 53 struct mshv_user_irqfd *args); 54 55 int mshv_irqfd_wq_init(void); 56 void mshv_irqfd_wq_cleanup(void); 57 58 struct mshv_ioeventfd { 59 struct hlist_node iovntfd_hnode; 60 u64 iovntfd_addr; 61 int iovntfd_length; 62 struct eventfd_ctx *iovntfd_eventfd; 63 u64 iovntfd_datamatch; 64 int iovntfd_doorbell_id; 65 bool iovntfd_wildcard; 66 }; 67 68 int mshv_set_unset_ioeventfd(struct mshv_partition *pt, 69 struct mshv_user_ioeventfd *args); 70 71 #endif /* __LINUX_MSHV_EVENTFD_H */ 72