selftests/vm: only run 128TBswitch with 5-level paging
The test va_128TBswitch.c expects to be able to pass mmap an address hint and length that cross the address 1<<47. On x86_64, this is not possible without 5-level page tables, so the test fails. The test is already only run on 64-bit powerpc and x86_64 archs, but this patch adds an additional check on x86_64 that skips the test if PG_TABLE_LEVELS < 5. There is precedent for checking /proc/config.gz in selftests, e.g. in selftests/firmware. Running the tests produces the desired output: sudo make -C tools/testing/selftests TARGETS=vm run_tests --------------------------- running ./va_128TBswitch.sh --------------------------- ./va_128TBswitch.sh: PG_TABLE_LEVELS=4, must be >= 5 to run this test [SKIP] ------------------------------- [adam@wowsignal.io: restrict the check to x86_64] Link: https://lkml.kernel.org/r/20220628163654.337600-1-adam@wowsignal.io [adam@wowsignal.io: fix formatting issues, rename "die" to "fail"] Link: https://lkml.kernel.org/r/20220701163030.415735-1-adam@wowsignal.io Link: https://lkml.kernel.org/r/20220627163912.5581-1-adam@wowsignal.io Signed-off-by: Adam Sindelar <adam@wowsignal.io> Cc: Adam Sindelar <ats@fb.com> Cc: David Vernet <void@manifault.com> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
1baec203b7
commit
4f2930c671
@ -93,6 +93,7 @@ TEST_PROGS := run_vmtests.sh
|
||||
|
||||
TEST_FILES := test_vmalloc.sh
|
||||
TEST_FILES += test_hmm.sh
|
||||
TEST_FILES += va_128TBswitch.sh
|
||||
|
||||
KSFT_KHDR_INSTALL := 1
|
||||
include ../lib.mk
|
||||
|
@ -151,7 +151,7 @@ if [ $VADDR64 -ne 0 ]; then
|
||||
run_test ./virtual_address_range
|
||||
|
||||
# virtual address 128TB switch test
|
||||
run_test ./va_128TBswitch
|
||||
run_test ./va_128TBswitch.sh
|
||||
fi # VADDR64
|
||||
|
||||
# vmalloc stability smoke test
|
||||
|
54
tools/testing/selftests/vm/va_128TBswitch.sh
Normal file
54
tools/testing/selftests/vm/va_128TBswitch.sh
Normal file
@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Copyright (C) 2022 Adam Sindelar (Meta) <adam@wowsignal.io>
|
||||
#
|
||||
# This is a test for mmap behavior with 5-level paging. This script wraps the
|
||||
# real test to check that the kernel is configured to support at least 5
|
||||
# pagetable levels.
|
||||
|
||||
# 1 means the test failed
|
||||
exitcode=1
|
||||
|
||||
# Kselftest framework requirement - SKIP code is 4.
|
||||
ksft_skip=4
|
||||
|
||||
fail()
|
||||
{
|
||||
echo "$1"
|
||||
exit $exitcode
|
||||
}
|
||||
|
||||
check_supported_x86_64()
|
||||
{
|
||||
local config="/proc/config.gz"
|
||||
[[ -f "${config}" ]] || config="/boot/config-$(uname -r)"
|
||||
[[ -f "${config}" ]] || fail "Cannot find kernel config in /proc or /boot"
|
||||
|
||||
# gzip -dcfq automatically handles both compressed and plaintext input.
|
||||
# See man 1 gzip under '-f'.
|
||||
local pg_table_levels=$(gzip -dcfq "${config}" | grep PGTABLE_LEVELS | cut -d'=' -f 2)
|
||||
|
||||
if [[ "${pg_table_levels}" -lt 5 ]]; then
|
||||
echo "$0: PGTABLE_LEVELS=${pg_table_levels}, must be >= 5 to run this test"
|
||||
exit $ksft_skip
|
||||
fi
|
||||
}
|
||||
|
||||
check_test_requirements()
|
||||
{
|
||||
# The test supports x86_64 and powerpc64. We currently have no useful
|
||||
# eligibility check for powerpc64, and the test itself will reject other
|
||||
# architectures.
|
||||
case `uname -m` in
|
||||
"x86_64")
|
||||
check_supported_x86_64
|
||||
;;
|
||||
*)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
check_test_requirements
|
||||
./va_128TBswitch
|
Loading…
x
Reference in New Issue
Block a user