From nobody Tue Nov 4 00:56:03 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 1505154287473756.9822707359372; Mon, 11 Sep 2017 11:24:47 -0700 (PDT) Received: from localhost ([::1]:59773 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drTO2-0000A9-L8 for importer@patchew.org; Mon, 11 Sep 2017 14:24:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49104) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drSq7-0000jc-Ne for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drSq5-00085s-Ig for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:43 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19394) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1drSq5-000858-9f for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:41 -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 49CE8372590; Mon, 11 Sep 2017 17:49:40 +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 D92316A82E; Mon, 11 Sep 2017 17:49:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 49CE8372590 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.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:28 +0200 Message-Id: <20170911174933.20789-2-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.30]); Mon, 11 Sep 2017 17:49:40 +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 1/6] kvm: require JOIN_MEMORY_REGIONS_WORKS 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" We already require DESTROY_MEMORY_REGION_WORKS, JOIN_MEMORY_REGIONS_WORKS was added just half a year later. In addition, with flatview overlapping memory regions are first removed before adding the changed one. So we can't really detect joining memory regions this way. Let's just get rid of this special handling. Signed-off-by: David Hildenbrand --- accel/kvm/kvm-all.c | 42 +----------------------------------------- 1 file changed, 1 insertion(+), 41 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index f85553a851..985b179ab6 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -79,7 +79,6 @@ struct KVMState int coalesced_mmio; struct kvm_coalesced_mmio_ring *coalesced_mmio_ring; bool coalesced_flush_in_progress; - int broken_set_mem_region; int vcpu_events; int robust_singlestep; int debugregs; @@ -127,6 +126,7 @@ static bool kvm_immediate_exit; static const KVMCapabilityInfo kvm_required_capabilites[] =3D { KVM_CAP_INFO(USER_MEMORY), KVM_CAP_INFO(DESTROY_MEMORY_REGION_WORKS), + KVM_CAP_INFO(JOIN_MEMORY_REGIONS_WORKS), KVM_CAP_LAST_INFO }; =20 @@ -696,7 +696,6 @@ kvm_check_extension_list(KVMState *s, const KVMCapabili= tyInfo *list) static void kvm_set_phys_mem(KVMMemoryListener *kml, MemoryRegionSection *section, bool add) { - KVMState *s =3D kvm_state; KVMSlot *mem, old; int err; MemoryRegion *mr =3D section->mr; @@ -763,35 +762,6 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml, abort(); } =20 - /* Workaround for older KVM versions: we can't join slots, even no= t by - * unregistering the previous ones and then registering the larger - * slot. We have to maintain the existing fragmentation. Sigh. - * - * This workaround assumes that the new slot starts at the same - * address as the first existing one. If not or if some overlapping - * slot comes around later, we will fail (not seen in practice so = far) - * - and actually require a recent KVM version. */ - if (s->broken_set_mem_region && - old.start_addr =3D=3D start_addr && old.memory_size < size && = add) { - mem =3D kvm_alloc_slot(kml); - mem->memory_size =3D old.memory_size; - 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 updating slot: %s\n", __func__, - strerror(-err)); - abort(); - } - - start_addr +=3D old.memory_size; - ram +=3D old.memory_size; - size -=3D old.memory_size; - continue; - } - /* register prefix slot */ if (old.start_addr < start_addr) { mem =3D kvm_alloc_slot(kml); @@ -833,10 +803,6 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml, } } =20 - /* in case the KVM bug workaround already "consumed" the new slot */ - if (!size) { - return; - } if (!add) { return; } @@ -1692,12 +1658,6 @@ static int kvm_init(MachineState *ms) =20 s->coalesced_mmio =3D kvm_check_extension(s, KVM_CAP_COALESCED_MMIO); =20 - s->broken_set_mem_region =3D 1; - ret =3D kvm_check_extension(s, KVM_CAP_JOIN_MEMORY_REGIONS_WORKS); - if (ret > 0) { - s->broken_set_mem_region =3D 0; - } - #ifdef KVM_CAP_VCPU_EVENTS s->vcpu_events =3D kvm_check_extension(s, KVM_CAP_VCPU_EVENTS); #endif --=20 2.13.5 From nobody Tue Nov 4 00:56:03 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 1505153814373332.82790271519275; Mon, 11 Sep 2017 11:16:54 -0700 (PDT) Received: from localhost ([::1]:59686 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drTGP-0000pF-6j for importer@patchew.org; Mon, 11 Sep 2017 14:16:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49125) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drSq8-0000kJ-CP for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drSq7-00088n-Eh for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57622) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1drSq7-00087p-5f for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:43 -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 2CA5BC0D8D65; Mon, 11 Sep 2017 17:49:42 +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 9EE626442B; Mon, 11 Sep 2017 17:49:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 2CA5BC0D8D65 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.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:29 +0200 Message-Id: <20170911174933.20789-3-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.31]); Mon, 11 Sep 2017 17:49:42 +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 2/6] kvm: factor out alignment of memory section 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" Factor it out, so we can reuse it later. Signed-off-by: David Hildenbrand --- accel/kvm/kvm-all.c | 59 +++++++++++++++++++++++++++++++++++--------------= ---- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 985b179ab6..e0d100bd30 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -190,6 +190,36 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryList= ener *kml, } =20 /* + * Calculate and align the start address and the size of the section. + * Return the size. If the size is 0, the aligned section is empty. + */ +static hwaddr kvm_align_section(MemoryRegionSection *section, + hwaddr *start) +{ + hwaddr size =3D int128_get64(section->size); + hwaddr delta; + + *start =3D section->offset_within_address_space; + + /* kvm works in page size chunks, but the function may be called + with sub-page size and unaligned start address. Pad the start + address to next and truncate size to previous page boundary. */ + delta =3D qemu_real_host_page_size - (*start & ~qemu_real_host_page_ma= sk); + delta &=3D ~qemu_real_host_page_mask; + *start +=3D delta; + if (delta > size) { + return 0; + } + size -=3D delta; + size &=3D qemu_real_host_page_mask; + if (*start & ~qemu_real_host_page_mask) { + return 0; + } + + return size; +} + +/* * Find overlapping slot with lowest start address */ static KVMSlot *kvm_lookup_overlapping_slot(KVMMemoryListener *kml, @@ -700,25 +730,8 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml, int err; MemoryRegion *mr =3D section->mr; bool writeable =3D !mr->readonly && !mr->rom_device; - hwaddr start_addr =3D section->offset_within_address_space; - ram_addr_t size =3D int128_get64(section->size); - void *ram =3D NULL; - unsigned delta; - - /* kvm works in page size chunks, but the function may be called - with sub-page size and unaligned start address. Pad the start - address to next and truncate size to previous page boundary. */ - delta =3D qemu_real_host_page_size - (start_addr & ~qemu_real_host_pag= e_mask); - delta &=3D ~qemu_real_host_page_mask; - if (delta > size) { - return; - } - start_addr +=3D delta; - size -=3D delta; - size &=3D qemu_real_host_page_mask; - if (!size || (start_addr & ~qemu_real_host_page_mask)) { - return; - } + hwaddr start_addr, size; + void *ram; =20 if (!memory_region_is_ram(mr)) { if (writeable || !kvm_readonly_mem_allowed) { @@ -730,7 +743,13 @@ static void kvm_set_phys_mem(KVMMemoryListener *kml, } } =20 - ram =3D memory_region_get_ram_ptr(mr) + section->offset_within_region = + delta; + size =3D kvm_align_section(section, &start_addr); + if (!size) { + return; + } + + 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); --=20 2.13.5 From nobody Tue Nov 4 00:56:03 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 150515397516410.017424675685561; Mon, 11 Sep 2017 11:19:35 -0700 (PDT) Received: from localhost ([::1]:59711 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drTJ0-0003tH-07 for importer@patchew.org; Mon, 11 Sep 2017 14:19:34 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49148) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drSq9-0000lv-R8 for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drSq9-0008BZ-0n for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35894) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1drSq8-0008Ae-RN for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:44 -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 DC81D7B5AE; Mon, 11 Sep 2017 17:49:43 +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 81E1D6442B; Mon, 11 Sep 2017 17:49:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DC81D7B5AE Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.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:30 +0200 Message-Id: <20170911174933.20789-4-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.30]); Mon, 11 Sep 2017 17:49: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 v1 3/6] kvm: use start + size for memory ranges 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" Convert kvm_lookup_matching_slot(). Signed-off-by: David Hildenbrand --- accel/kvm/kvm-all.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index e0d100bd30..88b0e631bd 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -172,7 +172,7 @@ static KVMSlot *kvm_alloc_slot(KVMMemoryListener *kml) =20 static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListener *kml, hwaddr start_addr, - hwaddr end_addr) + hwaddr size) { KVMState *s =3D kvm_state; int i; @@ -180,8 +180,7 @@ static KVMSlot *kvm_lookup_matching_slot(KVMMemoryListe= ner *kml, for (i =3D 0; i < s->nr_slots; i++) { KVMSlot *mem =3D &kml->slots[i]; =20 - if (start_addr =3D=3D mem->start_addr && - end_addr =3D=3D mem->start_addr + mem->memory_size) { + if (start_addr =3D=3D mem->start_addr && size =3D=3D mem->memory_s= ize) { return mem; } } @@ -414,7 +413,7 @@ static int kvm_section_update_flags(KVMMemoryListener *= kml, { hwaddr phys_addr =3D section->offset_within_address_space; ram_addr_t size =3D int128_get64(section->size); - KVMSlot *mem =3D kvm_lookup_matching_slot(kml, phys_addr, phys_addr + = size); + KVMSlot *mem =3D kvm_lookup_matching_slot(kml, phys_addr, size); =20 if (mem =3D=3D NULL) { return 0; --=20 2.13.5 From nobody Tue Nov 4 00:56:03 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 From nobody Tue Nov 4 00:56:03 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 1505153491400212.3404011603077; Mon, 11 Sep 2017 11:11:31 -0700 (PDT) Received: from localhost ([::1]:59647 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drTBC-0003eY-HK for importer@patchew.org; Mon, 11 Sep 2017 14:11:30 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49183) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drSqD-0000pq-E2 for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drSqC-0008Hq-NS for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:49 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33140) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1drSqC-0008FI-Gs for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:48 -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 82C9BB9F3C; Mon, 11 Sep 2017 17:49:47 +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 0EDEA6442B; Mon, 11 Sep 2017 17:49:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 82C9BB9F3C 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:32 +0200 Message-Id: <20170911174933.20789-6-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:47 +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 5/6] kvm: kvm_log_start/stop are only called with known sections 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" Let's properly align the sections first and bail out if we would ever get called with a memory section we don't know yet. Signed-off-by: David Hildenbrand --- accel/kvm/kvm-all.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index b677d1b13e..2ae459453d 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -411,15 +411,21 @@ static int kvm_slot_update_flags(KVMMemoryListener *k= ml, KVMSlot *mem, static int kvm_section_update_flags(KVMMemoryListener *kml, MemoryRegionSection *section) { - hwaddr phys_addr =3D section->offset_within_address_space; - ram_addr_t size =3D int128_get64(section->size); - KVMSlot *mem =3D kvm_lookup_matching_slot(kml, phys_addr, size); + hwaddr start_addr, size; + KVMSlot *mem; =20 - if (mem =3D=3D NULL) { + size =3D kvm_align_section(section, &start_addr); + if (!size) { return 0; - } else { - return kvm_slot_update_flags(kml, mem, section->mr); } + + mem =3D kvm_lookup_matching_slot(kml, start_addr, size); + if (!mem) { + fprintf(stderr, "%s: error finding slot\n", __func__); + abort(); + } + + return kvm_slot_update_flags(kml, mem, section->mr); } =20 static void kvm_log_start(MemoryListener *listener, --=20 2.13.5 From nobody Tue Nov 4 00:56:03 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 1505153651729144.18554540192713; Mon, 11 Sep 2017 11:14:11 -0700 (PDT) Received: from localhost ([::1]:59667 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drTDm-0006MR-VK for importer@patchew.org; Mon, 11 Sep 2017 14:14:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49221) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1drSqI-0000tr-Dg for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1drSqF-0008KV-5q for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58108) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1drSqE-0008JJ-Si for qemu-devel@nongnu.org; Mon, 11 Sep 2017 13:49:51 -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 C79D7C0D8D64; Mon, 11 Sep 2017 17:49:49 +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 E45CC6A82F; Mon, 11 Sep 2017 17:49:47 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C79D7C0D8D64 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.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:33 +0200 Message-Id: <20170911174933.20789-7-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.31]); Mon, 11 Sep 2017 17:49:49 +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 6/6] kvm: kvm_log_sync() is only called with known memory sections 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" Flatview will make sure that we can only end up in this function with memory sections that correspond to exactly one slot. So we don't have to iterate multiple times. There won't be overlapping slots but only matching slots. Properly align the section and look up the corresponding slot. This heavily simplifies this function. We can now get rid of kvm_lookup_overlapping_slot(). Signed-off-by: David Hildenbrand --- accel/kvm/kvm-all.c | 61 +++++++++++--------------------------------------= ---- 1 file changed, 12 insertions(+), 49 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 2ae459453d..a8083e80be 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -218,34 +218,6 @@ static hwaddr kvm_align_section(MemoryRegionSection *s= ection, return size; } =20 -/* - * Find overlapping slot with lowest start address - */ -static KVMSlot *kvm_lookup_overlapping_slot(KVMMemoryListener *kml, - hwaddr start_addr, - hwaddr end_addr) -{ - KVMState *s =3D kvm_state; - KVMSlot *found =3D NULL; - int i; - - for (i =3D 0; i < s->nr_slots; i++) { - KVMSlot *mem =3D &kml->slots[i]; - - if (mem->memory_size =3D=3D 0 || - (found && found->start_addr < mem->start_addr)) { - continue; - } - - if (end_addr > mem->start_addr && - start_addr < mem->start_addr + mem->memory_size) { - found =3D mem; - } - } - - return found; -} - int kvm_physical_memory_addr_from_host(KVMState *s, void *ram, hwaddr *phys_addr) { @@ -489,18 +461,16 @@ static int kvm_physical_sync_dirty_bitmap(KVMMemoryLi= stener *kml, MemoryRegionSection *section) { KVMState *s =3D kvm_state; - unsigned long size, allocated_size =3D 0; struct kvm_dirty_log d =3D {}; KVMSlot *mem; - int ret =3D 0; - hwaddr start_addr =3D section->offset_within_address_space; - hwaddr end_addr =3D start_addr + int128_get64(section->size); + hwaddr start_addr, size; =20 - d.dirty_bitmap =3D NULL; - while (start_addr < end_addr) { - mem =3D kvm_lookup_overlapping_slot(kml, start_addr, end_addr); - if (mem =3D=3D NULL) { - break; + size =3D kvm_align_section(section, &start_addr); + if (size) { + mem =3D kvm_lookup_matching_slot(kml, start_addr, size); + if (!mem) { + fprintf(stderr, "%s: error finding slot\n", __func__); + abort(); } =20 /* XXX bad kernel interface alert @@ -517,27 +487,20 @@ static int kvm_physical_sync_dirty_bitmap(KVMMemoryLi= stener *kml, */ size =3D ALIGN(((mem->memory_size) >> TARGET_PAGE_BITS), /*HOST_LONG_BITS*/ 64) / 8; - if (!d.dirty_bitmap) { - d.dirty_bitmap =3D g_malloc(size); - } else if (size > allocated_size) { - d.dirty_bitmap =3D g_realloc(d.dirty_bitmap, size); - } - allocated_size =3D size; - memset(d.dirty_bitmap, 0, allocated_size); + d.dirty_bitmap =3D g_malloc0(size); =20 d.slot =3D mem->slot | (kml->as_id << 16); if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) =3D=3D -1) { DPRINTF("ioctl failed %d\n", errno); - ret =3D -1; - break; + g_free(d.dirty_bitmap); + return -1; } =20 kvm_get_dirty_pages_log_range(section, d.dirty_bitmap); - start_addr =3D mem->start_addr + mem->memory_size; + g_free(d.dirty_bitmap); } - g_free(d.dirty_bitmap); =20 - return ret; + return 0; } =20 static void kvm_coalesce_mmio_region(MemoryListener *listener, --=20 2.13.5