Re: [Qemu-devel] [PATCH v2] ivshmem: add a new PIO BAR3(Doorbell) besides MMIO BAR0 to reduce notification time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/18/2011 07:50 AM, zanghongyong@xxxxxxxxxx wrote:
> From: Hongyong Zang <zanghongyong@xxxxxxxxxx>
>
> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux