selftest/mm: va_high_addr_switch: add ppc64 support check
authorLi Wang <liwang@redhat.com>
Thu, 27 Mar 2025 11:48:13 +0000 (19:48 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 1 Apr 2025 22:17:11 +0000 (15:17 -0700)
Add PPC64 Radix MMU support to the va_high_addr_switch.sh by introducing
check_supported_ppc64().  The function verifies:

  - 5-level paging (PGTABLE_LEVELS >= 5) enable in kernel config
  - Radix MMU (required for PPC64 5-level translation)
  - HugePages availability (needed for some tests)

If any check fails, the test is skipped (ksft_skip).  This ensures
compatibility with Power9/Power10 systems running in Radix MMU mode.

Avoid failures on 4-level paging system:

  # mmap(NULL, MAP_HUGETLB): 0xffffffffffffffff - FAILED
  # mmap(LOW_ADDR, MAP_HUGETLB): 0xffffffffffffffff - FAILED
  # mmap(HIGH_ADDR, MAP_HUGETLB): 0xffffffffffffffff - FAILED
  # mmap(HIGH_ADDR, MAP_HUGETLB) again: 0xffffffffffffffff - FAILED
  # mmap(HIGH_ADDR, MAP_FIXED | MAP_HUGETLB): 0xffffffffffffffff - FAILED
  # mmap(-1, MAP_HUGETLB): 0xffffffffffffffff - FAILED
  # mmap(-1, MAP_HUGETLB) again: 0xffffffffffffffff - FAILED
  # mmap(ADDR_SWITCH_HINT - PAGE_SIZE, 2*HUGETLB_SIZE, MAP_HUGETLB): 0xffffffffffffffff - FAILED
  # mmap(ADDR_SWITCH_HINT , 2*HUGETLB_SIZE, MAP_FIXED | MAP_HUGETLB): 0xffffffffffffffff - FAILED

Link: https://lkml.kernel.org/r/20250327114813.25980-1-liwang@redhat.com
Signed-off-by: Li Wang <liwang@redhat.com>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Kirill A. Shuemov <kirill.shutemov@linux.intel.com>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
tools/testing/selftests/mm/va_high_addr_switch.sh

index 2c725773cd794e1038e3f8fc87943ab6a0cc673e..1f92e8caceaceb5544eaf2d4bda2916b79a09146 100755 (executable)
@@ -41,6 +41,31 @@ check_supported_x86_64()
        fi
 }
 
+check_supported_ppc64()
+{
+       local config="/proc/config.gz"
+       [[ -f "${config}" ]] || config="/boot/config-$(uname -r)"
+       [[ -f "${config}" ]] || fail "Cannot find kernel config in /proc or /boot"
+
+       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
+
+       local mmu_support=$(grep -m1 "mmu" /proc/cpuinfo | awk '{print $3}')
+       if [[ "$mmu_support" != "radix" ]]; then
+               echo "$0: System does not use Radix MMU, required for 5-level paging"
+               exit $ksft_skip
+       fi
+
+       local hugepages_total=$(awk '/HugePages_Total/ {print $2}' /proc/meminfo)
+       if [[ "${hugepages_total}" -eq 0 ]]; then
+               echo "$0: HugePages are not enabled, required for some tests"
+               exit $ksft_skip
+       fi
+}
+
 check_test_requirements()
 {
        # The test supports x86_64 and powerpc64. We currently have no useful
@@ -50,6 +75,9 @@ check_test_requirements()
                "x86_64")
                        check_supported_x86_64
                ;;
+               "ppc64le"|"ppc64")
+                       check_supported_ppc64
+               ;;
                *)
                        return 0
                ;;