Message ID | 1421333267-15287-3-git-send-email-eric.auger@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Eric, On 01/15/2015 02:47 PM, Eric Auger wrote: > 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> > > --- > v6 -> v7: > - From now on, kvm_irqfd_assign calls kvm_arch_intc_initialized > (previously introduced in subsequent patch file). > - add Christoffer's ack > > v5 -> v6: > - rename function name and macro > - add kvm_arch_intc_initialized declaration in case the archi defines > the macro > --- > include/linux/kvm_host.h | 14 ++++++++++++++ > virt/kvm/eventfd.c | 3 +++ > 2 files changed, 17 insertions(+) > > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 26f1060..702036a 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -706,6 +706,20 @@ static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu) > #endif > } > > +#ifdef __KVM_HAVE_ARCH_INTC_INITIALIZED > +/* > + * returns trues if the virtual interrupt controller is initialized and Nit: true Other than that: Reviewed-by: Andre Przywara <andre.przywara@arm.com> Cheers, Andre. > + * ready to accept virtual IRQ. On some architectures the virtual interrupt > + * controller is dynamically instantiated and this is not always true. > + */ > +bool kvm_arch_intc_initialized(struct kvm *kvm); > +#else > +static inline bool kvm_arch_intc_initialized(struct kvm *kvm) > +{ > + return true; > +} > +#endif > + > int kvm_arch_init_vm(struct kvm *kvm, unsigned long type); > void kvm_arch_destroy_vm(struct kvm *kvm); > void kvm_arch_sync_events(struct kvm *kvm); > diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c > index 148b239..fc5f43e 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) > unsigned int events; > int idx; > > + if (!kvm_arch_intc_initialized(kvm)) > + return -EAGAIN; > + > irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL); > if (!irqfd) > return -ENOMEM; >
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 26f1060..702036a 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -706,6 +706,20 @@ static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu) #endif } +#ifdef __KVM_HAVE_ARCH_INTC_INITIALIZED +/* + * returns trues if the virtual interrupt controller is initialized and + * ready to accept virtual IRQ. On some architectures the virtual interrupt + * controller is dynamically instantiated and this is not always true. + */ +bool kvm_arch_intc_initialized(struct kvm *kvm); +#else +static inline bool kvm_arch_intc_initialized(struct kvm *kvm) +{ + return true; +} +#endif + int kvm_arch_init_vm(struct kvm *kvm, unsigned long type); void kvm_arch_destroy_vm(struct kvm *kvm); void kvm_arch_sync_events(struct kvm *kvm); diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c index 148b239..fc5f43e 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) unsigned int events; int idx; + if (!kvm_arch_intc_initialized(kvm)) + return -EAGAIN; + irqfd = kzalloc(sizeof(*irqfd), GFP_KERNEL); if (!irqfd) return -ENOMEM;