]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RISC-V: KVM: Fix skip of valid pages in kvm_riscv_gstage_unmap_range
authorWu Fei <wu.fei9@sanechips.com.cn>
Thu, 4 Jun 2026 23:03:15 +0000 (07:03 +0800)
committerAnup Patel <anup@brainfault.org>
Sun, 7 Jun 2026 06:11:43 +0000 (11:41 +0530)
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>
arch/riscv/kvm/gstage.c

index 30ce40e8809fbb9846a9d86ea8d11537588b079a..c4c3b79567f10d09a00cc2947e67dd140c49b30f 100644 (file)
@@ -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