diff options
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/eventfd.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index e29fd2640709..46dbc0a7dfc1 100644 --- a/virt/kvm/eventfd.c +++ b/virt/kvm/eventfd.c | |||
| @@ -171,7 +171,7 @@ irqfd_deactivate(struct kvm_kernel_irqfd *irqfd) | |||
| 171 | queue_work(irqfd_cleanup_wq, &irqfd->shutdown); | 171 | queue_work(irqfd_cleanup_wq, &irqfd->shutdown); |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | int __attribute__((weak)) kvm_arch_set_irq( | 174 | int __attribute__((weak)) kvm_arch_set_irq_inatomic( |
| 175 | struct kvm_kernel_irq_routing_entry *irq, | 175 | struct kvm_kernel_irq_routing_entry *irq, |
| 176 | struct kvm *kvm, int irq_source_id, | 176 | struct kvm *kvm, int irq_source_id, |
| 177 | int level, | 177 | int level, |
| @@ -201,12 +201,9 @@ irqfd_wakeup(wait_queue_t *wait, unsigned mode, int sync, void *key) | |||
| 201 | irq = irqfd->irq_entry; | 201 | irq = irqfd->irq_entry; |
| 202 | } while (read_seqcount_retry(&irqfd->irq_entry_sc, seq)); | 202 | } while (read_seqcount_retry(&irqfd->irq_entry_sc, seq)); |
| 203 | /* An event has been signaled, inject an interrupt */ | 203 | /* An event has been signaled, inject an interrupt */ |
| 204 | if (irq.type == KVM_IRQ_ROUTING_MSI) | 204 | if (kvm_arch_set_irq_inatomic(&irq, kvm, |
| 205 | kvm_set_msi(&irq, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1, | 205 | KVM_USERSPACE_IRQ_SOURCE_ID, 1, |
| 206 | false); | 206 | false) == -EWOULDBLOCK) |
| 207 | else if (kvm_arch_set_irq(&irq, kvm, | ||
| 208 | KVM_USERSPACE_IRQ_SOURCE_ID, 1, | ||
| 209 | false) == -EWOULDBLOCK) | ||
| 210 | schedule_work(&irqfd->inject); | 207 | schedule_work(&irqfd->inject); |
| 211 | srcu_read_unlock(&kvm->irq_srcu, idx); | 208 | srcu_read_unlock(&kvm->irq_srcu, idx); |
| 212 | } | 209 | } |
