From: Wu Fei Date: Thu, 4 Jun 2026 23:03:14 +0000 (+0800) Subject: RISC-V: KVM: Fix skip of valid pages in kvm_riscv_gstage_wp_range X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0d9dc20842dbe0a9c66be9bb1638f3e221d87bb0;p=thirdparty%2Flinux.git RISC-V: KVM: Fix skip of valid pages in kvm_riscv_gstage_wp_range The current gstage range walker unconditionally advances by 'page_size' when a leaf PTE is not found, e.g. when the range to wp is [0xfffff01fc000, 0xfffff023c000) and page_size is 2MB, if found_leaf of 0xfffff01fc000 returns false, it skip the whole range, but it's possible to have valid entries in [0xfffff0200000, 0xfffff023c000). Signed-off-by: Wu Fei Reviewed-by: Anup Patel Link: https://lore.kernel.org/r/20260604230317.30501-2-atwufei@163.com Signed-off-by: Anup Patel --- diff --git a/arch/riscv/kvm/gstage.c b/arch/riscv/kvm/gstage.c index b83b85d1c016..30ce40e8809f 100644 --- a/arch/riscv/kvm/gstage.c +++ b/arch/riscv/kvm/gstage.c @@ -455,14 +455,14 @@ bool kvm_riscv_gstage_wp_range(struct kvm_gstage *gstage, gpa_t start, gpa_t end if (ret) break; - if (!found_leaf) - goto next; - - addr = ALIGN_DOWN(addr, page_size); - flush |= kvm_riscv_gstage_op_pte(gstage, addr, ptep, - ptep_level, GSTAGE_OP_WP); -next: - addr += page_size; + if (!found_leaf) { + addr = ALIGN(addr + 1, page_size); + } else { + addr = ALIGN_DOWN(addr, page_size); + flush |= kvm_riscv_gstage_op_pte(gstage, addr, ptep, + ptep_level, GSTAGE_OP_WP); + addr += page_size; + } } return flush;