Al, Davide, Gregory Haskins wrote: > + > +int > +kvm_irqfd(struct kvm *kvm, int gsi, int flags) > +{ > + struct _irqfd *irqfd; > + struct file *file = NULL; > + int fd = -1; > + int ret; > + > + irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL); > + if (!irqfd) > + return -ENOMEM; > + > + irqfd->kvm = kvm; > + irqfd->gsi = gsi; > + INIT_LIST_HEAD(&irqfd->list); > + INIT_WORK(&irqfd->work, irqfd_inject); > + > + /* > + * We re-use eventfd for irqfd, and therefore will embed the eventfd > + * lifetime in the irqfd. > + */ > + file = eventfd_file_create(0, 0); > + if (IS_ERR(file)) { > + ret = PTR_ERR(file); > + goto fail; > + } > + > + irqfd->file = file; > + > + /* > + * Install our own custom wake-up handling so we are notified via > + * a callback whenever someone signals the underlying eventfd > + */ > + init_waitqueue_func_entry(&irqfd->wait, irqfd_wakeup); > + init_poll_funcptr(&irqfd->pt, irqfd_ptable_queue_proc); > + > + ret = file->f_op->poll(file, &irqfd->pt); > + if (ret < 0) > + goto fail; > + > + mutex_lock(&kvm->lock); > + list_add_tail(&irqfd->list, &kvm->irqfds); > + mutex_unlock(&kvm->lock); > + > + ret = get_unused_fd(); > + if (ret < 0) > + goto fail; > + > + fd = ret; > + > + fd_install(fd, file); > Can you comment on whether this function needs to take an additional reference on file here? (one for the one held by userspace/fd, and the other for irqfd->file) My instinct is telling me this may be currently broken, but I am not sure. -Greg
Attachment:
signature.asc
Description: OpenPGP digital signature