diff options
| author | Wu Fei <wu.fei9@sanechips.com.cn> | 2026-06-05 07:03:15 +0800 |
|---|---|---|
| committer | Anup Patel <anup@brainfault.org> | 2026-06-07 11:41:43 +0530 |
| commit | a5f8307e2eaaf5d3acae6554d84fcd2683613cc4 (patch) | |
| tree | 62ac9da136a95a677669e3ceba544f0f12335899 | |
| parent | 0d9dc20842dbe0a9c66be9bb1638f3e221d87bb0 (diff) | |
| download | lwn-a5f8307e2eaaf5d3acae6554d84fcd2683613cc4.tar.gz lwn-a5f8307e2eaaf5d3acae6554d84fcd2683613cc4.zip | |
RISC-V: KVM: Fix skip of valid pages in kvm_riscv_gstage_unmap_range
Same as kvm_riscv_gstage_wp_range, the possible valid pages should not
be skipped if !found_leaf. Different from wp case, which can
write-protect more than asked, unmap can't do that, no splitting is
added right now but a warning is logged instead.
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-3-atwufei@163.com
Signed-off-by: Anup Patel <anup@brainfault.org>
| -rw-r--r-- | arch/riscv/kvm/gstage.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/arch/riscv/kvm/gstage.c b/arch/riscv/kvm/gstage.c index 30ce40e8809f..c4c3b79567f1 100644 --- a/arch/riscv/kvm/gstage.c +++ b/arch/riscv/kvm/gstage.c @@ -418,15 +418,19 @@ bool kvm_riscv_gstage_unmap_range(struct kvm_gstage *gstage, if (ret) break; - if (!found_leaf) - goto next; - - if (!(addr & (page_size - 1)) && ((end - addr) >= page_size)) - flush |= kvm_riscv_gstage_op_pte(gstage, addr, ptep, - ptep_level, GSTAGE_OP_CLEAR); + if (!found_leaf) { + addr = ALIGN(addr + 1, page_size); + } else { + if (!(addr & (page_size - 1)) && ((end - addr) >= page_size)) + flush |= kvm_riscv_gstage_op_pte(gstage, addr, ptep, + ptep_level, GSTAGE_OP_CLEAR); + else { + WARN_ONCE(1, "Skip unmap range addr: %#llx, end: %#llx, page_size: %#lx\n", + addr, end, page_size); + } -next: - addr += page_size; + addr += page_size; + } /* * If the range is too large, release the kvm->mmu_lock |
