#include <linux/types.h>
#include <linux/list.h>
#include <sys/eventfd.h>
+#include "kvm/util.h"
struct kvm;
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
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;
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;
}
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);