aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Auger <eric.auger@linaro.org>2015-03-04 05:14:33 -0500
committerChristoffer Dall <christoffer.dall@linaro.org>2015-03-12 10:15:32 -0400
commit01c94e64f5a6f298774bdbde435e577821119fc0 (patch)
treeed6ffc9210f18dc02dd9306095d13a39ae03f05d
parentdf2bd1ac03dfc19e955a43f796cfe9f9cf49c75f (diff)
KVM: introduce kvm_arch_intc_initialized and use it in irqfd
Introduce __KVM_HAVE_ARCH_INTC_INITIALIZED define and associated kvm_arch_intc_initialized function. This latter allows to test whether the virtual interrupt controller is initialized and ready to accept virtual IRQ injection. On some architectures, the virtual interrupt controller is dynamically instantiated, justifying that kind of check. The new function can now be used by irqfd to check whether the virtual interrupt controller is ready on KVM_IRQFD request. If not, KVM_IRQFD returns -EAGAIN. Signed-off-by: Eric Auger <eric.auger@linaro.org> Acked-by: Christoffer Dall <christoffer.dall@linaro.org> Reviewed-by: Andre Przywara <andre.przywara@arm.com> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
-rw-r--r--include/linux/kvm_host.h14
-rw-r--r--virt/kvm/eventfd.c3
2 files changed, 17 insertions, 0 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index d12b2104d19b..ae9c72012004 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -700,6 +700,20 @@ static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu)
700#endif 700#endif
701} 701}
702 702
703#ifdef __KVM_HAVE_ARCH_INTC_INITIALIZED
704/*
705 * returns true if the virtual interrupt controller is initialized and
706 * ready to accept virtual IRQ. On some architectures the virtual interrupt
707 * controller is dynamically instantiated and this is not always true.
708 */
709bool kvm_arch_intc_initialized(struct kvm *kvm);
710#else
711static inline bool kvm_arch_intc_initialized(struct kvm *kvm)
712{
713 return true;
714}
715#endif
716
703int kvm_arch_init_vm(struct kvm *kvm, unsigned long type); 717int kvm_arch_init_vm(struct kvm *kvm, unsigned long type);
704void kvm_arch_destroy_vm(struct kvm *kvm); 718void kvm_arch_destroy_vm(struct kvm *kvm);
705void kvm_arch_sync_events(struct kvm *kvm); 719void kvm_arch_sync_events(struct kvm *kvm);
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
index 148b2392c762..fc5f43e54a80 100644
--- a/virt/kvm/eventfd.c
+++ b/virt/kvm/eventfd.c
@@ -311,6 +311,9 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
311 unsigned int events; 311 unsigned int events;
312 int idx; 312 int idx;
313 313
314 if (!kvm_arch_intc_initialized(kvm))
315 return -EAGAIN;
316
314 irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL); 317 irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL);
315 if (!irqfd) 318 if (!irqfd)
316 return -ENOMEM; 319 return -ENOMEM;