From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Cc: Alexander Graf <agraf@suse.de>,
Marcelo Tosatti <mtosatti@redhat.com>,
Jan Kiszka <jan.kiszka@web.de>, Avi Kivity <avi@redhat.com>,
patches@linaro.org
Subject: [Qemu-devel] [PATCH v2 4/7] kvm: Decouple 'irqfds usable' from 'kernel irqchip'
Date: Thu, 26 Jul 2012 15:35:14 +0100 [thread overview]
Message-ID: <1343313317-27087-5-git-send-email-peter.maydell@linaro.org> (raw)
In-Reply-To: <1343313317-27087-1-git-send-email-peter.maydell@linaro.org>
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 <peter.maydell@linaro.org>
Acked-by: Jan Kiszka <jan.kiszka@siemens.com>
---
kvm-all.c | 3 ++-
kvm-stub.c | 1 +
kvm.h | 11 +++++++++++
target-i386/kvm.c | 4 ++++
4 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/kvm-all.c b/kvm-all.c
index 9a34090..3a69e53 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_interrupts_allowed;
+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 f2b0c61..02e7fe0 100644
--- a/kvm-stub.c
+++ b/kvm-stub.c
@@ -20,6 +20,7 @@
KVMState *kvm_state;
bool kvm_kernel_irqchip;
bool kvm_async_interrupts_allowed;
+bool kvm_irqfds_allowed;
int kvm_init_vcpu(CPUArchState *env)
{
diff --git a/kvm.h b/kvm.h
index 47bf5ba..21436ef 100644
--- a/kvm.h
+++ b/kvm.h
@@ -25,6 +25,7 @@
extern int kvm_allowed;
extern bool kvm_kernel_irqchip;
extern bool kvm_async_interrupts_allowed;
+extern bool kvm_irqfds_allowed;
#if defined CONFIG_KVM || !defined NEED_CPU_H
#define kvm_enabled() (kvm_allowed)
@@ -40,10 +41,20 @@ extern bool kvm_async_interrupts_allowed;
*/
#define kvm_async_interrupts_enabled() (kvm_async_interrupts_allowed)
+/**
+ * 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_interrupts_enabled() (false)
+#define kvm_irqfds_enabled() (false)
#endif
struct kvm_run;
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 7e5f51e..5cb33a2 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;
}
--
1.7.5.4
next prev parent reply other threads:[~2012-07-26 14:35 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-26 14:35 [Qemu-devel] [PATCH v2 0/7] split out uses of kvm_irqchip_in_kernel() Peter Maydell
2012-07-26 14:35 ` [Qemu-devel] [PATCH v2 1/7] kvm: Decouple 'async interrupt delivery' from 'kernel irqchip' Peter Maydell
2012-07-26 14:35 ` [Qemu-devel] [PATCH v2 2/7] kvm: Rename kvm_irqchip_set_irq() to kvm_set_irq() Peter Maydell
2012-07-26 14:35 ` [Qemu-devel] [PATCH v2 3/7] kvm: Move kvm_allows_irq0_override() to target-i386, fix return type Peter Maydell
2012-07-26 14:35 ` Peter Maydell [this message]
2012-07-26 14:35 ` [Qemu-devel] [PATCH v2 5/7] kvm: Decouple 'MSI routing via irqfds' from 'kernel irqchip' Peter Maydell
2012-07-26 14:35 ` [Qemu-devel] [PATCH v2 6/7] kvm: Decouple 'GSI routing' " Peter Maydell
2012-07-26 14:35 ` [Qemu-devel] [PATCH v2 7/7] kvm: Add documentation comment for kvm_irqchip_in_kernel() Peter Maydell
2012-08-01 14:39 ` [Qemu-devel] [PATCH v2 0/7] split out uses of kvm_irqchip_in_kernel() Peter Maydell
2012-08-02 9:00 ` Jan Kiszka
2012-08-02 9:14 ` Jan Kiszka
2012-08-07 15:11 ` Peter Maydell
2012-08-09 13:17 ` Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1343313317-27087-5-git-send-email-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=agraf@suse.de \
--cc=avi@redhat.com \
--cc=jan.kiszka@web.de \
--cc=mtosatti@redhat.com \
--cc=patches@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).