]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Add is_pio flag to ioeventfd__add_event
authorAsias He <asias.hejun@gmail.com>
Sat, 7 Apr 2012 22:47:17 +0000 (06:47 +0800)
committerPekka Enberg <penberg@kernel.org>
Mon, 9 Apr 2012 08:34:46 +0000 (11:34 +0300)
Add is_pio flag to set KVM_IOEVENTFD_FLAG_PIO. This is useful for
attaching an ioeventfd to MMIO address as well as PIO address.
virtio-mmio needs an ioeventfd to MMIO address.

Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/include/kvm/ioeventfd.h
tools/kvm/ioeventfd.c
tools/kvm/virtio/pci.c

index ec70aa547a5ae9090f91e306100f2448e292b45c..70cce9aa4304086c014f1d323dd98e7f9a91ca30 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/types.h>
 #include <linux/list.h>
 #include <sys/eventfd.h>
+#include "kvm/util.h"
 
 struct kvm;
 
@@ -21,7 +22,7 @@ struct ioevent {
 
 int ioeventfd__init(struct kvm *kvm);
 int ioeventfd__exit(struct kvm *kvm);
-int ioeventfd__add_event(struct ioevent *ioevent);
+int ioeventfd__add_event(struct ioevent *ioevent, bool is_pio);
 int ioeventfd__del_event(u64 addr, u64 datamatch);
 
 #endif
index 9b328cdae96c4c88e6dbba89a5f9779e04df6d27..97deb06cb2f8a9cae4712c80d4416bd669a3e8e9 100644 (file)
@@ -117,7 +117,7 @@ int ioeventfd__exit(struct kvm *kvm)
        return 0;
 }
 
-int ioeventfd__add_event(struct ioevent *ioevent)
+int ioeventfd__add_event(struct ioevent *ioevent, bool is_pio)
 {
        struct kvm_ioeventfd kvm_ioevent;
        struct epoll_event epoll_event;
@@ -135,13 +135,16 @@ int ioeventfd__add_event(struct ioevent *ioevent)
        event = new_ioevent->fd;
 
        kvm_ioevent = (struct kvm_ioeventfd) {
-               .addr                   = ioevent->io_addr,
-               .len                    = ioevent->io_len,
-               .datamatch              = ioevent->datamatch,
-               .fd                     = event,
-               .flags                  = KVM_IOEVENTFD_FLAG_PIO | KVM_IOEVENTFD_FLAG_DATAMATCH,
+               .addr           = ioevent->io_addr,
+               .len            = ioevent->io_len,
+               .datamatch      = ioevent->datamatch,
+               .fd             = event,
+               .flags          = KVM_IOEVENTFD_FLAG_DATAMATCH,
        };
 
+       if (is_pio)
+               kvm_ioevent.flags |= KVM_IOEVENTFD_FLAG_PIO;
+
        r = ioctl(ioevent->fn_kvm->vm_fd, KVM_IOEVENTFD, &kvm_ioevent);
        if (r) {
                r = -errno;
@@ -149,8 +152,8 @@ int ioeventfd__add_event(struct ioevent *ioevent)
        }
 
        epoll_event = (struct epoll_event) {
-               .events                 = EPOLLIN,
-               .data.ptr               = new_ioevent,
+               .events         = EPOLLIN,
+               .data.ptr       = new_ioevent,
        };
 
        r = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, event, &epoll_event);
index 5a3cad886cbb6f33b1c8d10c91fecf133370a090..529e30dbd73e272c6a6ed0595b85cc7c74451784 100644 (file)
@@ -52,7 +52,7 @@ static int virtio_pci__init_ioeventfd(struct kvm *kvm, struct virtio_trans *vtra
                .fd             = eventfd(0, 0),
        };
 
-       r = ioeventfd__add_event(&ioevent);
+       r = ioeventfd__add_event(&ioevent, true);
        if (r)
                return r;