Under Win32, EventNotifiers will not have event_notifier_get_fd, so we cannot call it in common code such as hw/virtio-pci.c. Pass a pointer to the notifier, and only retrieve the file descriptor in kvm-specific code.
Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- exec.c | 8 ++++---- hw/ivshmem.c | 4 ++-- hw/vhost.c | 4 ++-- hw/virtio-pci.c | 4 ++-- hw/xen_pt.c | 2 +- kvm-all.c | 19 +++++++++++++------ memory.c | 18 +++++++++--------- memory.h | 9 +++++---- xen-all.c | 6 ++++-- 9 files changed, 42 insertions(+), 32 deletions(-) diff --git a/exec.c b/exec.c index 8244d54..29b5078 100644 --- a/exec.c +++ b/exec.c @@ -3212,13 +3212,13 @@ static void core_log_global_stop(MemoryListener *listener) static void core_eventfd_add(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, EventNotifier *e) { } static void core_eventfd_del(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, EventNotifier *e) { } @@ -3278,13 +3278,13 @@ static void io_log_global_stop(MemoryListener *listener) static void io_eventfd_add(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, EventNotifier *e) { } static void io_eventfd_del(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, EventNotifier *e) { } diff --git a/hw/ivshmem.c b/hw/ivshmem.c index 19e164a..bba21c5 100644 --- a/hw/ivshmem.c +++ b/hw/ivshmem.c @@ -350,7 +350,7 @@ static void ivshmem_add_eventfd(IVShmemState *s, int posn, int i) 4, true, (posn << 16) | i, - event_notifier_get_fd(&s->peers[posn].eventfds[i])); + &s->peers[posn].eventfds[i]); } static void ivshmem_del_eventfd(IVShmemState *s, int posn, int i) @@ -360,7 +360,7 @@ static void ivshmem_del_eventfd(IVShmemState *s, int posn, int i) 4, true, (posn << 16) | i, - event_notifier_get_fd(&s->peers[posn].eventfds[i])); + &s->peers[posn].eventfds[i]); } static void close_guest_eventfds(IVShmemState *s, int posn) diff --git a/hw/vhost.c b/hw/vhost.c index 43664e7..0fd8da8 100644 --- a/hw/vhost.c +++ b/hw/vhost.c @@ -737,13 +737,13 @@ static void vhost_virtqueue_cleanup(struct vhost_dev *dev, static void vhost_eventfd_add(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, EventNotifier *e) { } static void vhost_eventfd_del(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, EventNotifier *e) { } diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 9342eed..a555728 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -174,10 +174,10 @@ static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy, return r; } memory_region_add_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2, - true, n, event_notifier_get_fd(notifier)); + true, n, notifier); } else { memory_region_del_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2, - true, n, event_notifier_get_fd(notifier)); + true, n, notifier); /* Handle the race condition where the guest kicked and we deassigned * before we got around to handling the kick. */ diff --git a/hw/xen_pt.c b/hw/xen_pt.c index 3b6d186..fdf68aa 100644 --- a/hw/xen_pt.c +++ b/hw/xen_pt.c @@ -634,7 +634,7 @@ static void xen_pt_log_global_fns(MemoryListener *l) } static void xen_pt_eventfd_fns(MemoryListener *l, MemoryRegionSection *s, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, EventNotifier *n) { } diff --git a/kvm-all.c b/kvm-all.c index f8e4328..56f723e 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -32,6 +32,7 @@ #include "bswap.h" #include "memory.h" #include "exec-memory.h" +#include "event_notifier.h" /* This check must be after config-host.h is included */ #ifdef CONFIG_EVENTFD @@ -800,23 +801,29 @@ static void kvm_io_ioeventfd_del(MemoryRegionSection *section, static void kvm_eventfd_add(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, + EventNotifier *e) { if (section->address_space == get_system_memory()) { - kvm_mem_ioeventfd_add(section, match_data, data, fd); + kvm_mem_ioeventfd_add(section, match_data, data, + event_notifier_get_fd(e)); } else { - kvm_io_ioeventfd_add(section, match_data, data, fd); + kvm_io_ioeventfd_add(section, match_data, data, + event_notifier_get_fd(e)); } } static void kvm_eventfd_del(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, + EventNotifier *e) { if (section->address_space == get_system_memory()) { - kvm_mem_ioeventfd_del(section, match_data, data, fd); + kvm_mem_ioeventfd_del(section, match_data, data, + event_notifier_get_fd(e)); } else { - kvm_io_ioeventfd_del(section, match_data, data, fd); + kvm_io_ioeventfd_del(section, match_data, data, + event_notifier_get_fd(e)); } } diff --git a/memory.c b/memory.c index aab4a31..643871b 100644 --- a/memory.c +++ b/memory.c @@ -156,7 +156,7 @@ struct MemoryRegionIoeventfd { AddrRange addr; bool match_data; uint64_t data; - int fd; + EventNotifier *e; }; static bool memory_region_ioeventfd_before(MemoryRegionIoeventfd a, @@ -181,9 +181,9 @@ static bool memory_region_ioeventfd_before(MemoryRegionIoeventfd a, return false; } } - if (a.fd < b.fd) { + if (a.e < b.e) { return true; - } else if (a.fd > b.fd) { + } else if (a.e > b.e) { return false; } return false; @@ -597,7 +597,7 @@ static void address_space_add_del_ioeventfds(AddressSpace *as, .size = int128_get64(fd->addr.size), }; MEMORY_LISTENER_CALL(eventfd_del, Forward, §ion, - fd->match_data, fd->data, fd->fd); + fd->match_data, fd->data, fd->e); ++iold; } else if (inew < fds_new_nb && (iold == fds_old_nb @@ -610,7 +610,7 @@ static void address_space_add_del_ioeventfds(AddressSpace *as, .size = int128_get64(fd->addr.size), }; MEMORY_LISTENER_CALL(eventfd_add, Reverse, §ion, - fd->match_data, fd->data, fd->fd); + fd->match_data, fd->data, fd->e); ++inew; } else { ++iold; @@ -1195,14 +1195,14 @@ void memory_region_add_eventfd(MemoryRegion *mr, unsigned size, bool match_data, uint64_t data, - int fd) + EventNotifier *e) { MemoryRegionIoeventfd mrfd = { .addr.start = int128_make64(addr), .addr.size = int128_make64(size), .match_data = match_data, .data = data, - .fd = fd, + .e = e, }; unsigned i; @@ -1225,14 +1225,14 @@ void memory_region_del_eventfd(MemoryRegion *mr, unsigned size, bool match_data, uint64_t data, - int fd) + EventNotifier *e) { MemoryRegionIoeventfd mrfd = { .addr.start = int128_make64(addr), .addr.size = int128_make64(size), .match_data = match_data, .data = data, - .fd = fd, + .e = e, }; unsigned i; diff --git a/memory.h b/memory.h index 740c48e..bd1bbae 100644 --- a/memory.h +++ b/memory.h @@ -198,9 +198,9 @@ struct MemoryListener { void (*log_global_start)(MemoryListener *listener); void (*log_global_stop)(MemoryListener *listener); void (*eventfd_add)(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd); + bool match_data, uint64_t data, EventNotifier *e); void (*eventfd_del)(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd); + bool match_data, uint64_t data, EventNotifier *e); /* Lower = earlier (during add), later (during del) */ unsigned priority; MemoryRegion *address_space_filter; @@ -541,7 +541,7 @@ void memory_region_add_eventfd(MemoryRegion *mr, unsigned size, bool match_data, uint64_t data, - int fd); + EventNotifier *e); /** * memory_region_del_eventfd: Cancel an eventfd. @@ -561,7 +561,8 @@ void memory_region_del_eventfd(MemoryRegion *mr, unsigned size, bool match_data, uint64_t data, - int fd); + EventNotifier *e); + /** * memory_region_add_subregion: Add a subregion to a container. * diff --git a/xen-all.c b/xen-all.c index 59f2323..61def2e 100644 --- a/xen-all.c +++ b/xen-all.c @@ -560,13 +560,15 @@ static void xen_log_global_stop(MemoryListener *listener) static void xen_eventfd_add(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, + EventNotifier *e) { } static void xen_eventfd_del(MemoryListener *listener, MemoryRegionSection *section, - bool match_data, uint64_t data, int fd) + bool match_data, uint64_t data, + EventNotifier *e) { } -- 1.7.10.2