qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] ivshmem: Store file descriptor for vhost-user n


From: Tetsuya Mukawa
Subject: Re: [Qemu-devel] [PATCH] ivshmem: Store file descriptor for vhost-user negotiation
Date: Fri, 4 Dec 2015 23:55:13 +0900

2015-12-04 22:20 GMT+09:00 Marc-André Lureau <address@hidden>:
> Hi
>
> On Fri, Dec 4, 2015 at 4:52 AM, Tetsuya Mukawa <address@hidden> wrote:
>> If virtio-net driver allocates memory in vishmem shared memory,
>
> s/vishmem/ivshmem

Thanks, I will fix it.

>
> How can virtio-net allocate memory in ivshmem memory bar?
>
> What's the use case or test case?

One of example is userspace device driver like DPDK PMD.
Actually, I've found this fd related behavior using DPDK virtio-net PMD.
Could you please check below to know my use case more?
http://thread.gmane.org/gmane.comp.networking.dpdk.devel/28467/focus=28493

Tetsuya,

>
>> vhost-net will work correctly, but vhost-user will not work because
>> a fd of shared memory will not be sent to vhost-user backend.
>> This patch fixes ivshmem to store file descriptor of shared memory.
>> It will be used when vhost-user negotiates vhost-user backend.
>>
>> Signed-off-by: Tetsuya Mukawa <address@hidden>
>> ---
>>  exec.c                  | 10 ++++++++++
>>  hw/misc/ivshmem.c       |  9 +++++++--
>>  include/exec/ram_addr.h |  1 +
>>  3 files changed, 18 insertions(+), 2 deletions(-)
>>
>> diff --git a/exec.c b/exec.c
>> index 0bf0a6e..908c4bf 100644
>> --- a/exec.c
>> +++ b/exec.c
>> @@ -1796,6 +1796,16 @@ int qemu_get_ram_fd(ram_addr_t addr)
>>      return fd;
>>  }
>>
>> +void qemu_set_ram_fd(ram_addr_t addr, int fd)
>> +{
>> +    RAMBlock *block;
>> +
>> +    rcu_read_lock();
>> +    block = qemu_get_ram_block(addr);
>> +    block->fd = fd;
>> +    rcu_read_unlock();
>> +}
>> +
>>  void *qemu_get_ram_block_host_ptr(ram_addr_t addr)
>>  {
>>      RAMBlock *block;
>> diff --git a/hw/misc/ivshmem.c b/hw/misc/ivshmem.c
>> index f73f0c2..df585de 100644
>> --- a/hw/misc/ivshmem.c
>> +++ b/hw/misc/ivshmem.c
>> @@ -29,6 +29,7 @@
>>  #include "sysemu/char.h"
>>  #include "sysemu/hostmem.h"
>>  #include "qapi/visitor.h"
>> +#include "exec/ram_addr.h"
>>
>>  #include "hw/misc/ivshmem.h"
>>
>> @@ -422,6 +423,7 @@ static int create_shared_memory_BAR(IVShmemState *s, int 
>> fd, uint8_t attr,
>>
>>      memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s), "ivshmem.bar2",
>>                                 s->ivshmem_size, ptr);
>> +    qemu_set_ram_fd(s->ivshmem.ram_addr, fd);
>>      vmstate_register_ram(&s->ivshmem, DEVICE(s));
>>      memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
>>
>> @@ -682,6 +684,7 @@ static void ivshmem_read(void *opaque, const uint8_t 
>> *buf, int size)
>>          }
>>          memory_region_init_ram_ptr(&s->ivshmem, OBJECT(s),
>>                                     "ivshmem.bar2", s->ivshmem_size, 
>> map_ptr);
>> +        qemu_set_ram_fd(s->ivshmem.ram_addr, incoming_fd);
>>          vmstate_register_ram(&s->ivshmem, DEVICE(s));
>>
>>          IVSHMEM_DPRINTF("guest h/w addr = %p, size = %" PRIu64 "\n",
>> @@ -689,7 +692,6 @@ static void ivshmem_read(void *opaque, const uint8_t 
>> *buf, int size)
>>
>>          memory_region_add_subregion(&s->bar, 0, &s->ivshmem);
>>
>> -        close(incoming_fd);
>>          return;
>>      }
>>
>> @@ -991,7 +993,6 @@ static void pci_ivshmem_realize(PCIDevice *dev, Error 
>> **errp)
>>          }
>>
>>          create_shared_memory_BAR(s, fd, attr, errp);
>> -        close(fd);
>>      }
>>  }
>>
>> @@ -1010,11 +1011,15 @@ static void pci_ivshmem_exit(PCIDevice *dev)
>>      if (memory_region_is_mapped(&s->ivshmem)) {
>>          if (!s->hostmem) {
>>              void *addr = memory_region_get_ram_ptr(&s->ivshmem);
>> +            int fd;
>>
>>              if (munmap(addr, s->ivshmem_size) == -1) {
>>                  error_report("Failed to munmap shared memory %s",
>>                               strerror(errno));
>>              }
>> +
>> +            if ((fd = qemu_get_ram_fd(s->ivshmem.ram_addr)) != -1)
>> +                close(fd);
>>          }
>>
>>          vmstate_unregister_ram(&s->ivshmem, DEVICE(dev));
>> diff --git a/include/exec/ram_addr.h b/include/exec/ram_addr.h
>> index 7115154..9ca659a 100644
>> --- a/include/exec/ram_addr.h
>> +++ b/include/exec/ram_addr.h
>> @@ -72,6 +72,7 @@ ram_addr_t qemu_ram_alloc_resizeable(ram_addr_t size, 
>> ram_addr_t max_size,
>>                                                       void *host),
>>                                       MemoryRegion *mr, Error **errp);
>>  int qemu_get_ram_fd(ram_addr_t addr);
>> +void qemu_set_ram_fd(ram_addr_t addr, int fd);
>>  void *qemu_get_ram_block_host_ptr(ram_addr_t addr);
>>  void *qemu_get_ram_ptr(ram_addr_t addr);
>>  void qemu_ram_free(ram_addr_t addr);
>> --
>> 2.1.4
>>
>>
>
>
>
> --
> Marc-André Lureau



reply via email to

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