qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2] ivshmem: add a new PIO BAR3(Doorbell) beside


From: Avi Kivity
Subject: Re: [Qemu-devel] [PATCH v2] ivshmem: add a new PIO BAR3(Doorbell) besides MMIO BAR0 to reduce notification time
Date: Sun, 20 Nov 2011 11:27:31 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1

On 11/18/2011 07:50 AM, address@hidden wrote:
> From: Hongyong Zang <address@hidden>
>
> 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]