Hi

On Thu, May 21, 2020 at 7:00 AM Raphael Norwitz <raphael.norw...@nutanix.com>
wrote:

> When setting the memory tables, qemu uses a memory region's userspace
> address to look up the region's MemoryRegion struct. Among other things,
> the MemoryRegion contains the region's offset and associated file
> descriptor, all of which need to be sent to the backend.
>
> With VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS, this logic will be
> needed in multiple places, so before feature support is added it
> should be moved to a helper function.
>
> This helper is also used to simplify the vhost_user_can_merge()
> function.
>
> Signed-off-by: Raphael Norwitz <raphael.norw...@nutanix.com>
>

Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com>

---
>  hw/virtio/vhost-user.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)
>
> diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
> index 2e0552d..442b0d6 100644
> --- a/hw/virtio/vhost-user.c
> +++ b/hw/virtio/vhost-user.c
> @@ -407,6 +407,18 @@ static int vhost_user_set_log_base(struct vhost_dev
> *dev, uint64_t base,
>      return 0;
>  }
>
> +static MemoryRegion *vhost_user_get_mr_data(uint64_t addr, ram_addr_t
> *offset,
> +                                            int *fd)
> +{
> +    MemoryRegion *mr;
> +
> +    assert((uintptr_t)addr == addr);
> +    mr = memory_region_from_host((void *)(uintptr_t)addr, offset);
> +    *fd = memory_region_get_fd(mr);
> +
> +    return mr;
> +}
> +
>  static void vhost_user_fill_msg_region(VhostUserMemoryRegion *dst,
>                                         struct vhost_memory_region *src)
>  {
> @@ -433,10 +445,7 @@ static int vhost_user_fill_set_mem_table_msg(struct
> vhost_user *u,
>      for (i = 0; i < dev->mem->nregions; ++i) {
>          reg = dev->mem->regions + i;
>
> -        assert((uintptr_t)reg->userspace_addr == reg->userspace_addr);
> -        mr = memory_region_from_host((void
> *)(uintptr_t)reg->userspace_addr,
> -                                     &offset);
> -        fd = memory_region_get_fd(mr);
> +        mr = vhost_user_get_mr_data(reg->userspace_addr, &offset, &fd);
>          if (fd > 0) {
>              if (track_ramblocks) {
>                  assert(*fd_num < VHOST_MEMORY_MAX_NREGIONS);
> @@ -1551,13 +1560,9 @@ static bool vhost_user_can_merge(struct vhost_dev
> *dev,
>  {
>      ram_addr_t offset;
>      int mfd, rfd;
> -    MemoryRegion *mr;
> -
> -    mr = memory_region_from_host((void *)(uintptr_t)start1, &offset);
> -    mfd = memory_region_get_fd(mr);
>
> -    mr = memory_region_from_host((void *)(uintptr_t)start2, &offset);
> -    rfd = memory_region_get_fd(mr);
> +    (void)vhost_user_get_mr_data(start1, &offset, &mfd);
> +    (void)vhost_user_get_mr_data(start2, &offset, &rfd);
>
>      return mfd == rfd;
>  }
> --
> 1.8.3.1
>
>

-- 
Marc-André Lureau

Reply via email to