memory: pass EventNotifier, not eventfd
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 <pbonzini@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
parent
b6a1f3a569
commit
753d5e14c4
8
exec.c
8
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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
19
kvm-all.c
19
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
18
memory.c
18
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;
|
||||
|
||||
|
9
memory.h
9
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.
|
||||
*
|
||||
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user