This series adds a new aarch64 selftest for testing stage 2 fault handling
for various combinations of guest accesses (e.g., write, S1PTW), backing
sources (e.g., anon), and types of faults (e.g., read on hugetlbfs with a
hole, write on a readonly memslot). Each test tries a different combination
and then checks that the access results in the right behavior (e.g., uffd
faults with the right address and write/read flag). Some interesting
combinations are:
- loading an instruction leads to a stage 1 page-table-walk that misses on
stage 2 because the backing memslot for the page table it not in host
memory (a hole was punched right there) and the fault is handled using
userfaultfd. The expected behavior is that this leads to a userfaultfd
fault marked as a write. See commit c4ad98e4b72c ("KVM: arm64: Assume
write fault on S1PTW permission fault on instruction fetch") for why
that's a write.
- a cas (compare-and-swap) on a readonly memslot leads to a failed vcpu
run.
- write-faulting on a memslot that's marked for userfaultfd handling and
dirty logging should result in a uffd fault and having the respective bit
set in the dirty log.
The first 8 commits of this series add library support. The first one adds
a new userfaultfd library. Commits 2-5 add some misc library changes that
will be used by the new test, like a library function to get the GPA of a
PTE. Commits 6-8 breaks the implicit assumption that code and page tables
live in memslot memslots should allocators use. This is then used by the
new test to place the page tables in a specific memslot. The last 5
commits add the new selftest, one type of test at a time. It first adds
core tests, then uffd, then dirty logging, then readonly memslots tests,
and finally combinations of the previous ones (like uffd and dirty logging
at the same time).
v7 -> v8:
https://lore.kernel.org/kvmarm/[email protected]/
- applied Sean's suggestion of adding a fourth region: DATA, and renamed
the old DATA one to DATA_TEST. [Sean]
- removed some unneeded code in page_fault_test.c. [Andrew]
- removed r-b's from Andrew and Oliver in commit "KVM: selftests: Use the
right memslot for code, page-tables, and data allocations", as the commit
changed quite a bit (again). Thanks for the reviews! would it have been OK
to keep it? not sure how strict we all are about collecting r-b's on a
commit that changed.
v6 -> v7: https://lore.kernel.org/kvmarm/yyi03sx5hx36m%[email protected]/
- removed struct kvm_vm_mem_params. Changed page_fault_test.c accordingly.
[Sean]
- applied Oliver's patch to fix page_fault_test compilation warnings. [Oliver]
- added R-b's from Oliver and Andrew. Didn't Andrew's R-b on 6/13 as the
commit changed afterwards.
v5 -> v6:
https://lore.kernel.org/kvmarm/[email protected]/
- added "enum memslot_type" and all the related cleanups due to it [Andrew]
- default kvm_vm_mem_default with size=0 [Andrew,Sean]
- __vm_vaddr_alloc() taking "enum memslot_type" and all the related
cleanups due to this change [Andrew]
v4 -> v5:
https://lore.kernel.org/kvmarm/[email protected]/
- biggest change: followed suggestion from Sean and Andrew regarding a new
arg for vm_create() to specify the guest memory layout. That's taken care
of with these two new commits: KVM: selftests: Use the right memslot for
code, page-tables, and data allocations KVM: selftests: Change
____vm_create() to take struct kvm_vm_mem_params plus the respective
changes in the page_fault_test itself (mostly code reduction).
- dropped some commits that are not needed after the above change:
KVM: selftests: aarch64: Export _virt_pg_map with a pt_memslot arg
KVM: selftests: Add vm_alloc_page_table_in_memslot library function
KVM: selftests: Add vm_mem_region_get_src_fd library function
- addressed Oliver comments in commit "KVM: selftests: aarch64: Add
aarch64/page_fault_test"
- collect r-b's from Andrew
Ricardo Koller (14):
KVM: selftests: Add a userfaultfd library
KVM: selftests: aarch64: Add virt_get_pte_hva() library function
KVM: selftests: Add missing close and munmap in
__vm_mem_region_delete()
KVM: selftests: aarch64: Construct DEFAULT_MAIR_EL1 using sysreg.h
macros
tools: Copy bitfield.h from the kernel sources
KVM: selftests: Stash backing_src_type in struct userspace_mem_region
KVM: selftests: Add vm->memslots[] and enum kvm_mem_region_type
KVM: selftests: Fix alignment in virt_arch_pgd_alloc() and
vm_vaddr_alloc()
KVM: selftests: Use the right memslot for code, page-tables, and data
allocations
KVM: selftests: aarch64: Add aarch64/page_fault_test
KVM: selftests: aarch64: Add userfaultfd tests into page_fault_test
KVM: selftests: aarch64: Add dirty logging tests into page_fault_test
KVM: selftests: aarch64: Add readonly memslot tests into
page_fault_test
KVM: selftests: aarch64: Add mix of tests into page_fault_test
tools/include/linux/bitfield.h | 176 +++
tools/testing/selftests/kvm/.gitignore | 1 +
tools/testing/selftests/kvm/Makefile | 2 +
.../selftests/kvm/aarch64/page_fault_test.c | 1110 +++++++++++++++++
.../selftests/kvm/demand_paging_test.c | 228 +---
.../selftests/kvm/include/aarch64/processor.h | 35 +-
.../selftests/kvm/include/kvm_util_base.h | 31 +-
.../selftests/kvm/include/userfaultfd_util.h | 45 +
.../selftests/kvm/lib/aarch64/processor.c | 48 +-
tools/testing/selftests/kvm/lib/elf.c | 3 +-
tools/testing/selftests/kvm/lib/kvm_util.c | 82 +-
.../selftests/kvm/lib/riscv/processor.c | 29 +-
.../selftests/kvm/lib/s390x/processor.c | 8 +-
.../selftests/kvm/lib/userfaultfd_util.c | 186 +++
.../selftests/kvm/lib/x86_64/processor.c | 13 +-
15 files changed, 1721 insertions(+), 276 deletions(-)
create mode 100644 tools/include/linux/bitfield.h
create mode 100644 tools/testing/selftests/kvm/aarch64/page_fault_test.c
create mode 100644 tools/testing/selftests/kvm/include/userfaultfd_util.h
create mode 100644 tools/testing/selftests/kvm/lib/userfaultfd_util.c
--
2.37.3.968.ga6b4b080e4-goog
_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm