----- Original Message ----- > We use a 2 byte ioeventfd for virtio memory, > add support for this. > > Signed-off-by: Michael S. Tsirkin <m...@redhat.com>
Reviewed-by: Amos Kong <ak...@redhat.com> > --- > hw/ivshmem.c | 8 ++++---- > kvm-all.c | 15 ++++++++------- > kvm-stub.c | 2 +- > kvm.h | 3 ++- > 4 files changed, 15 insertions(+), 13 deletions(-) > > diff --git a/hw/ivshmem.c b/hw/ivshmem.c > index 5ebf840..f02530c 100644 > --- a/hw/ivshmem.c > +++ b/hw/ivshmem.c > @@ -354,8 +354,8 @@ static void close_guest_eventfds(IVShmemState *s, > int posn) > guest_curr_max = s->peers[posn].nb_eventfds; > > for (i = 0; i < guest_curr_max; i++) { > - kvm_set_ioeventfd_mmio_long(s->peers[posn].eventfds[i], > - s->mmio_addr + DOORBELL, (posn << 16) | i, 0); > + kvm_set_ioeventfd_mmio(s->peers[posn].eventfds[i], > + s->mmio_addr + DOORBELL, (posn << 16) | i, 0, > 4); > close(s->peers[posn].eventfds[i]); > } > > @@ -500,8 +500,8 @@ static void ivshmem_read(void *opaque, const > uint8_t * buf, int flags) > } > > if (ivshmem_has_feature(s, IVSHMEM_IOEVENTFD)) { > - if (kvm_set_ioeventfd_mmio_long(incoming_fd, s->mmio_addr + > DOORBELL, > - (incoming_posn << 16) | guest_max_eventfd, > 1) < 0) { > + if (kvm_set_ioeventfd_mmio(incoming_fd, s->mmio_addr + > DOORBELL, > + (incoming_posn << 16) | guest_max_eventfd, > 1, 4) < 0) { > fprintf(stderr, "ivshmem: ioeventfd not available\n"); > } > } > diff --git a/kvm-all.c b/kvm-all.c > index 42e5e23..bcf0dbe 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -744,10 +744,10 @@ static void > kvm_mem_ioeventfd_add(MemoryRegionSection *section, > { > int r; > > - assert(match_data && section->size == 4); > + assert(match_data && section->size <= 8); > > - r = kvm_set_ioeventfd_mmio_long(fd, > section->offset_within_address_space, > - data, true); > + r = kvm_set_ioeventfd_mmio(fd, > section->offset_within_address_space, > + data, true, section->size); > if (r < 0) { > abort(); > } > @@ -758,8 +758,8 @@ static void > kvm_mem_ioeventfd_del(MemoryRegionSection *section, > { > int r; > > - r = kvm_set_ioeventfd_mmio_long(fd, > section->offset_within_address_space, > - data, false); > + r = kvm_set_ioeventfd_mmio(fd, > section->offset_within_address_space, > + data, false, section->size); > if (r < 0) { > abort(); > } > @@ -1639,14 +1639,15 @@ int kvm_set_signal_mask(CPUArchState *env, > const sigset_t *sigset) > return r; > } > > -int kvm_set_ioeventfd_mmio_long(int fd, uint32_t addr, uint32_t val, > bool assign) > +int kvm_set_ioeventfd_mmio(int fd, uint32_t addr, uint32_t val, bool > assign, > + uint32_t size) > { > int ret; > struct kvm_ioeventfd iofd; > > iofd.datamatch = val; > iofd.addr = addr; > - iofd.len = 4; > + iofd.len = size; > iofd.flags = KVM_IOEVENTFD_FLAG_DATAMATCH; > iofd.fd = fd; > > diff --git a/kvm-stub.c b/kvm-stub.c > index 69a1228..0d426db 100644 > --- a/kvm-stub.c > +++ b/kvm-stub.c > @@ -120,7 +120,7 @@ int kvm_set_ioeventfd_pio_word(int fd, uint16_t > addr, uint16_t val, bool assign) > return -ENOSYS; > } > > -int kvm_set_ioeventfd_mmio_long(int fd, uint32_t adr, uint32_t val, > bool assign) > +int kvm_set_ioeventfd_mmio(int fd, uint32_t adr, uint32_t val, bool > assign, uint32_t len) > { > return -ENOSYS; > } > diff --git a/kvm.h b/kvm.h > index 330f17b..9bdbdb0 100644 > --- a/kvm.h > +++ b/kvm.h > @@ -210,7 +210,8 @@ int kvm_physical_memory_addr_from_host(KVMState > *s, void *ram_addr, > #endif > > #endif > -int kvm_set_ioeventfd_mmio_long(int fd, uint32_t adr, uint32_t val, > bool assign); > +int kvm_set_ioeventfd_mmio(int fd, uint32_t adr, uint32_t val, bool > assign, > + uint32_t size); > > int kvm_set_ioeventfd_pio_word(int fd, uint16_t adr, uint16_t val, > bool assign); > #endif > -- > 1.7.9.111.gf3fb0 > >