summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWu Fei <wu.fei9@sanechips.com.cn>2026-06-05 07:03:15 +0800
committerAnup Patel <anup@brainfault.org>2026-06-07 11:41:43 +0530
commita5f8307e2eaaf5d3acae6554d84fcd2683613cc4 (patch)
tree62ac9da136a95a677669e3ceba544f0f12335899
parent0d9dc20842dbe0a9c66be9bb1638f3e221d87bb0 (diff)
downloadlwn-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.c20
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