From: Alex Williamson <alex.williamson@redhat.com>
To: avi@redhat.com, mst@redhat.com
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
jan.kiszka@siemens.com
Subject: [PATCH v2 6/6] kvm: Level IRQ de-assert for KVM_IRQFD
Date: Tue, 26 Jun 2012 23:10:20 -0600 [thread overview]
Message-ID: <20120627051013.23698.91132.stgit@bling.home> (raw)
In-Reply-To: <20120627044758.23698.249.stgit@bling.home>
This is an alternate level irqfd de-assert mode that's potentially
useful for emulated drivers. It's included here to show how easy it
is to implement with the new level irqfd and eoifd support. It's
possible this mode might also prove interesting for device-assignment
where we inject via level irqfd, receive an EOI (w/o de-assert), and
use the level de-assert irqfd here.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
---
Documentation/virtual/kvm/api.txt | 8 ++++++++
include/linux/kvm.h | 6 +++++-
virt/kvm/eventfd.c | 28 ++++++++++++++++++++++++++--
3 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 87a2558..b356937 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1987,6 +1987,14 @@ interrupts with those injected through KVM_IRQ_LINE. IRQFDs created
with KVM_IRQFD_FLAG_LEVEL must also set this flag when de-assiging.
KVM_IRQFD_FLAG_LEVEL support is indicated by KVM_CAP_IRQFD_LEVEL.
+The KVM_IRQFD_FLAG_LEVEL_DEASSERT flag creates an irqfd similar to
+KVM_IRQFD_FLAG_LEVEL, except the irqfd de-asserts the irqchip pin
+rather than asserts it. The level irqfd must first be created as
+aboved and passed to this ioctl in kvm_irqfd.irqfd. This ensures
+the de-assert irqfd uses the same IRQ source ID as the assert irqfd.
+This flag should also be specified on de-assign. This feature is
+present when KVM_CAP_IRQFD_LEVEL_DEASSERT is available.
+
4.77 KVM_EOIFD
Capability: KVM_CAP_EOIFD
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 7567e7d..0bbfd47 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -620,6 +620,7 @@ struct kvm_ppc_smmu_info {
#define KVM_CAP_PPC_ALLOC_HTAB 80
#define KVM_CAP_IRQFD_LEVEL 81
#define KVM_CAP_EOIFD 82
+#define KVM_CAP_IRQFD_LEVEL_DEASSERT 83
#ifdef KVM_CAP_IRQ_ROUTING
@@ -687,12 +688,15 @@ struct kvm_xen_hvm_config {
#define KVM_IRQFD_FLAG_DEASSIGN (1 << 0)
/* Available with KVM_CAP_IRQFD_LEVEL */
#define KVM_IRQFD_FLAG_LEVEL (1 << 1)
+/* Available with KVM_CAP_IRQFD_LEVEL_DEASSERT */
+#define KVM_IRQFD_FLAG_LEVEL_DEASSERT (1 << 2)
struct kvm_irqfd {
__u32 fd;
__u32 gsi;
__u32 flags;
- __u8 pad[20];
+ __u32 irqfd;
+ __u8 pad[16];
};
#define KVM_EOIFD_FLAG_DEASSIGN (1 << 0)
diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c
index 02ca50f..50ace0e 100644
--- a/virt/kvm/eventfd.c
+++ b/virt/kvm/eventfd.c
@@ -172,6 +172,14 @@ irqfd_inject_level(struct work_struct *work)
kvm_set_irq(irqfd->kvm, irqfd->source->id, irqfd->gsi, 1);
}
+static void
+irqfd_inject_level_deassert(struct work_struct *work)
+{
+ struct _irqfd *irqfd = container_of(work, struct _irqfd, inject);
+
+ kvm_set_irq(irqfd->kvm, irqfd->source->id, irqfd->gsi, 0);
+}
+
/*
* Race-free decouple logic (ordering is critical)
*/
@@ -320,6 +328,9 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
INIT_LIST_HEAD(&irqfd->list);
if (args->flags & KVM_IRQFD_FLAG_LEVEL) {
+ if (args->flags & KVM_IRQFD_FLAG_LEVEL_DEASSERT)
+ return -EINVAL; /* mutually exclusive */
+
irqfd->source = new_irq_source(kvm);
if (IS_ERR(irqfd->source)) {
ret = PTR_ERR(irqfd->source);
@@ -328,6 +339,16 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args)
}
INIT_WORK(&irqfd->inject, irqfd_inject_level);
+
+ } else if (args->flags & KVM_IRQFD_FLAG_LEVEL_DEASSERT) {
+ irqfd->source = get_irq_source_from_irqfd(kvm, args->irqfd);
+ if (IS_ERR(irqfd->source)) {
+ ret = PTR_ERR(irqfd->source);
+ irqfd->source = NULL;
+ goto fail;
+ }
+
+ INIT_WORK(&irqfd->inject, irqfd_inject_level_deassert);
} else
INIT_WORK(&irqfd->inject, irqfd_inject_edge);
@@ -421,7 +442,8 @@ kvm_irqfd_deassign(struct kvm *kvm, struct kvm_irqfd *args)
{
struct _irqfd *irqfd, *tmp;
struct eventfd_ctx *eventfd;
- bool is_level = (args->flags & KVM_IRQFD_FLAG_LEVEL) != 0;
+ bool is_level = (args->flags & (KVM_IRQFD_FLAG_LEVEL |
+ KVM_IRQFD_FLAG_LEVEL_DEASSERT)) != 0;
eventfd = eventfd_ctx_fdget(args->fd);
if (IS_ERR(eventfd))
@@ -461,7 +483,9 @@ kvm_irqfd_deassign(struct kvm *kvm, struct kvm_irqfd *args)
int
kvm_irqfd(struct kvm *kvm, struct kvm_irqfd *args)
{
- if (args->flags & ~(KVM_IRQFD_FLAG_DEASSIGN | KVM_IRQFD_FLAG_LEVEL))
+ if (args->flags & ~(KVM_IRQFD_FLAG_DEASSIGN |
+ KVM_IRQFD_FLAG_LEVEL |
+ KVM_IRQFD_FLAG_LEVEL_DEASSERT))
return -EINVAL;
if (args->flags & KVM_IRQFD_FLAG_DEASSIGN)
next prev parent reply other threads:[~2012-06-27 5:10 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-27 5:08 [PATCH v2 0/6] kvm: level triggered irqfd support Alex Williamson
2012-06-27 5:09 ` [PATCH v2 1/6] kvm: Pass kvm_irqfd to functions Alex Williamson
2012-06-27 9:35 ` Michael S. Tsirkin
2012-06-27 14:30 ` Alex Williamson
2012-06-27 14:24 ` Cornelia Huck
2012-06-28 8:38 ` Michael S. Tsirkin
2012-06-28 9:03 ` Cornelia Huck
2012-06-28 9:34 ` Michael S. Tsirkin
2012-06-28 12:00 ` Cornelia Huck
2012-06-28 12:09 ` Michael S. Tsirkin
2012-06-28 16:51 ` Cornelia Huck
2012-06-28 16:56 ` Michael S. Tsirkin
2012-06-29 15:14 ` Alex Williamson
2012-06-27 5:09 ` [PATCH v2 2/6] kvm: Add missing KVM_IRQFD API documentation Alex Williamson
2012-06-27 9:53 ` Michael S. Tsirkin
2012-06-27 5:09 ` [PATCH v2 3/6] kvm: Sanitize KVM_IRQFD flags Alex Williamson
2012-06-27 9:21 ` Michael S. Tsirkin
2012-06-27 20:12 ` Alex Williamson
2012-06-27 20:22 ` Michael S. Tsirkin
2012-06-28 12:35 ` Avi Kivity
2012-06-27 5:09 ` [PATCH v2 4/6] kvm: Extend irqfd to support level interrupts Alex Williamson
2012-06-27 9:34 ` Michael S. Tsirkin
2012-06-27 21:19 ` Alex Williamson
2012-06-28 12:41 ` Avi Kivity
2012-06-27 9:51 ` Michael S. Tsirkin
2012-06-27 20:59 ` Alex Williamson
2012-06-27 21:14 ` Michael S. Tsirkin
2012-06-27 21:28 ` Alex Williamson
2012-06-27 22:28 ` Michael S. Tsirkin
2012-06-28 3:52 ` Alex Williamson
2012-06-28 8:29 ` Michael S. Tsirkin
2012-06-29 15:13 ` Alex Williamson
2012-06-27 15:26 ` Michael S. Tsirkin
2012-06-27 22:04 ` Alex Williamson
2012-06-27 22:31 ` Michael S. Tsirkin
2012-06-28 6:34 ` Gleb Natapov
2012-06-28 8:34 ` Michael S. Tsirkin
2012-06-28 8:35 ` Gleb Natapov
2012-06-28 8:41 ` Michael S. Tsirkin
2012-06-28 8:46 ` Gleb Natapov
2012-06-28 8:48 ` Michael S. Tsirkin
2012-06-28 8:53 ` Gleb Natapov
2012-06-29 22:27 ` Alex Williamson
2012-07-01 7:34 ` Gleb Natapov
2012-06-27 5:10 ` [PATCH v2 5/6] kvm: KVM_EOIFD, an eventfd for EOIs Alex Williamson
2012-06-27 9:49 ` Michael S. Tsirkin
2012-06-27 13:58 ` Gleb Natapov
2012-06-27 14:29 ` Alex Williamson
2012-06-27 14:51 ` Gleb Natapov
2012-06-28 3:55 ` Alex Williamson
2012-06-28 13:11 ` Michael S. Tsirkin
2012-06-28 14:08 ` Gleb Natapov
2012-06-28 16:55 ` Michael S. Tsirkin
2012-06-27 15:20 ` Michael S. Tsirkin
2012-06-28 19:29 ` Michael S. Tsirkin
2012-06-29 15:09 ` Alex Williamson
2012-06-29 15:12 ` Alex Williamson
2012-06-27 5:10 ` Alex Williamson [this message]
2012-06-28 12:59 ` [PATCH v2 6/6] kvm: Level IRQ de-assert for KVM_IRQFD Avi Kivity
2012-06-29 15:39 ` Alex Williamson
2012-06-27 9:15 ` [PATCH v2 0/6] kvm: level triggered irqfd support Michael S. Tsirkin
2012-06-27 9:58 ` Michael S. Tsirkin
2012-06-27 14:33 ` Alex Williamson
2012-06-28 8:42 ` Michael S. Tsirkin
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=20120627051013.23698.91132.stgit@bling.home \
--to=alex.williamson@redhat.com \
--cc=avi@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
/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
all inboxes | Powered by JetHome®