On 11/18/2011 07:50 AM, zanghongy...@huawei.com wrote: > From: Hongyong Zang <zanghongy...@huawei.com> > > This patch, adds a PIO BAR3 for guest notifying qemu. And we find the new > notification way of PIO BAR3 reduces 30% time in comparison with the original > MMIO BAR0 way.
Please update the spec, and split the patch into an infrastructure patch (for long eventfds in the memory API) and an ivshmem patch. > > //#define DEBUG_IVSHMEM > #ifdef DEBUG_IVSHMEM > @@ -57,8 +58,10 @@ typedef struct IVShmemState { > CharDriverState **eventfd_chr; > CharDriverState *server_chr; > MemoryRegion ivshmem_mmio; > + MemoryRegion ivshmem_pio; > > pcibus_t mmio_addr; > + pcibus_t pio_addr; > /* We might need to register the BAR before we actually have the memory. > * So prepare a container MemoryRegion for the BAR immediately and > * add a subregion when we have the memory. > @@ -234,7 +237,7 @@ static uint64_t ivshmem_io_read(void *opaque, > target_phys_addr_t addr, > return ret; > } > > -static const MemoryRegionOps ivshmem_mmio_ops = { > +static const MemoryRegionOps ivshmem_io_ops = { > .read = ivshmem_io_read, > .write = ivshmem_io_write, > .endianness = DEVICE_NATIVE_ENDIAN, > @@ -348,6 +351,8 @@ static void close_guest_eventfds(IVShmemState *s, int > posn) > 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_pio_long(s->peers[posn].eventfds[i], > + s->pio_addr + DOORBELL, (posn << 16) | i, 0); This really shouldn't be needed - the memory API should take care of it. > close(s->peers[posn].eventfds[i]); > } > > @@ -367,6 +372,12 @@ static void setup_ioeventfds(IVShmemState *s) { > true, > (i << 16) | j, > s->peers[i].eventfds[j]); > + memory_region_add_eventfd(&s->ivshmem_pio, > + DOORBELL, > + 4, > + true, > + (i << 16) | j, > + s->peers[i].eventfds[j]); > } > } Where is the memory API support for this? > } > @@ -495,6 +506,10 @@ static void ivshmem_read(void *opaque, const uint8_t * > buf, int flags) > (incoming_posn << 16) | guest_max_eventfd, 1) < 0) { > fprintf(stderr, "ivshmem: ioeventfd not available\n"); > } > + if (kvm_set_ioeventfd_pio_long(incoming_fd, s->pio_addr + DOORBELL, > + (incoming_posn << 16) | guest_max_eventfd, 1) < 0) { > + fprintf(stderr, "ivshmem: ioeventfd not available\n"); > + } > } Nor should this be needed. Please make BAR 3 disappear if started with -M pc-1.0. -- error compiling committee.c: too many arguments to function -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html