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) , if found_leaf of 0xfffff01fc000 returns false and page_size is 2MB, it skips the whole range, but it's possible to have valid entries in [0xfffff0200000, 0xfffff023c000), so only [0xfffff01fc000, 0xfffff0200000) can be skipped safely. Both wp/unamp have the same pattern.
dirty_log_test intentionally sets up the unaligned guest physical address, after riscv kvm enabling KVM_DIRTY_LOG_INITIALLY_SET, it's easy to trigger this bug if there is a larger window for guest to write more pages before first collect_dirty_pages. Wu Fei (3): KVM: selftests: Add unit to dirty_log_test RISC-V: KVM: Fix skip of valid pages in kvm_riscv_gstage_wp_range RISC-V: KVM: Fix skip of valid pages in kvm_riscv_gstage_unmap_range arch/riscv/kvm/gstage.c | 39 +++++++++++--------- tools/testing/selftests/kvm/dirty_log_test.c | 24 ++++++++---- 2 files changed, 39 insertions(+), 24 deletions(-) -- 2.43.0

