summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWu Fei <wu.fei9@sanechips.com.cn>2026-06-05 07:03:14 +0800
committerAnup Patel <anup@brainfault.org>2026-06-07 11:41:43 +0530
commit0d9dc20842dbe0a9c66be9bb1638f3e221d87bb0 (patch)
tree53323dabd17032459a876464638a5f26fe4ecb7e
parentc8aafbebfc95d9b65b9b86573dc47723fa621358 (diff)
downloadlinux-stable-0d9dc20842dbe0a9c66be9bb1638f3e221d87bb0.tar.gz
linux-stable-0d9dc20842dbe0a9c66be9bb1638f3e221d87bb0.zip
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 <wu.fei9@sanechips.com.cn> Reviewed-by: Anup Patel <anup@brainfault.org> Link: https://lore.kernel.org/r/20260604230317.30501-2-atwufei@163.com Signed-off-by: Anup Patel <anup@brainfault.org>
-rw-r--r--arch/riscv/kvm/gstage.c16
1 files changed, 8 insertions, 8 deletions
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;