[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4] vhost: set used memslots for vhost-user and
From: |
Zhoujian (jay) |
Subject: |
Re: [Qemu-devel] [PATCH v4] vhost: set used memslots for vhost-user and vhost-kernel respectively |
Date: |
Sat, 30 Dec 2017 06:22:15 +0000 |
> -----Original Message-----
> From: Zhoujian (jay)
> Sent: Saturday, December 30, 2017 3:06 AM
> To: address@hidden
> Cc: address@hidden; address@hidden; Huangweidong (C)
> <address@hidden>; wangxin (U) <address@hidden>;
> Gonglei (Arei) <address@hidden>; Zhoujian (jay)
> <address@hidden>; Liuzhe (Cloud Open Labs, NFV)
> <address@hidden>
> Subject: [PATCH v4] vhost: set used memslots for vhost-user and vhost-
> kernel respectively
>
> Used_memslots is equal to dev->mem->nregions now, it is true for vhost
> kernel, but not for vhost user, which uses the memory regions that have
> file descriptor. In fact, not all of the memory regions have file
> descriptor.
> It is usefully in some scenarios, e.g. used_memslots is 8, and only
> 5 memory slots can be used by vhost user, it is failed to hotplug a new
> DIMM memory because vhost_has_free_slot just returned false, however we
> can hotplug it safely in fact.
>
> Meanwhile, instead of asserting in vhost_user_set_mem_table(), error
> number is used to gracefully prevent device to start. This fixed the VM
> crash issue.
>
> Suggested-by: Igor Mammedov <address@hidden>
> Signed-off-by: Jay Zhou <address@hidden>
> Signed-off-by: Zhe Liu <address@hidden>
The email address of liuzhe will be updated to address@hidden
[...]
>
> +static int vhost_user_prepare_msg(struct vhost_dev *dev, VhostUserMemory
> *mem,
> + int *fds) {
> + int i, fd;
> +
Sorry about forgetting to add "vhost_user_free_memslots = true;" here.
Indeed, it is necessary. If vhost_user_free_memslots is false now,
it will be true if we hot-unplug some DIMMs, will resend v4.
Regards,
Jay
> + for (i = 0, mem->nregions = 0; i < dev->mem->nregions; ++i) {
> + struct vhost_memory_region *reg = dev->mem->regions + i;
> + ram_addr_t offset;
> + MemoryRegion *mr;
> +
> + 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);
> + if (fd > 0) {
> + if (mem->nregions == VHOST_MEMORY_MAX_NREGIONS) {
> + vhost_user_free_memslots = false;
> + return -1;
> + }
> +
> + mem->regions[mem->nregions].userspace_addr = reg-
> >userspace_addr;
> + mem->regions[mem->nregions].memory_size = reg->memory_size;
> + mem->regions[mem->nregions].guest_phys_addr = reg-
> >guest_phys_addr;
> + mem->regions[mem->nregions].mmap_offset = offset;
> + fds[mem->nregions++] = fd;
> + }
> + }
> +
> + return 0;
> +}
> +
[...]