All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3] qemu-kvm: add iosignalfd support
@ 2009-06-03 20:30 Gregory Haskins
  0 siblings, 0 replies; only message in thread
From: Gregory Haskins @ 2009-06-03 20:30 UTC (permalink / raw)
  To: kvm; +Cc: avi

An iosignalfd allows an eventfd to attach to a specific PIO/MMIO region in the
guest.  Any guest-writes to that region will trigger an eventfd signal.

[
  This userspace patch coorelates to the kvm.git patches, v5, which you
  can find here: http://lkml.org/lkml/2009/6/3/433, and are based on top
  of the irqfd userspace patches which have not yet been accepted upstream.
]

Signed-off-by: Gregory Haskins <ghaskins@novell.com>
---

 kvm/libkvm/libkvm.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++++++
 kvm/libkvm/libkvm.h |   42 ++++++++++++++++++++++++++++++++
 2 files changed, 110 insertions(+), 0 deletions(-)

diff --git a/kvm/libkvm/libkvm.c b/kvm/libkvm/libkvm.c
index 0ada15c..cb558fc 100644
--- a/kvm/libkvm/libkvm.c
+++ b/kvm/libkvm/libkvm.c
@@ -1493,3 +1493,71 @@ int kvm_irqfd(kvm_context_t kvm, int gsi, int flags)
 }
 
 #endif /* KVM_CAP_IRQFD */
+
+#ifdef KVM_CAP_IOSIGNALFD
+
+#include <sys/eventfd.h>
+
+int kvm_assign_iosignalfd(kvm_context_t kvm, unsigned long addr, size_t len,
+			  int fd, void *trigger, int flags)
+{
+	int r;
+	int type = flags & IOSIGNALFD_FLAG_PIO; 
+	struct kvm_iosignalfd data = {
+		.trigger = (__u64)trigger,
+		.addr    = addr,
+		.len     = len,
+		.fd      = fd,
+	};
+
+	data.flags |= trigger ? KVM_IOSIGNALFD_FLAG_TRIGGER : 0;
+	data.flags |= type ? KVM_IOSIGNALFD_FLAG_PIO : 0;
+
+	if (!kvm_check_extension(kvm, KVM_CAP_IOSIGNALFD))
+		return -ENOENT;
+
+	r = ioctl(kvm->vm_fd, KVM_IOSIGNALFD, &data);
+	if (r == -1)
+		r = -errno;
+	return r;
+}
+
+int kvm_deassign_iosignalfd(kvm_context_t kvm, unsigned long addr, int fd,
+			    int flags)
+{
+	int r;
+	int type = flags & IOSIGNALFD_FLAG_PIO; 
+	struct kvm_iosignalfd data = {
+		.addr    = addr,
+		.fd      = fd,
+		.flags   = KVM_IOSIGNALFD_FLAG_DEASSIGN |
+		(type ? KVM_IOSIGNALFD_FLAG_PIO : 0),
+	};
+
+	if (!kvm_check_extension(kvm, KVM_CAP_IOSIGNALFD))
+		return -ENOENT;
+
+	r = ioctl(kvm->vm_fd, KVM_IOSIGNALFD, &data);
+	if (r == -1)
+		r = -errno;
+	return r;
+}
+
+#else /* KVM_CAP_IOSIGNALFD */
+
+int kvm_assign_iosignalfd(kvm_context_t kvm, unsigned long addr, size_t len,
+			  int fd, void *trigger, int flags)
+{
+	return -ENOSYS;
+}
+
+int kvm_deassign_iosignalfd(kvm_context_t kvm, unsigned long addr, int fd,
+			    int flags)
+{
+	return -ENOSYS;
+}
+
+#endif /* KVM_CAP_IOSIGNALFD */
+
+
+
diff --git a/kvm/libkvm/libkvm.h b/kvm/libkvm/libkvm.h
index aca8ed6..65fbe2a 100644
--- a/kvm/libkvm/libkvm.h
+++ b/kvm/libkvm/libkvm.h
@@ -870,6 +870,48 @@ int kvm_get_irq_route_gsi(kvm_context_t kvm);
  */
 int kvm_irqfd(kvm_context_t kvm, int gsi, int flags);
 
+enum {
+	iosignalfd_option_pio,
+};
+
+#define IOSIGNALFD_FLAG_PIO    (1 << iosignalfd_option_pio)
+
+/*!
+ * \brief Assign an eventfd to an IO port (PIO or MMIO)
+ *
+ * Assigns an eventfd based file-descriptor to a specific PIO or MMIO
+ * address range.  Any guest writes to the specified range will generate
+ * an eventfd signal.
+ *
+ * A data-match pointer can be optionally provided in "trigger" and only
+ * writes which match this value exactly will generate an event.  The length
+ * of the trigger is established by the length of the overall IO range, and
+ * therefore must be in a natural byte-width for the IO routines of your
+ * particular architecture (e.g. 1, 2, 4, or 8 bytes on x86_64).
+ *
+ * \param kvm Pointer to the current kvm_context
+ * \param addr The IO address
+ * \param len The length of the IO region at the address
+ * \param fd The eventfd file-descriptor
+ * \param trigger A optional pointer providing data-match token
+ * \param flags FLAG_PIO: PIO, else MMIO
+ */
+int kvm_assign_iosignalfd(kvm_context_t kvm, unsigned long addr, size_t len,
+			  int fd, void *trigger, int flags);
+
+/*!
+ * \brief Deassign an iosignalfd from a previously registered IO port
+ *
+ * Deassigns an iosignalfd previously registered with kvm_assign_iosignalfd()
+ *
+ * \param kvm Pointer to the current kvm_context
+ * \param addr The IO address to deassign
+ * \param fd The eventfd file-descriptor
+ * \param flags FLAG_PIO: PIO, else MMIO
+ */
+int kvm_deassign_iosignalfd(kvm_context_t kvm, unsigned long addr,
+			    int fd, int flags);
+
 #ifdef KVM_CAP_DEVICE_MSIX
 int kvm_assign_set_msix_nr(kvm_context_t kvm,
 			   struct kvm_assigned_msix_nr *msix_nr);


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2009-06-03 20:30 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-03 20:30 [PATCH v3] qemu-kvm: add iosignalfd support Gregory Haskins

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.