From nobody Mon Jun 8 05:26:07 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CCD193B8958 for ; Fri, 5 Jun 2026 15:33:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780673640; cv=none; b=fHQ10ZTG+Kj0va0DO7NOww7tFy23ZVI+SoWZQ7lNzUm1U78CgwArlXS3Pyv0bLNzSoI4hYf4YSPlXTcIBmIBO5185bbB+IuCrujB+GSNxZA5NH1RCBUjkwJqQA32LwhabFvjTJgkR3qXsyhF5QIqmwB1wNQxC0U8Cshz2m9RanY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780673640; c=relaxed/simple; bh=iJk4qjveu3UoNnJ691h+ELzlPLvx6w5PQjerE7+VMUs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Gpe1mRu5JlKm239upNJEW22epKlyUrGL30/0eqmxz679pnbNAeTOCiF3Dkw7YWunD77e1rZjtmYYXt+UqiJ6w4SbCu6EA+PE8qibGaPyVsPLFBK7qY/Bu/zVTQyXjyoVzacGyvp8wzcGfdYma6BJuu5wi/6qyuPjWb0Hrg3XWnk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=rcmKxTgw; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="rcmKxTgw" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1E3D134FE; Fri, 5 Jun 2026 08:33:48 -0700 (PDT) Received: from workstation-e142269.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B7F0C3F86F; Fri, 5 Jun 2026 08:33:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1780673632; bh=iJk4qjveu3UoNnJ691h+ELzlPLvx6w5PQjerE7+VMUs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rcmKxTgw5I4C0CsiJ4siCezSQ+0XGnrijovnLD0FgmitLGGEg4HMlrCtMh/ek4gqi H3NJlux6boKl7w8I7T353PXyeVYPpqtluvaKl165XjqIzO/WrL3jjxkMKtmVtzyFRv vQFMY00/wcnZoyEywrjdv0AuHDHxAWyLm3eLtd+U= From: Wei-Lin Chang To: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Cc: Marc Zyngier , Oliver Upton , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Gavin Shan , Wei-Lin Chang Subject: [PATCH 1/2] KVM: arm64: Replace memslot_is_logging() with kvm_slot_dirty_track_enabled() Date: Fri, 5 Jun 2026 16:32:47 +0100 Message-ID: <20260605153248.2412064-2-weilin.chang@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260605153248.2412064-1-weilin.chang@arm.com> References: <20260605153248.2412064-1-weilin.chang@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" When checking whether a memslot has dirty logging enabled, the KVM_MEM_LOG_DIRTY_PAGES flag is the source of truth. Previously we were using memslot_is_logging() which only tests dirty bitmap and did not consider dirty ring. This was not detected because KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP was introduced together with KVM arm64 dirty ring, and users need to enable it to ensure dirty information is not lost for the case of VGIC LPI/ITS table changes. Fix this by using kvm_slot_dirty_track_enabled() instead which checks KVM_MEM_LOG_DIRTY_PAGES. Note that memslot_is_logging() also treats a memslot as not logging if KVM_MEM_READONLY is set, hence a memslot with both dirty logging and read only would be seen as not logging for memslot_is_logging(), but logging for kvm_slot_dirty_track_enabled(). This allows a read only mapping of size > PAGE_SIZE to be built when memslot_is_logging() is used, leading to a better read performance compared to kvm_slot_dirty_track_enabled(). However memslots that have both KVM_MEM_LOG_DIRTY_PAGES and KVM_MEM_READONLY set do not really make sense as dirty logging is essentially nop for a read only memslot, so this shouldn't affect real workloads much. Fixes: 9cb1096f8590 ("KVM: arm64: Enable ring-based dirty memory tracking") Signed-off-by: Wei-Lin Chang --- It took me a long investigation to acquire the context needed to understand this change, however the reason for this problem not being detected is an educated guess. Please let me know if this is wrong or if there are other issues, thanks! arch/arm64/kvm/mmu.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 4da9281312eb..06c46124d3e7 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -161,11 +161,6 @@ static int kvm_mmu_split_huge_pages(struct kvm *kvm, p= hys_addr_t addr, return ret; } =20 -static bool memslot_is_logging(struct kvm_memory_slot *memslot) -{ - return memslot->dirty_bitmap && !(memslot->flags & KVM_MEM_READONLY); -} - /** * kvm_arch_flush_remote_tlbs() - flush all VM TLB entries for v7/8 * @kvm: pointer to kvm structure. @@ -1748,7 +1743,7 @@ static short kvm_s2_resolve_vma_size(const struct kvm= _s2_fault_desc *s2fd, { short vma_shift; =20 - if (memslot_is_logging(s2fd->memslot)) { + if (kvm_slot_dirty_track_enabled(s2fd->memslot)) { s2vi->max_map_size =3D PAGE_SIZE; vma_shift =3D PAGE_SHIFT; } else { @@ -1953,7 +1948,7 @@ static int kvm_s2_fault_compute_prot(const struct kvm= _s2_fault_desc *s2fd, *prot =3D KVM_PGTABLE_PROT_R; =20 if (s2vi->map_writable && (s2vi->device || - !memslot_is_logging(s2fd->memslot) || + !kvm_slot_dirty_track_enabled(s2fd->memslot) || kvm_is_write_fault(s2fd->vcpu))) *prot |=3D KVM_PGTABLE_PROT_W; =20 @@ -2084,7 +2079,7 @@ static int user_mem_abort(const struct kvm_s2_fault_d= esc *s2fd) * and a write fault needs to collapse a block entry into a table. */ memcache =3D get_mmu_memcache(s2fd->vcpu); - if (!perm_fault || (memslot_is_logging(s2fd->memslot) && + if (!perm_fault || (kvm_slot_dirty_track_enabled(s2fd->memslot) && kvm_is_write_fault(s2fd->vcpu))) { ret =3D topup_mmu_memcache(s2fd->vcpu, memcache); if (ret) --=20 2.43.0 From nobody Mon Jun 8 05:26:07 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 15CC83B7747 for ; Fri, 5 Jun 2026 15:33:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780673641; cv=none; b=HZiNLW4x+l+0PGMFz0vsUAQiIfH63B33Kh9eMmFpzR3JmSU8AnoIaia23xUilVue2TxS5xrd6B1HVrUN2xHNYi2E459KghA42gAWIa3XDINDTNcDRJgAhQIMrfxMo3mK3jB3kbOafViS15MbsMuGNWe6BZeuN9pBiCOLUffIzK4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780673641; c=relaxed/simple; bh=441m7hF9vzIcO70ErwNiZK/0ZfRAnsJvOJUj0/9Y5c4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cMKRZQWqga/CX33gDUl/GkSnczHSut3IOPU3gGKIt5PsXTIfPpHk6/lOvnMP1aRmnClg0dHNxNmAcOet4QZp2voJOtuYV+ymLY4/BVCjLdWZOg4YdHI+YF9mt3gc68wN5pOCmhcs/6wZnNgEVRNHF22oGH3o4T+0LjAW46ZgyCQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=SdkdPb6R; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="SdkdPb6R" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B3CFD3514; Fri, 5 Jun 2026 08:33:50 -0700 (PDT) Received: from workstation-e142269.cambridge.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.121.207.14]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 4A2CB3F86F; Fri, 5 Jun 2026 08:33:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1780673635; bh=441m7hF9vzIcO70ErwNiZK/0ZfRAnsJvOJUj0/9Y5c4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SdkdPb6RA0soTPSbhVCDtw0M7wsIDbW68oFLhCdvfymY4tq2RUHgMmXzfchljredi U+V9IpQSmHMZw43LPWIzi+gcJy246YXXp9WBV8o8rWSxyktpvaITufjpy+06IepF8J Fvz2iUmQFo2qsYmgCxEyjAP9lXcnhSDQgKa5Xwes= From: Wei-Lin Chang To: linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org Cc: Marc Zyngier , Oliver Upton , Joey Gouly , Steffen Eiden , Suzuki K Poulose , Zenghui Yu , Catalin Marinas , Will Deacon , Gavin Shan , Wei-Lin Chang Subject: [PATCH 2/2] KVM: arm64: Remove superfluous aligning of gfn for dirty logging Date: Fri, 5 Jun 2026 16:32:48 +0100 Message-ID: <20260605153248.2412064-3-weilin.chang@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260605153248.2412064-1-weilin.chang@arm.com> References: <20260605153248.2412064-1-weilin.chang@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Stage-2 mapping size is forced to PAGE_SIZE when dirty logging is enabled for a memslot, therefore we don't need to align it down to a possibly larger vma size or THP adjusted size, they won't happen. Signed-off-by: Wei-Lin Chang --- arch/arm64/kvm/mmu.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 06c46124d3e7..d1f6ff7c2943 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -2050,13 +2050,12 @@ static int kvm_s2_fault_map(const struct kvm_s2_fau= lt_desc *s2fd, =20 /* * Mark the page dirty only if the fault is handled successfully, - * making sure we adjust the canonical IPA if the mapping size has - * been updated (via a THP upgrade, for example). + * mapping size is forced to PAGE_SIZE if dirty logging is enabled, + * so we don't have to adjust the canonical IPA here. */ if (writable && !ret) { - phys_addr_t ipa =3D gfn_to_gpa(get_canonical_gfn(s2fd, s2vi)); - ipa &=3D ~(mapping_size - 1); - mark_page_dirty_in_slot(kvm, s2fd->memslot, gpa_to_gfn(ipa)); + gfn_t canonical_gfn =3D get_canonical_gfn(s2fd, s2vi); + mark_page_dirty_in_slot(kvm, s2fd->memslot, canonical_gfn); } =20 if (ret !=3D -EAGAIN) --=20 2.43.0