From: Asias He Date: Sat, 7 Apr 2012 22:47:17 +0000 (+0800) Subject: kvm tools: Add is_pio flag to ioeventfd__add_event X-Git-Tag: next-20120411~5^2~13 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=1091610e3bff422b4f515a7f033f5fbe77b6bebd;p=karo-tx-linux.git kvm tools: Add is_pio flag to ioeventfd__add_event 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 Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/include/kvm/ioeventfd.h b/tools/kvm/include/kvm/ioeventfd.h index ec70aa547a5a..70cce9aa4304 100644 --- a/tools/kvm/include/kvm/ioeventfd.h +++ b/tools/kvm/include/kvm/ioeventfd.h @@ -4,6 +4,7 @@ #include #include #include +#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 diff --git a/tools/kvm/ioeventfd.c b/tools/kvm/ioeventfd.c index 9b328cdae96c..97deb06cb2f8 100644 --- a/tools/kvm/ioeventfd.c +++ b/tools/kvm/ioeventfd.c @@ -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); diff --git a/tools/kvm/virtio/pci.c b/tools/kvm/virtio/pci.c index 5a3cad886cbb..529e30dbd73e 100644 --- a/tools/kvm/virtio/pci.c +++ b/tools/kvm/virtio/pci.c @@ -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;