[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: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH] ivshmem: Store file descriptor for vhost-user negotiation |
Date: |
Fri, 4 Dec 2015 14:20:43 +0100 |
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
How can virtio-net allocate memory in ivshmem memory bar?
What's the use case or test case?
> 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