From nobody Tue Nov 4 07:30:34 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 150515444590125.761539826434046; Mon, 11 Sep 2017 11:27:25 -0700 (PDT) Received: from localhost ([::1]:59813 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drTQb-0002UW-5T for importer@patchew.org; Mon, 11 Sep 2017 14:27:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49161) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drSqB-0000oE-UF for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drSqA-0008Dl-Tw for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33080) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1drSqA-0008DH-Lu for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:46 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B0BE1D69BE; Mon, 11 Sep 2017 17:49:45 +0000 (UTC) Received: from t460s.redhat.com (ovpn-116-74.ams2.redhat.com [10.36.116.74]) by smtp.corp.redhat.com (Postfix) with ESMTP id 46C9664458; Mon, 11 Sep 2017 17:49:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B0BE1D69BE Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=david@redhat.com From: David Hildenbrand To: qemu-devel@nongnu.org Date: Mon, 11 Sep 2017 19:49:31 +0200 Message-Id: <20170911174933.20789-5-david@redhat.com> In-Reply-To: <20170911174933.20789-1-david@redhat.com> References: <20170911174933.20789-1-david@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Mon, 11 Sep 2017 17:49:45 +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 v1 4/6] kvm: we never have overlapping slots in kvm_set_phys_mem() 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: Paolo Bonzini , david@redhat.com, kvm@vger.kernel.org, =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= 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" The way flatview handles memory sections, we will never have overlapping memory sections in kvm. address_space_update_topology_pass() will make sure that we will only get called for a) an existing memory section for which we only update parameters (log_start, log_stop). b) an existing memory section we want to delete (region_del) c) a brand new memory section we want to add (region_add) We cannot have overlapping memory sections in kvm as we will first remove the overlapping sections and then add the ones without conflicts. Therefore we can remove the complexity for handling prefix and suffix slots. Signed-off-by: David Hildenbrand --- accel/kvm/kvm-all.c | 68 +++++++++----------------------------------------= ---- 1 file changed, 11 insertions(+), 57 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 88b0e631bd..b677d1b13e 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -725,7 +725,7 @@ kvm_check_extension_list(KVMState *s, const KVMCapabili= tyInfo *list) static void kvm_set_phys_mem(KVMMemoryListener *kml, MemoryRegionSection *section, bool add) { - KVMSlot *mem, old; + KVMSlot *mem; int err; MemoryRegion *mr =3D section->mr; bool writeable =3D !mr->readonly && !mr->rom_device; @@ -750,28 +750,17 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml, ram =3D memory_region_get_ram_ptr(mr) + section->offset_within_region + (section->offset_within_address_space - start_addr); =20 - while (1) { - mem =3D kvm_lookup_overlapping_slot(kml, start_addr, start_addr + = size); + mem =3D kvm_lookup_matching_slot(kml, start_addr, size); + if (!add) { if (!mem) { - break; - } - - if (add && start_addr >=3D mem->start_addr && - (start_addr + size <=3D mem->start_addr + mem->memory_size) && - (ram - start_addr =3D=3D mem->ram - mem->start_addr)) { - /* The new slot fits into the existing one and comes with - * identical parameters - update flags and done. */ - kvm_slot_update_flags(kml, mem, mr); + g_assert(!memory_region_is_ram(mr) && !writeable && !mr->romd_= mode); return; } - - old =3D *mem; - if (mem->flags & KVM_MEM_LOG_DIRTY_PAGES) { kvm_physical_sync_dirty_bitmap(kml, section); } =20 - /* unregister the overlapping slot */ + /* unregister the slot */ mem->memory_size =3D 0; err =3D kvm_set_user_memory_region(kml, mem); if (err) { @@ -779,51 +768,16 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml, __func__, strerror(-err)); abort(); } - - /* register prefix slot */ - if (old.start_addr < start_addr) { - mem =3D kvm_alloc_slot(kml); - mem->memory_size =3D start_addr - old.start_addr; - mem->start_addr =3D old.start_addr; - mem->ram =3D old.ram; - mem->flags =3D kvm_mem_flags(mr); - - err =3D kvm_set_user_memory_region(kml, mem); - if (err) { - fprintf(stderr, "%s: error registering prefix slot: %s\n", - __func__, strerror(-err)); -#ifdef TARGET_PPC - fprintf(stderr, "%s: This is probably because your kernel'= s " \ - "PAGE_SIZE is too big. Please try to use 4= k " \ - "PAGE_SIZE!\n", __func__); -#endif - abort(); - } - } - - /* register suffix slot */ - if (old.start_addr + old.memory_size > start_addr + size) { - ram_addr_t size_delta; - - mem =3D kvm_alloc_slot(kml); - mem->start_addr =3D start_addr + size; - size_delta =3D mem->start_addr - old.start_addr; - mem->memory_size =3D old.memory_size - size_delta; - mem->ram =3D old.ram + size_delta; - mem->flags =3D kvm_mem_flags(mr); - - err =3D kvm_set_user_memory_region(kml, mem); - if (err) { - fprintf(stderr, "%s: error registering suffix slot: %s\n", - __func__, strerror(-err)); - abort(); - } - } + return; } =20 - if (!add) { + if (mem) { + /* update the slot */ + kvm_slot_update_flags(kml, mem, mr); return; } + + /* register the new slot */ mem =3D kvm_alloc_slot(kml); mem->memory_size =3D size; mem->start_addr =3D start_addr; --=20 2.13.5