|
@@ -391,19 +391,19 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
|
|
|
lockdep_is_held(&kvm->irqfds.lock));
|
|
|
irqfd_update(kvm, irqfd, irq_rt);
|
|
|
|
|
|
- events = f.file->f_op->poll(f.file, &irqfd->pt);
|
|
|
-
|
|
|
list_add_tail(&irqfd->list, &kvm->irqfds.items);
|
|
|
|
|
|
+ spin_unlock_irq(&kvm->irqfds.lock);
|
|
|
+
|
|
|
/*
|
|
|
* Check if there was an event already pending on the eventfd
|
|
|
* before we registered, and trigger it as if we didn't miss it.
|
|
|
*/
|
|
|
+ events = f.file->f_op->poll(f.file, &irqfd->pt);
|
|
|
+
|
|
|
if (events & POLLIN)
|
|
|
schedule_work(&irqfd->inject);
|
|
|
|
|
|
- spin_unlock_irq(&kvm->irqfds.lock);
|
|
|
-
|
|
|
/*
|
|
|
* do not drop the file until the irqfd is fully initialized, otherwise
|
|
|
* we might race against the POLLHUP
|