[PATCH v2 0/2] KVM: riscv: Fix hugetlb G-stage block mapping eligibility

From: Jinyu Tang

Date: Thu Jun 04 2026 - 10:47:01 EST


RISC-V KVM checks memslot alignment and head/tail coverage before
installing THP-backed PMD G-stage block mappings, but the hugetlb path
has used the hugetlb VMA size directly. That can be wrong for memslots
whose HVA and GPA have different offsets within the target block, or for
partial head/tail blocks.

Generalize the existing block eligibility helper so it can check a
caller-provided target size, use it to select hugetlb mappings with a
PUD -> PMD -> PAGE_SIZE fallback, and add a selftest mode that creates a
hugetlb memslot with a deliberate HVA/GPA offset mismatch.

Tested on a QEMU RISC-V host with 8 pre-allocated 2MB hugepages:

# ./kvm_page_table_test -m 19 -s anonymous -b 4M -v 1
# ./kvm_page_table_test -m 19 -s anonymous_hugetlb_2mb -b 4M -v 1
# timeout 30s ./kvm_page_table_test \
-m 19 -s anonymous_hugetlb_2mb -b 4M -v 1 -u

base + selftest:
anonymous: PASS
aligned hugetlb: PASS
misaligned hugetlb: timeout

patched:
anonymous: PASS
aligned hugetlb: PASS
misaligned hugetlb: PASS

v1 -> v2:
- Squash the helper parameterization into the hugetlb fix
- Use the ALIGN()/ALIGN_DOWN() form suggested by Nutty Liu and Anup
for the memslot boundary check.

Jinyu Tang (2):
KVM: riscv: Check hugetlb block mappings against memslot bounds
KVM: selftests: Add a hugetlb memslot alignment test mode

arch/riscv/kvm/mmu.c | 54 +++++++++++++++----
.../selftests/kvm/kvm_page_table_test.c | 28 +++++++---
2 files changed, 66 insertions(+), 16 deletions(-)

--
2.43.0