From patchwork Wed Jul 25 13:24:30 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 10236 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 2F1C723E02 for ; Wed, 25 Jul 2012 13:24:40 +0000 (UTC) Received: from mail-gh0-f180.google.com (mail-gh0-f180.google.com [209.85.160.180]) by fiordland.canonical.com (Postfix) with ESMTP id F3139A18C87 for ; Wed, 25 Jul 2012 13:24:39 +0000 (UTC) Received: by mail-gh0-f180.google.com with SMTP id z12so687253ghb.11 for ; Wed, 25 Jul 2012 06:24:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=VALLtHtEQU7GHM5bHbNHntQGTNgT63b2CX0SgLnMh5s=; b=L3uAis81iBLLgarcI3ZvXBjCUfPinHCEyfnWyiw4OXK9kZoDOjqEFFaaJO4DuScCe5 2Tmd9/+AMz5Hr7sKvCazPIC74oQANrJXHZ5UUi5PM/TLi8Bz0eZw7i5DA58qsZ8F336Z un8LB5Ia2LMvwNs4IPFyV5Xkjfy5xk7T2shC2U6ARhCCw94mRmRdN8qkiBJGk9fxoNYk nuI1v2H8DudX3v1VOGojTGHo6YKU3pK46GQTL9j5EKxMGRwuiyDTApNUnvEjckwrqe/p nJyhi0tCF6EmYDAX7308ufgr1xTWggp0xRGahLmcB4fSJFF/5HdHA0c2Hb9Os12/yexN XFXg== Received: by 10.42.54.133 with SMTP id r5mr20191694icg.9.1343222679699; Wed, 25 Jul 2012 06:24:39 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.153.7 with SMTP id i7csp90863ibw; Wed, 25 Jul 2012 06:24:36 -0700 (PDT) Received: by 10.205.136.3 with SMTP id ii3mr12089116bkc.101.1343222676131; Wed, 25 Jul 2012 06:24:36 -0700 (PDT) Received: from mnementh.archaic.org.uk (mnementh.archaic.org.uk. [81.2.115.146]) by mx.google.com with ESMTPS id fw11si19244759bkc.139.2012.07.25.06.24.35 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 25 Jul 2012 06:24:36 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of pm215@archaic.org.uk designates 81.2.115.146 as permitted sender) client-ip=81.2.115.146; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of pm215@archaic.org.uk designates 81.2.115.146 as permitted sender) smtp.mail=pm215@archaic.org.uk Received: from pm215 by mnementh.archaic.org.uk with local (Exim 4.72) (envelope-from ) id 1Su1Zo-0006ap-DI; Wed, 25 Jul 2012 14:24:32 +0100 From: Peter Maydell To: qemu-devel@nongnu.org Cc: patches@linaro.org, Avi Kivity , Marcelo Tosatti , Jan Kiszka , Alexander Graf Subject: [PATCH 4/6] kvm: Don't assume irqchip-in-kernel implies irqfds Date: Wed, 25 Jul 2012 14:24:30 +0100 Message-Id: <1343222672-25312-5-git-send-email-peter.maydell@linaro.org> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1343222672-25312-1-git-send-email-peter.maydell@linaro.org> References: <1343222672-25312-1-git-send-email-peter.maydell@linaro.org> X-Gm-Message-State: ALoCoQm4NCCtnexFBMhPBEZsJU+/063k70D2OKdELm6gzqVolhQtt8B1jjWyw/rBem55RDnQLPVA Instead of assuming that we can use irqfds if and only if kvm_irqchip_in_kernel(), add a bool to the KVMState which indicates this, and is set only on x86 and only if the irqchip is in the kernel. The kernel documentation implies that the only thing you need to use KVM_IRQFD is that KVM_CAP_IRQFD is advertised, but this seems to be untrue. In particular the kernel does not (alas) return a sensible error if you try to set up an irqfd when you haven't created an irqchip. If it did we could remove all this nonsense and let the kernel return the error code. Signed-off-by: Peter Maydell Acked-by: Jan Kiszka --- kvm-all.c | 3 ++- kvm-stub.c | 1 + kvm.h | 10 ++++++++++ target-i386/kvm.c | 4 ++++ 4 files changed, 17 insertions(+), 1 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 8e21d81..a88b8ad 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -101,6 +101,7 @@ struct KVMState KVMState *kvm_state; bool kvm_kernel_irqchip; bool kvm_async_interrupt_injection; +bool kvm_irqfds_allowed; static const KVMCapabilityInfo kvm_required_capabilites[] = { KVM_CAP_INFO(USER_MEMORY), @@ -1126,7 +1127,7 @@ static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign) .flags = assign ? 0 : KVM_IRQFD_FLAG_DEASSIGN, }; - if (!kvm_irqchip_in_kernel()) { + if (!kvm_irqfds_enabled()) { return -ENOSYS; } diff --git a/kvm-stub.c b/kvm-stub.c index af1cb5e..179e5de 100644 --- a/kvm-stub.c +++ b/kvm-stub.c @@ -20,6 +20,7 @@ KVMState *kvm_state; bool kvm_kernel_irqchip; bool kvm_async_interrupt_injection; +bool kvm_irqfds_allowed; int kvm_init_vcpu(CPUArchState *env) { diff --git a/kvm.h b/kvm.h index e6cbf12..2337eb0 100644 --- a/kvm.h +++ b/kvm.h @@ -25,6 +25,7 @@ extern int kvm_allowed; extern bool kvm_kernel_irqchip; extern bool kvm_async_interrupt_injection; +extern bool kvm_irqfds_allowed; #if defined CONFIG_KVM || !defined NEED_CPU_H #define kvm_enabled() (kvm_allowed) @@ -38,10 +39,19 @@ extern bool kvm_async_interrupt_injection; * (where the vcpu must be stopped at a suitable point first). */ #define kvm_async_interrupt_injection() (kvm_async_interrupt_injection) +/** + * kvm_irqfds_enabled: + * + * Returns: true if we can use irqfds to inject interrupts into + * a KVM CPU (ie the kernel supports irqfds and we are running + * with a configuration where it is meaningful to use them). + */ +#define kvm_irqfds_enabled() (kvm_irqfds_allowed) #else #define kvm_enabled() (0) #define kvm_irqchip_in_kernel() (false) #define kvm_async_interrupt_injection() (false) +#define kvm_irqfds_enabled() (false) #endif struct kvm_run; diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 503abeb..8e19a4d 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -2045,4 +2045,8 @@ void kvm_arch_init_irq_routing(KVMState *s) */ no_hpet = 1; } + /* We know at this point that we're using the in-kernel + * irqchip, so we can use irqfds. + */ + kvm_irqfds_allowed = true; }