2015-12-04 22:20 GMT+09:00 Marc-André Lureau <marcandre.lur...@gmail.com>: > Hi > > On Fri, Dec 4, 2015 at 4:52 AM, Tetsuya Mukawa <muk...@igel.co.jp> 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 <muk...@igel.co.jp> >> --- >> 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