> -----Original Message----- > From: Zhoujian (jay) > Sent: Saturday, December 30, 2017 3:06 AM > To: qemu-devel@nongnu.org > Cc: m...@redhat.com; imamm...@redhat.com; Huangweidong (C) > <weidong.hu...@huawei.com>; wangxin (U) <wangxinxin.w...@huawei.com>; > Gonglei (Arei) <arei.gong...@huawei.com>; Zhoujian (jay) > <jianjay.z...@huawei.com>; Liuzhe (Cloud Open Labs, NFV) > <gary.liu...@huawei.com> > 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 <imamm...@redhat.com> > Signed-off-by: Jay Zhou <jianjay.z...@huawei.com> > Signed-off-by: Zhe Liu <gary.liu...@huawei.com>
The email address of liuzhe will be updated to liuzh...@huawei.com [...] > > +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; > +} > + [...]