diff options
| author | Wu Fei <wu.fei9@sanechips.com.cn> | 2026-06-05 07:03:14 +0800 |
|---|---|---|
| committer | Anup Patel <anup@brainfault.org> | 2026-06-07 11:41:43 +0530 |
| commit | 0d9dc20842dbe0a9c66be9bb1638f3e221d87bb0 (patch) | |
| tree | 53323dabd17032459a876464638a5f26fe4ecb7e | |
| parent | c8aafbebfc95d9b65b9b86573dc47723fa621358 (diff) | |
| download | linux-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.c | 16 |
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; |
