aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2015-10-28 14:16:47 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2015-11-04 10:24:35 -0500
commitb97e6de9c96cefaa02a6a7464731ea504b45e150 (patch)
treed6edce2dc3d5ceb7ccc5de818cb5761d5927ea6d
parent0669a51015c58b1f036030743a0c0781eb63867f (diff)
KVM: x86: merge kvm_arch_set_irq with kvm_set_msi_inatomic
We do not want to do too much work in atomic context, in particular not walking all the VCPUs of the virtual machine. So we want to distinguish the architecture-specific injection function for irqfd from kvm_set_msi. Since it's still empty, reuse the newly added kvm_arch_set_irq and rename it to kvm_arch_set_irq_inatomic. Reviewed-by: Radim Krčmář <rkrcmar@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/irq_comm.c14
-rw-r--r--include/linux/kvm_host.h7
-rw-r--r--virt/kvm/eventfd.c11
3 files changed, 15 insertions, 17 deletions
diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c
index 8f4499c7ffc1..75dc633c48dc 100644
--- a/arch/x86/kvm/irq_comm.c
+++ b/arch/x86/kvm/irq_comm.c
@@ -124,12 +124,16 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
124} 124}
125 125
126 126
127static int kvm_set_msi_inatomic(struct kvm_kernel_irq_routing_entry *e, 127int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
128 struct kvm *kvm) 128 struct kvm *kvm, int irq_source_id, int level,
129 bool line_status)
129{ 130{
130 struct kvm_lapic_irq irq; 131 struct kvm_lapic_irq irq;
131 int r; 132 int r;
132 133
134 if (unlikely(e->type != KVM_IRQ_ROUTING_MSI))
135 return -EWOULDBLOCK;
136
133 kvm_set_msi_irq(e, &irq); 137 kvm_set_msi_irq(e, &irq);
134 138
135 if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL)) 139 if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL))
@@ -165,10 +169,8 @@ int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level)
165 idx = srcu_read_lock(&kvm->irq_srcu); 169 idx = srcu_read_lock(&kvm->irq_srcu);
166 if (kvm_irq_map_gsi(kvm, entries, irq) > 0) { 170 if (kvm_irq_map_gsi(kvm, entries, irq) > 0) {
167 e = &entries[0]; 171 e = &entries[0];
168 if (likely(e->type == KVM_IRQ_ROUTING_MSI)) 172 ret = kvm_arch_set_irq_inatomic(e, kvm, irq_source_id,
169 ret = kvm_set_msi_inatomic(e, kvm); 173 irq, level);
170 else
171 ret = -EWOULDBLOCK;
172 } 174 }
173 srcu_read_unlock(&kvm->irq_srcu, idx); 175 srcu_read_unlock(&kvm->irq_srcu, idx);
174 return ret; 176 return ret;
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 87189a41d904..15c78f320678 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -830,10 +830,9 @@ int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
830int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level); 830int kvm_set_irq_inatomic(struct kvm *kvm, int irq_source_id, u32 irq, int level);
831int kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm, 831int kvm_set_msi(struct kvm_kernel_irq_routing_entry *irq_entry, struct kvm *kvm,
832 int irq_source_id, int level, bool line_status); 832 int irq_source_id, int level, bool line_status);
833 833int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
834int kvm_arch_set_irq(struct kvm_kernel_irq_routing_entry *irq, struct kvm *kvm, 834 struct kvm *kvm, int irq_source_id,
835 int irq_source_id, int level, bool line_status); 835 int level, bool line_status);
836
837bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin); 836bool kvm_irq_has_notifier(struct kvm *kvm, unsigned irqchip, unsigned pin);
838void kvm_notify_acked_gsi(struct kvm *kvm, int gsi); 837void kvm_notify_acked_gsi(struct kvm *kvm, int gsi);
839void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin); 838void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin);
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
174int __attribute__((weak)) kvm_arch_set_irq( 174int __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 }