/* SPDX-License-Identifier: GPL-2.0-only */ /* * irqfd: Allows an fd to be used to inject an interrupt to the guest. * ioeventfd: Allow an fd to be used to receive a signal from the guest. * All credit goes to kvm developers. */ #ifndef __LINUX_MSHV_EVENTFD_H #define __LINUX_MSHV_EVENTFD_H #include #include "mshv.h" #include "mshv_root.h" /* struct to contain list of irqfds sharing an irq. Updates are protected by * partition.irqfds.resampler_lock */ struct mshv_irqfd_resampler { struct mshv_partition *rsmplr_partn; struct hlist_head rsmplr_irqfd_list; struct mshv_irq_ack_notifier rsmplr_notifier; struct hlist_node rsmplr_hnode; }; struct mshv_irqfd { struct mshv_partition *irqfd_partn; struct eventfd_ctx *irqfd_eventfd_ctx; struct mshv_guest_irq_ent irqfd_girq_ent; seqcount_spinlock_t irqfd_irqe_sc; u32 irqfd_irqnum; struct mshv_lapic_irq irqfd_lapic_irq; struct hlist_node irqfd_hnode; poll_table irqfd_polltbl; wait_queue_head_t *irqfd_wqh; wait_queue_entry_t irqfd_wait; struct work_struct irqfd_shutdown; struct mshv_irqfd_resampler *irqfd_resampler; struct eventfd_ctx *irqfd_resamplefd; struct hlist_node irqfd_resampler_hnode; }; void mshv_eventfd_init(struct mshv_partition *partition); void mshv_eventfd_release(struct mshv_partition *partition); void mshv_register_irq_ack_notifier(struct mshv_partition *partition, struct mshv_irq_ack_notifier *mian); void mshv_unregister_irq_ack_notifier(struct mshv_partition *partition, struct mshv_irq_ack_notifier *mian); bool mshv_notify_acked_gsi(struct mshv_partition *partition, int gsi); int mshv_set_unset_irqfd(struct mshv_partition *partition, struct mshv_user_irqfd *args); int mshv_irqfd_wq_init(void); void mshv_irqfd_wq_cleanup(void); struct mshv_ioeventfd { struct hlist_node iovntfd_hnode; u64 iovntfd_addr; int iovntfd_length; struct eventfd_ctx *iovntfd_eventfd; u64 iovntfd_datamatch; int iovntfd_doorbell_id; bool iovntfd_wildcard; }; int mshv_set_unset_ioeventfd(struct mshv_partition *pt, struct mshv_user_ioeventfd *args); #endif /* __LINUX_MSHV_EVENTFD_H */