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