virqfd
vfio_virqfd_disable(&ioeventfd->virqfd);
struct virqfd *unmask;
struct virqfd *mask;
struct virqfd *virqfd;
vfio_virqfd_disable(&ioeventfd->virqfd);
&ioeventfd->virqfd, fd);
struct virqfd *unmask;
struct virqfd *mask;
if (virqfd->thread)
virqfd->thread(virqfd->opaque, virqfd->data);
struct virqfd *virqfd = container_of(work, struct virqfd, flush_inject);
flush_work(&virqfd->inject);
void *data, struct virqfd **pvirqfd, int fd)
struct virqfd *virqfd;
virqfd = kzalloc_obj(*virqfd, GFP_KERNEL_ACCOUNT);
if (!virqfd)
virqfd->pvirqfd = pvirqfd;
virqfd->opaque = opaque;
virqfd->handler = handler;
virqfd->thread = thread;
virqfd->data = data;
INIT_WORK(&virqfd->shutdown, virqfd_shutdown);
INIT_WORK(&virqfd->inject, virqfd_inject);
INIT_WORK(&virqfd->flush_inject, virqfd_flush_inject);
virqfd->eventfd = ctx;
*pvirqfd = virqfd;
init_waitqueue_func_entry(&virqfd->wait, virqfd_wakeup);
init_poll_funcptr(&virqfd->pt, virqfd_ptable_queue_proc);
events = vfs_poll(fd_file(irqfd), &virqfd->pt);
schedule_work(&virqfd->inject);
kfree(virqfd);
void vfio_virqfd_disable(struct virqfd **pvirqfd)
void vfio_virqfd_flush_thread(struct virqfd **pvirqfd)
static void virqfd_deactivate(struct virqfd *virqfd)
queue_work(vfio_irqfd_cleanup_wq, &virqfd->shutdown);
struct virqfd *virqfd = container_of(wait, struct virqfd, wait);
eventfd_ctx_do_read(virqfd->eventfd, &cnt);
if ((!virqfd->handler ||
virqfd->handler(virqfd->opaque, virqfd->data)) &&
virqfd->thread)
schedule_work(&virqfd->inject);
if (*(virqfd->pvirqfd) == virqfd) {
*(virqfd->pvirqfd) = NULL;
virqfd_deactivate(virqfd);
struct virqfd *virqfd = container_of(pt, struct virqfd, pt);
add_wait_queue(wqh, &virqfd->wait);
struct virqfd *virqfd = container_of(work, struct virqfd, shutdown);
eventfd_ctx_remove_wait_queue(virqfd->eventfd, &virqfd->wait, &cnt);
flush_work(&virqfd->inject);
eventfd_ctx_put(virqfd->eventfd);
kfree(virqfd);
struct virqfd *virqfd = container_of(work, struct virqfd, inject);
struct virqfd **pvirqfd;
struct virqfd **pvirqfd, int fd);
void vfio_virqfd_disable(struct virqfd **pvirqfd);
void vfio_virqfd_flush_thread(struct virqfd **pvirqfd);