From nobody Sun Oct 26 01:45:00 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1516126566350519.8652787764596; Tue, 16 Jan 2018 10:16:06 -0800 (PST) Received: from localhost ([::1]:52762 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ebVmF-0004SC-Fq for importer@patchew.org; Tue, 16 Jan 2018 13:16:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51536) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ebVdH-0005aA-OX for qemu-devel@nongnu.org; Tue, 16 Jan 2018 13:06:49 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ebVdF-0004ME-TN for qemu-devel@nongnu.org; Tue, 16 Jan 2018 13:06:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46714) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ebVdF-0004Ke-KG for qemu-devel@nongnu.org; Tue, 16 Jan 2018 13:06:45 -0500 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BDD635FD7C for ; Tue, 16 Jan 2018 18:06:44 +0000 (UTC) Received: from dgilbert-t530.redhat.com (ovpn-117-47.ams2.redhat.com [10.36.117.47]) by smtp.corp.redhat.com (Postfix) with ESMTP id 67243609A0; Tue, 16 Jan 2018 18:06:35 +0000 (UTC) From: "Dr. David Alan Gilbert (git)" To: qemu-devel@nongnu.org, mst@redhat.com, imammedo@redhat.com Date: Tue, 16 Jan 2018 18:04:06 +0000 Message-Id: <20180116180408.11279-6-dgilbert@redhat.com> In-Reply-To: <20180116180408.11279-1-dgilbert@redhat.com> References: <20180116180408.11279-1-dgilbert@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 16 Jan 2018 18:06:44 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v6 5/7] vhost: Clean out old vhost_set_memory and friends X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: maxime.coquelin@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "Dr. David Alan Gilbert" Remove the old update mechanism, vhost_set_memory, and the functions and flags it used. Signed-off-by: Dr. David Alan Gilbert --- hw/virtio/vhost.c | 251 ------------------------------------------= ---- include/hw/virtio/vhost.h | 3 - 2 files changed, 254 deletions(-) diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index cf8d5a0a92..37509c489b 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -155,160 +155,6 @@ static void vhost_log_sync_range(struct vhost_dev *de= v, } } =20 -/* Assign/unassign. Keep an unsorted array of non-overlapping - * memory regions in dev->mem. */ -static void vhost_dev_unassign_memory(struct vhost_dev *dev, - uint64_t start_addr, - uint64_t size) -{ - int from, to, n =3D dev->mem->nregions; - /* Track overlapping/split regions for sanity checking. */ - int overlap_start =3D 0, overlap_end =3D 0, overlap_middle =3D 0, spli= t =3D 0; - - for (from =3D 0, to =3D 0; from < n; ++from, ++to) { - struct vhost_memory_region *reg =3D dev->mem->regions + to; - uint64_t reglast; - uint64_t memlast; - uint64_t change; - - /* clone old region */ - if (to !=3D from) { - memcpy(reg, dev->mem->regions + from, sizeof *reg); - } - - /* No overlap is simple */ - if (!ranges_overlap(reg->guest_phys_addr, reg->memory_size, - start_addr, size)) { - continue; - } - - /* Split only happens if supplied region - * is in the middle of an existing one. Thus it can not - * overlap with any other existing region. */ - assert(!split); - - reglast =3D range_get_last(reg->guest_phys_addr, reg->memory_size); - memlast =3D range_get_last(start_addr, size); - - /* Remove whole region */ - if (start_addr <=3D reg->guest_phys_addr && memlast >=3D reglast) { - --dev->mem->nregions; - --to; - ++overlap_middle; - continue; - } - - /* Shrink region */ - if (memlast >=3D reglast) { - reg->memory_size =3D start_addr - reg->guest_phys_addr; - assert(reg->memory_size); - assert(!overlap_end); - ++overlap_end; - continue; - } - - /* Shift region */ - if (start_addr <=3D reg->guest_phys_addr) { - change =3D memlast + 1 - reg->guest_phys_addr; - reg->memory_size -=3D change; - reg->guest_phys_addr +=3D change; - reg->userspace_addr +=3D change; - assert(reg->memory_size); - assert(!overlap_start); - ++overlap_start; - continue; - } - - /* This only happens if supplied region - * is in the middle of an existing one. Thus it can not - * overlap with any other existing region. */ - assert(!overlap_start); - assert(!overlap_end); - assert(!overlap_middle); - /* Split region: shrink first part, shift second part. */ - memcpy(dev->mem->regions + n, reg, sizeof *reg); - reg->memory_size =3D start_addr - reg->guest_phys_addr; - assert(reg->memory_size); - change =3D memlast + 1 - reg->guest_phys_addr; - reg =3D dev->mem->regions + n; - reg->memory_size -=3D change; - assert(reg->memory_size); - reg->guest_phys_addr +=3D change; - reg->userspace_addr +=3D change; - /* Never add more than 1 region */ - assert(dev->mem->nregions =3D=3D n); - ++dev->mem->nregions; - ++split; - } -} - -/* Called after unassign, so no regions overlap the given range. */ -static void vhost_dev_assign_memory(struct vhost_dev *dev, - uint64_t start_addr, - uint64_t size, - uint64_t uaddr) -{ - int from, to; - struct vhost_memory_region *merged =3D NULL; - for (from =3D 0, to =3D 0; from < dev->mem->nregions; ++from, ++to) { - struct vhost_memory_region *reg =3D dev->mem->regions + to; - uint64_t prlast, urlast; - uint64_t pmlast, umlast; - uint64_t s, e, u; - - /* clone old region */ - if (to !=3D from) { - memcpy(reg, dev->mem->regions + from, sizeof *reg); - } - prlast =3D range_get_last(reg->guest_phys_addr, reg->memory_size); - pmlast =3D range_get_last(start_addr, size); - urlast =3D range_get_last(reg->userspace_addr, reg->memory_size); - umlast =3D range_get_last(uaddr, size); - - /* check for overlapping regions: should never happen. */ - assert(prlast < start_addr || pmlast < reg->guest_phys_addr); - /* Not an adjacent or overlapping region - do not merge. */ - if ((prlast + 1 !=3D start_addr || urlast + 1 !=3D uaddr) && - (pmlast + 1 !=3D reg->guest_phys_addr || - umlast + 1 !=3D reg->userspace_addr)) { - continue; - } - - if (dev->vhost_ops->vhost_backend_can_merge && - !dev->vhost_ops->vhost_backend_can_merge(dev, uaddr, size, - reg->userspace_addr, - reg->memory_size)) { - continue; - } - - if (merged) { - --to; - assert(to >=3D 0); - } else { - merged =3D reg; - } - u =3D MIN(uaddr, reg->userspace_addr); - s =3D MIN(start_addr, reg->guest_phys_addr); - e =3D MAX(pmlast, prlast); - uaddr =3D merged->userspace_addr =3D u; - start_addr =3D merged->guest_phys_addr =3D s; - size =3D merged->memory_size =3D e - s + 1; - assert(merged->memory_size); - } - - if (!merged) { - struct vhost_memory_region *reg =3D dev->mem->regions + to; - memset(reg, 0, sizeof *reg); - reg->memory_size =3D size; - assert(reg->memory_size); - reg->guest_phys_addr =3D start_addr; - reg->userspace_addr =3D uaddr; - ++to; - } - assert(to <=3D dev->mem->nregions + 1); - dev->mem->nregions =3D to; -} - static uint64_t vhost_get_log_size(struct vhost_dev *dev) { uint64_t log_size =3D 0; @@ -525,95 +371,6 @@ static int vhost_verify_ring_mappings(struct vhost_dev= *dev, return r; } =20 -static struct vhost_memory_region *vhost_dev_find_reg(struct vhost_dev *de= v, - uint64_t start_addr, - uint64_t size) -{ - int i, n =3D dev->mem->nregions; - for (i =3D 0; i < n; ++i) { - struct vhost_memory_region *reg =3D dev->mem->regions + i; - if (ranges_overlap(reg->guest_phys_addr, reg->memory_size, - start_addr, size)) { - return reg; - } - } - return NULL; -} - -static bool vhost_dev_cmp_memory(struct vhost_dev *dev, - uint64_t start_addr, - uint64_t size, - uint64_t uaddr) -{ - struct vhost_memory_region *reg =3D vhost_dev_find_reg(dev, start_addr= , size); - uint64_t reglast; - uint64_t memlast; - - if (!reg) { - return true; - } - - reglast =3D range_get_last(reg->guest_phys_addr, reg->memory_size); - memlast =3D range_get_last(start_addr, size); - - /* Need to extend region? */ - if (start_addr < reg->guest_phys_addr || memlast > reglast) { - return true; - } - /* userspace_addr changed? */ - return uaddr !=3D reg->userspace_addr + start_addr - reg->guest_phys_a= ddr; -} - -static void vhost_set_memory(MemoryListener *listener, - MemoryRegionSection *section, - bool add) -{ - struct vhost_dev *dev =3D container_of(listener, struct vhost_dev, - memory_listener); - hwaddr start_addr =3D section->offset_within_address_space; - ram_addr_t size =3D int128_get64(section->size); - bool log_dirty =3D - memory_region_get_dirty_log_mask(section->mr) & ~(1 << DIRTY_MEMOR= Y_MIGRATION); - int s =3D offsetof(struct vhost_memory, regions) + - (dev->mem->nregions + 1) * sizeof dev->mem->regions[0]; - void *ram; - - dev->mem =3D g_realloc(dev->mem, s); - - if (log_dirty) { - add =3D false; - } - - assert(size); - - /* Optimize no-change case. At least cirrus_vga does this a lot at thi= s time. */ - ram =3D memory_region_get_ram_ptr(section->mr) + section->offset_withi= n_region; - if (add) { - if (!vhost_dev_cmp_memory(dev, start_addr, size, (uintptr_t)ram)) { - /* Region exists with same address. Nothing to do. */ - return; - } - } else { - if (!vhost_dev_find_reg(dev, start_addr, size)) { - /* Removing region that we don't access. Nothing to do. */ - return; - } - } - - vhost_dev_unassign_memory(dev, start_addr, size); - if (add) { - /* Add given mapping, merging adjacent regions if any */ - vhost_dev_assign_memory(dev, start_addr, size, (uintptr_t)ram); - } else { - /* Remove old mapping for this memory, if any. */ - vhost_dev_unassign_memory(dev, start_addr, size); - } - dev->mem_changed_start_addr =3D MIN(dev->mem_changed_start_addr, start= _addr); - dev->mem_changed_end_addr =3D MAX(dev->mem_changed_end_addr, start_add= r + size - 1); - dev->memory_changed =3D true; - used_memslots =3D dev->mem->nregions; -} - static bool vhost_section(MemoryRegionSection *section) { return memory_region_is_ram(section->mr) && @@ -624,8 +381,6 @@ static void vhost_begin(MemoryListener *listener) { struct vhost_dev *dev =3D container_of(listener, struct vhost_dev, memory_listener); - dev->mem_changed_end_addr =3D 0; - dev->mem_changed_start_addr =3D -1; dev->tmp_sections =3D NULL; dev->n_tmp_sections =3D 0; } @@ -701,7 +456,6 @@ static void vhost_commit(MemoryListener *listener) if (r < 0) { VHOST_OPS_DEBUG("vhost_set_mem_table failed"); } - dev->memory_changed =3D false; goto out; } log_size =3D vhost_get_log_size(dev); @@ -720,7 +474,6 @@ static void vhost_commit(MemoryListener *listener) if (dev->log_size > log_size + VHOST_LOG_BUFFER) { vhost_dev_log_resize(dev, log_size); } - dev->memory_changed =3D false; =20 out: /* Deref the old list of sections, this must happen _after_ the @@ -811,8 +564,6 @@ static void vhost_region_add(MemoryListener *listener, return; } vhost_region_add_section(dev, section); - - vhost_set_memory(listener, section, true); } =20 /* Called on regions that have not changed */ @@ -836,7 +587,6 @@ static void vhost_region_del(MemoryListener *listener, return; } =20 - vhost_set_memory(listener, section, false); } =20 static void vhost_iommu_unmap_notify(IOMMUNotifier *n, IOMMUTLBEntry *iotl= b) @@ -1451,7 +1201,6 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaq= ue, hdev->log_size =3D 0; hdev->log_enabled =3D false; hdev->started =3D false; - hdev->memory_changed =3D false; memory_listener_register(&hdev->memory_listener, &address_space_memory= ); QLIST_INSERT_HEAD(&vhost_devices, hdev, entry); return 0; diff --git a/include/hw/virtio/vhost.h b/include/hw/virtio/vhost.h index 21f3022499..b64732420a 100644 --- a/include/hw/virtio/vhost.h +++ b/include/hw/virtio/vhost.h @@ -69,9 +69,6 @@ struct vhost_dev { bool log_enabled; uint64_t log_size; Error *migration_blocker; - bool memory_changed; - hwaddr mem_changed_start_addr; - hwaddr mem_changed_end_addr; const VhostOps *vhost_ops; void *opaque; struct vhost_log *log; --=20 2.14.3