From nobody Mon Jun 8 07:30:43 2026 Received: from mxct.zte.com.cn (mxct.zte.com.cn [183.62.165.209]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF8C343DA21; Wed, 3 Jun 2026 09:54:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=183.62.165.209 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480497; cv=none; b=in+1CwuX26sTD6L4gv0LdtIp8s5dD+0mdB0IwcA7lagRcuOrlO14V2AJ2yyQrz6E9+0q3yjqOX2oNJliOLXS9fWN0HAL+JeEaeHPcP2wXrCBzo/U5LtQeBI2FZd7TkCnYM8FHtVKNBTPcuAoNcAGpR8POjVUJ6paf63SvLkZgNE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480497; c=relaxed/simple; bh=gSrTZC9jxZlCwuNQlqtPIqst/+5F47exvCrWQ/CL/ms=; h=Message-ID:In-Reply-To:References:Date:Mime-Version:From:To:Cc: Subject:Content-Type; b=BaAIeuWrTnJ1Il1o62EqkXiSUpRPaSv78cQyErkyiIEz8BRZGy97aRRZiNWo0esd+bqf34yYxnr2OyRcOIM+rPFUoS/Zs6PKZErkplk+RbPaBWddPTPTCl1/KMPNrAWkSKExON+ik3C86khYycLtiBGa6dd+uxPhsLNMtASe2mw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn; spf=pass smtp.mailfrom=zte.com.cn; arc=none smtp.client-ip=183.62.165.209 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zte.com.cn Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mxct.zte.com.cn (FangMail) with ESMTPS id 4gVjjH10FWz58fdM; Wed, 03 Jun 2026 17:54:43 +0800 (CST) Received: from szxlzmapp04.zte.com.cn ([10.5.231.166]) by mse-fl1.zte.com.cn with SMTP id 6539sa0H073074; Wed, 3 Jun 2026 17:54:36 +0800 (+08) (envelope-from wang.yechao255@zte.com.cn) Received: from mapi (szxlzmapp02[null]) by mapi (Zmail) with MAPI id mid12; Wed, 3 Jun 2026 17:54:39 +0800 (CST) X-Zmail-TransId: 2b046a1ff9df49a-28dd2 X-Mailer: Zmail v1.0 Message-ID: <20260603175439237VrPTLz6fG79fXRYAu-JFW@zte.com.cn> In-Reply-To: <20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn> References: 20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn Date: Wed, 3 Jun 2026 17:54:39 +0800 (CST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 From: To: , , , , , Cc: , , , , Subject: =?UTF-8?B?W1BBVENIIHYyIDEvNF0gUklTQy1WOiBLVk06IEFkZCB0aGUgc3BsaXQgcGFnZSBjYWNoZSBmb3IgaW9jdGwgY29udGV4dA==?= X-MAIL: mse-fl1.zte.com.cn 6539sa0H073074 X-TLS: YES X-ENVELOPE-SENDER: wang.yechao255@zte.com.cn X-SOURCE-IP: 10.5.228.132 unknown Wed, 03 Jun 2026 17:54:43 +0800 X-CLEAN: YES X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6A1FF9E3.000/4gVjjH10FWz58fdM Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wang Yechao Add the split page cache for dirty logging enablement and the KVM_CLEAR_DIRTY_LOG ioctl. Signed-off-by: Wang Yechao --- arch/riscv/include/asm/kvm_host.h | 1 + arch/riscv/kvm/mmu.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/arch/riscv/include/asm/kvm_host.h b/arch/riscv/include/asm/kvm= _host.h index 75b0a951c1bc..0ee778f0f086 100644 --- a/arch/riscv/include/asm/kvm_host.h +++ b/arch/riscv/include/asm/kvm_host.h @@ -84,6 +84,7 @@ struct kvm_arch { pgd_t *pgd; phys_addr_t pgd_phys; unsigned long pgd_levels; + struct kvm_mmu_memory_cache pgd_split_page_cache; /* Guest Timer */ struct kvm_guest_timer timer; diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c index 2d3def024270..0676937bd9a1 100644 --- a/arch/riscv/kvm/mmu.c +++ b/arch/riscv/kvm/mmu.c @@ -549,6 +549,7 @@ int kvm_riscv_mmu_alloc_pgd(struct kvm *kvm) kvm->arch.pgd =3D page_to_virt(pgd_page); kvm->arch.pgd_phys =3D page_to_phys(pgd_page); kvm->arch.pgd_levels =3D kvm_riscv_gstage_max_pgd_levels; + kvm->arch.pgd_split_page_cache.gfp_zero =3D __GFP_ZERO; return 0; } @@ -572,6 +573,8 @@ void kvm_riscv_mmu_free_pgd(struct kvm *kvm) if (pgd) free_pages((unsigned long)pgd, get_order(kvm_riscv_gstage_pgd_size)); + + kvm_mmu_free_memory_cache(&kvm->arch.pgd_split_page_cache); } void kvm_riscv_mmu_update_hgatp(struct kvm_vcpu *vcpu) --=20 2.43.5 From nobody Mon Jun 8 07:30:43 2026 Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [160.30.148.34]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9562044B662; Wed, 3 Jun 2026 09:57:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=160.30.148.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480642; cv=none; b=cgkgcBA7uJYecilvM0UahU/2wo/m3Co1GCD5uPZVz1efyXLwHjdATVmKPb/tinNZWXg6/WZdr4R6OQ/J4BowILeLoqVpl4UQ6is3gl9qnYrF9zkCn/ZHKP+uVDzfDo7rT4s7P5wjJ7yafr2QzIblVQbO4EIP7vGgE9ugolbNmEc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480642; c=relaxed/simple; bh=a8Q67XcxXFwHTGPmJupeIsx44hqbBlAQPyj5deyfI0k=; h=Message-ID:In-Reply-To:References:Date:Mime-Version:From:To:Cc: Subject:Content-Type; b=qzQlSQwcWDhT/5z37HmLJeW74SXqNflXTqq7dhoKnz7KhozLGiXFDlJEM0IyidznUFaYot/5HfDGyOPO7wjLeVyK2vrMyjwY9tF8GcEbKgPqQeeI0/2NOlqw4wtE+cIIPwWPZyEcY57PpMdej1BmkfFHD5y52gm01WOY2+oIA7w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn; spf=pass smtp.mailfrom=zte.com.cn; arc=none smtp.client-ip=160.30.148.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zte.com.cn Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4gVjm82XbWz5B100; Wed, 03 Jun 2026 17:57:12 +0800 (CST) Received: from szxl2zmapp07.zte.com.cn ([10.1.32.52]) by mse-fl1.zte.com.cn with SMTP id 6539v0K1077047; Wed, 3 Jun 2026 17:57:00 +0800 (+08) (envelope-from wang.yechao255@zte.com.cn) Received: from mapi (szxl2zmapp07[null]) by mapi (Zmail) with MAPI id mid12; Wed, 3 Jun 2026 17:57:02 +0800 (CST) X-Zmail-TransId: 2b096a1ffa6e59e-e6f17 X-Mailer: Zmail v1.0 Message-ID: <202606031757028642jwiaL-QePBLGAhMW88zw@zte.com.cn> In-Reply-To: <20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn> References: 20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn Date: Wed, 3 Jun 2026 17:57:02 +0800 (CST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 From: To: , , , , , Cc: , , , , Subject: =?UTF-8?B?W1BBVENIIHYyIDIvNF0gUklTQy1WOiBLVk06IFNwbGl0IGh1Z2UgcGFnZXMgd2hlbiBkaXJ0eSBsb2dnaW5nIGlzwqBlbmFibGVk?= X-MAIL: mse-fl1.zte.com.cn 6539v0K1077047 X-TLS: YES X-ENVELOPE-SENDER: wang.yechao255@zte.com.cn X-SOURCE-IP: 10.5.228.132 unknown Wed, 03 Jun 2026 17:57:12 +0800 X-CLEAN: YES X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6A1FFA78.001/4gVjm82XbWz5B100 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wang Yechao Split huge pages eagerly when enabling dirty logging. The goal is to avoid doing it while faulting on write-protected pages, which negatively impacts guest performance. The benefits of eager page splitting are the same as in x86 and arm64, added with commit a3fe5dbda0a4 ("KVM: x86/mmu: Split huge pages mapped by the TDP MMU when dirty logging is enabled") and commit e7bf7a490c68 ("KVM: arm64: Split huge pages when dirty logging is enabled") Signed-off-by: Wang Yechao --- arch/riscv/kvm/mmu.c | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c index 0676937bd9a1..51bd1db74e1a 100644 --- a/arch/riscv/kvm/mmu.c +++ b/arch/riscv/kvm/mmu.c @@ -90,6 +90,52 @@ void kvm_riscv_mmu_iounmap(struct kvm *kvm, gpa_t gpa, u= nsigned long size) spin_unlock(&kvm->mmu_lock); } +static bool need_topup_split_caches_or_resched(struct kvm_mmu_memory_cache= *cache, + int count) +{ + if (need_resched()) + return true; + + return kvm_mmu_memory_cache_nr_free_objects(cache) < count; +} + +/* the caller must held mmu lock */ +static void mmu_split_huge_pages(struct kvm_gstage *gstage, + phys_addr_t start, phys_addr_t end, + bool flush) +{ + struct kvm *kvm =3D gstage->kvm; + struct kvm_mmu_memory_cache *pcache =3D &kvm->arch.pgd_split_page_cache; + int count =3D gstage->pgd_levels; + phys_addr_t addr =3D start; + int ret; + + lockdep_assert_held(&kvm->mmu_lock); + + while (addr < end) { + if (need_topup_split_caches_or_resched(pcache, count)) { + spin_unlock(&kvm->mmu_lock); + cond_resched(); + + ret =3D kvm_mmu_topup_memory_cache(pcache, count); + if (ret) { + kvm_err("Failed to toup split page cache\n"); + spin_lock(&kvm->mmu_lock); + return; + } + spin_lock(&kvm->mmu_lock); + } + + ret =3D kvm_riscv_gstage_split_huge(gstage, pcache, addr, 0, flush); + if (ret !=3D 0) { + kvm_err("split huge page for addr(0x%llx) failed %d\n", addr, ret); + break; + } + + addr +=3D PMD_SIZE; + } +} + void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm *kvm, struct kvm_memory_slot *slot, gfn_t gfn_offset, @@ -136,6 +182,23 @@ void kvm_arch_flush_shadow_memslot(struct kvm *kvm, spin_unlock(&kvm->mmu_lock); } +static void mmu_split_memory_region(struct kvm *kvm, int slot) +{ + struct kvm_memslots *slots =3D kvm_memslots(kvm); + struct kvm_memory_slot *memslot =3D id_to_memslot(slots, slot); + phys_addr_t start =3D memslot->base_gfn << PAGE_SHIFT; + phys_addr_t end =3D (memslot->base_gfn + memslot->npages) << PAGE_SHIFT; + struct kvm_gstage gstage; + + kvm_riscv_gstage_init(&gstage, kvm); + + spin_lock(&kvm->mmu_lock); + mmu_split_huge_pages(&gstage, start, end, false); + spin_unlock(&kvm->mmu_lock); + + kvm_flush_remote_tlbs_memslot(kvm, memslot); +} + void kvm_arch_commit_memory_region(struct kvm *kvm, struct kvm_memory_slot *old, const struct kvm_memory_slot *new, @@ -150,6 +213,7 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, if (kvm_dirty_log_manual_protect_and_init_set(kvm)) return; mmu_wp_memory_region(kvm, new->id); + mmu_split_memory_region(kvm, new->id); } } --=20 2.43.5 From nobody Mon Jun 8 07:30:43 2026 Received: from mxhk.zte.com.cn (mxhk.zte.com.cn [160.30.148.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3ABCD3FE37C; Wed, 3 Jun 2026 09:58:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=160.30.148.35 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480719; cv=none; b=KyVSkkZvRVuWnA75R6krVyH9Fj3sZ5kGDQTYmA8X69JH2Wzfeb0o6/iBYcNTjJBl5B8z+yrqUwuqzdsP09l8D3DGfgA1JtBVMk/Fdz5HlvmObbOfUooN5VQanr5AMM00Qk+FxJ+67xxrxVyCsPrwkuZHtvUhymaGfbnmAmT61e0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480719; c=relaxed/simple; bh=cUf6efsXp0nEOHRuogghZAZWt46EvQSM6VIyrfQ74YY=; h=Message-ID:In-Reply-To:References:Date:Mime-Version:From:To:Cc: Subject:Content-Type; b=nkhkRskSfrBd8wehaDJBoZjBC7Anpg67fWnEtNpiY81xjeq1JblkQOLcpfHy+ChGuhZPe1VfZ/pU6oyLtx9OenO4ASQ0VF0umUy/WKQMZAn6LE1ahnZ0T0J2Idjahc4ZVip/SIZOvqnnnCMT1FuDhc99HkaW9oYP99YFr8Su+GQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn; spf=pass smtp.mailfrom=zte.com.cn; arc=none smtp.client-ip=160.30.148.35 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zte.com.cn Received: from mse-fl2.zte.com.cn (unknown [10.5.228.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mxhk.zte.com.cn (FangMail) with ESMTPS id 4gVjnm2Zk0z8Xrrn; Wed, 03 Jun 2026 17:58:36 +0800 (CST) Received: from szxl2zmapp05.zte.com.cn ([10.1.32.37]) by mse-fl2.zte.com.cn with SMTP id 6539wQFX009049; Wed, 3 Jun 2026 17:58:26 +0800 (+08) (envelope-from wang.yechao255@zte.com.cn) Received: from mapi (szxlzmapp04[null]) by mapi (Zmail) with MAPI id mid12; Wed, 3 Jun 2026 17:58:29 +0800 (CST) X-Zmail-TransId: 2b066a1ffac536f-f9cd5 X-Mailer: Zmail v1.0 Message-ID: <20260603175829412hzKDF23RSPIQCliiSiIwg@zte.com.cn> In-Reply-To: <20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn> References: 20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn Date: Wed, 3 Jun 2026 17:58:29 +0800 (CST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 From: To: , , , , , Cc: , , , , Subject: =?UTF-8?B?W1BBVENIIHYyIDMvNF0gUklTQy1WOiBLVk06IFNwbGl0IGh1Z2UgcGFnZXMgZHVyaW5nIEtWTV9DTEVBUl9ESVJUWV9MT0c=?= X-MAIL: mse-fl2.zte.com.cn 6539wQFX009049 X-TLS: YES X-ENVELOPE-SENDER: wang.yechao255@zte.com.cn X-SOURCE-IP: 10.5.228.133 unknown Wed, 03 Jun 2026 17:58:36 +0800 X-CLEAN: YES X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6A1FFACC.000/4gVjnm2Zk0z8Xrrn Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wang Yechao Split huge pages on the range specified using KVM_CLEAR_DIRTY_LOG. And do not split when enabling dirty logging if KVM_DIRTY_LOG_INITIALLY_SET is set. Signed-off-by: Wang Yechao Reviewed-by: Anup Patel --- arch/riscv/kvm/mmu.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c index 51bd1db74e1a..d04680687f4a 100644 --- a/arch/riscv/kvm/mmu.c +++ b/arch/riscv/kvm/mmu.c @@ -149,6 +149,9 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kvm= *kvm, kvm_riscv_gstage_init(&gstage, kvm); kvm_riscv_gstage_wp_range(&gstage, start, end); + + if (kvm_dirty_log_manual_protect_and_init_set(kvm)) + mmu_split_huge_pages(&gstage, start, end, true); } void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *mems= lot) --=20 2.43.5 From nobody Mon Jun 8 07:30:43 2026 Received: from mxct.zte.com.cn (mxct.zte.com.cn [183.62.165.209]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF68744BCA8; Wed, 3 Jun 2026 10:00:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=183.62.165.209 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480825; cv=none; b=p1UnrbtUmcJVo/9GaKFEJgO8LO01Fps+j0IUS6fxqal25YEfzW1ToJy8tuHS8WmxdBR/vb5kan0bjEi1zSwY90DwrQ0JMTNdvRI7GMg0fz/+pZDo7LPJ2oFeH2+qGgYtQGjDjQ0ma7CBmss47m6emG21oAAbggGJ0MPT7EDi598= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780480825; c=relaxed/simple; bh=l5KEx3N/ohq6xHCqDb9D6/azxbWBbRL1dzQfpdSvFho=; h=Message-ID:In-Reply-To:References:Date:Mime-Version:From:To:Cc: Subject:Content-Type; b=qcKfw74X0AGrW+DVcGPHe4sYlbaMGITTH2rAQaDc5wV4ndzeGEtp96no/Gu7IF+ho1iseLDslydnCxSktNBxB6a/CERaFfMKktePXFZF4OR0tCeYlPnxezhjQgJOJoyA9h3WJ5qNV4eWS8yF9IjOgx3rMJMJ0UmbNUl8s6KMyt0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn; spf=pass smtp.mailfrom=zte.com.cn; arc=none smtp.client-ip=183.62.165.209 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=zte.com.cn Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zte.com.cn Received: from mse-fl1.zte.com.cn (unknown [10.5.228.132]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mxct.zte.com.cn (FangMail) with ESMTPS id 4gVjqj4Sq7z59ys5; Wed, 03 Jun 2026 18:00:17 +0800 (CST) Received: from szxl2zmapp07.zte.com.cn ([10.1.32.52]) by mse-fl1.zte.com.cn with SMTP id 653A082J081933; Wed, 3 Jun 2026 18:00:08 +0800 (+08) (envelope-from wang.yechao255@zte.com.cn) Received: from mapi (szxl2zmapp06[null]) by mapi (Zmail) with MAPI id mid12; Wed, 3 Jun 2026 18:00:11 +0800 (CST) X-Zmail-TransId: 2b086a1ffb2bbd8-e8550 X-Mailer: Zmail v1.0 Message-ID: <202606031800111580inoldUz6HzVPmAbLW2SX@zte.com.cn> In-Reply-To: <20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn> References: 20260603175256408L0jnqGs1cJGc0ijCdujci@zte.com.cn Date: Wed, 3 Jun 2026 18:00:11 +0800 (CST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 From: To: , , , , , , Cc: , , , , Subject: =?UTF-8?B?W1BBVENIIHYyIDQvNF0gUklTQy1WOiBLVk06IEFkZCB0aGUgZWFnZXJfcGFnZV9zcGxpdCBtb2R1bGUgcGFyYW1ldGVy?= X-MAIL: mse-fl1.zte.com.cn 653A082J081933 X-TLS: YES X-ENVELOPE-SENDER: wang.yechao255@zte.com.cn X-SOURCE-IP: 10.5.228.132 unknown Wed, 03 Jun 2026 18:00:17 +0800 X-CLEAN: YES X-Fangmail-Anti-Spam-Filtered: true X-Fangmail-MID-QID: 6A1FFB31.000/4gVjqj4Sq7z59ys5 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wang Yechao Add an eager_page_split module parameter for RISC-V KVM, following the same approach as on x86. This parameter controls whether eager page splitting is enabled. The default value is on. When eager page splitting is enabled, KVM proactively splits large pages (huge pages) into smaller pages when needed for dirty logging or other operations. Disabling it can be beneficial for VM workloads that rarely perform writes, or that only write to a small region of memory, as it allows huge pages to remain intact for read accesses. Signed-off-by: Wang Yechao --- Documentation/admin-guide/kernel-parameters.txt | 7 +++++-- arch/riscv/kvm/mmu.c | 13 ++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentatio= n/admin-guide/kernel-parameters.txt index 4d0f545fb3ec..d443b5313b79 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -3059,7 +3059,7 @@ Kernel parameters Default is 0 (don't ignore, but inject #GP) kvm.eager_page_split=3D - [KVM,X86] Controls whether or not KVM will try to + [KVM,X86,RISCV] Controls whether or not KVM will try to proactively split all huge pages during dirty logging. Eager page splitting reduces interruptions to vCPU execution by eliminating the write-protection faults @@ -3079,7 +3079,10 @@ Kernel parameters the KVM_CLEAR_DIRTY ioctl, and only for the pages being cleared. - Eager page splitting is only supported when kvm.tdp_mmu=3DY. + On x86, eager page splitting is only supported when + kvm.tdp_mmu=3DY. + + On RISCV, eager page splitting is supported by default. Default is Y (on). diff --git a/arch/riscv/kvm/mmu.c b/arch/riscv/kvm/mmu.c index d04680687f4a..7a910c5a61fe 100644 --- a/arch/riscv/kvm/mmu.c +++ b/arch/riscv/kvm/mmu.c @@ -16,6 +16,9 @@ #include #include +bool __read_mostly eager_page_split =3D true; +module_param(eager_page_split, bool, 0644); + static void mmu_wp_memory_region(struct kvm *kvm, int slot) { struct kvm_memslots *slots =3D kvm_memslots(kvm); @@ -150,8 +153,10 @@ void kvm_arch_mmu_enable_log_dirty_pt_masked(struct kv= m *kvm, kvm_riscv_gstage_wp_range(&gstage, start, end); - if (kvm_dirty_log_manual_protect_and_init_set(kvm)) - mmu_split_huge_pages(&gstage, start, end, true); + if (kvm_dirty_log_manual_protect_and_init_set(kvm)) { + if (READ_ONCE(eager_page_split)) + mmu_split_huge_pages(&gstage, start, end, true); + } } void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *mems= lot) @@ -216,7 +221,9 @@ void kvm_arch_commit_memory_region(struct kvm *kvm, if (kvm_dirty_log_manual_protect_and_init_set(kvm)) return; mmu_wp_memory_region(kvm, new->id); - mmu_split_memory_region(kvm, new->id); + + if (READ_ONCE(eager_page_split)) + mmu_split_memory_region(kvm, new->id); } } --=20 2.43.5