libvhost-user: Simplify VHOST_USER_REM_MEM_REG
Let's avoid having to manually copy all elements. Copy only the ones necessary to close the hole and perform the operation in-place without a second array. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Signed-off-by: Raphael Norwitz <raphael.norwitz@nutanix.com> Message-Id: <20220117041050.19718-4-raphael.norwitz@nutanix.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
9f4e63491b
commit
4fd5ca829a
@ -811,10 +811,8 @@ static inline bool reg_equal(VuDevRegion *vudev_reg,
|
||||
|
||||
static bool
|
||||
vu_rem_mem_reg(VuDev *dev, VhostUserMsg *vmsg) {
|
||||
int i, j;
|
||||
bool found = false;
|
||||
VuDevRegion shadow_regions[VHOST_USER_MAX_RAM_SLOTS] = {};
|
||||
VhostUserMemoryRegion m = vmsg->payload.memreg.region, *msg_region = &m;
|
||||
int i;
|
||||
|
||||
if (vmsg->fd_num != 1) {
|
||||
vmsg_close_fds(vmsg);
|
||||
@ -841,28 +839,28 @@ vu_rem_mem_reg(VuDev *dev, VhostUserMsg *vmsg) {
|
||||
DPRINT(" mmap_offset 0x%016"PRIx64"\n",
|
||||
msg_region->mmap_offset);
|
||||
|
||||
for (i = 0, j = 0; i < dev->nregions; i++) {
|
||||
if (!reg_equal(&dev->regions[i], msg_region)) {
|
||||
shadow_regions[j].gpa = dev->regions[i].gpa;
|
||||
shadow_regions[j].size = dev->regions[i].size;
|
||||
shadow_regions[j].qva = dev->regions[i].qva;
|
||||
shadow_regions[j].mmap_addr = dev->regions[i].mmap_addr;
|
||||
shadow_regions[j].mmap_offset = dev->regions[i].mmap_offset;
|
||||
j++;
|
||||
} else {
|
||||
found = true;
|
||||
for (i = 0; i < dev->nregions; i++) {
|
||||
if (reg_equal(&dev->regions[i], msg_region)) {
|
||||
VuDevRegion *r = &dev->regions[i];
|
||||
void *m = (void *) (uintptr_t) r->mmap_addr;
|
||||
|
||||
if (m) {
|
||||
munmap(m, r->size + r->mmap_offset);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (found) {
|
||||
memcpy(dev->regions, shadow_regions,
|
||||
sizeof(VuDevRegion) * VHOST_USER_MAX_RAM_SLOTS);
|
||||
if (i < dev->nregions) {
|
||||
/*
|
||||
* Shift all affected entries by 1 to close the hole at index i and
|
||||
* zero out the last entry.
|
||||
*/
|
||||
memmove(dev->regions + i, dev->regions + i + 1,
|
||||
sizeof(VuDevRegion) * (dev->nregions - i - 1));
|
||||
memset(dev->regions + dev->nregions - 1, 0,
|
||||
sizeof(VuDevRegion));
|
||||
DPRINT("Successfully removed a region\n");
|
||||
dev->nregions--;
|
||||
vmsg_set_reply_u64(vmsg, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user