[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