selftests/vm/pkeys: fix assertion in test_pkey_alloc_exhaust()
authorRam Pai <linuxram@us.ibm.com>
Thu, 4 Jun 2020 23:52:22 +0000 (16:52 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Jun 2020 02:06:27 +0000 (19:06 -0700)
Some pkeys which are valid on the hardware are reserved and not available
for application use.  These keys cannot be allocated.

test_pkey_alloc_exhaust() tries to account for these and has an assertion
which validates if all available pkeys have been exahaustively allocated.
However, the expression that is currently used is only valid for x86.  On
powerpc, a pkey is additionally reserved as compared to x86.  Hence, the
assertion is made to use an arch-specific helper to get the correct count
of reserved pkeys.

Signed-off-by: Ram Pai <linuxram@us.ibm.com>
Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Acked-by: Dave Hansen <dave.hansen@intel.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Florian Weimer <fweimer@redhat.com>
Cc: "Desnes A. Nunes do Rosario" <desnesn@linux.vnet.ibm.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Thiago Jung Bauermann <bauerman@linux.ibm.com>
Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Michal Suchanek <msuchanek@suse.de>
Cc: Shuah Khan <shuah@kernel.org>
Link: http://lkml.kernel.org/r/38b08d0318820ae46af3aa6048384fd8056c3df7.1585646528.git.sandipan@linux.ibm.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
tools/testing/selftests/vm/protection_keys.c

index e6de078a9196f85b75f6487f7d60e6125cf8a478..5fcbbc525364ef897e3be8fa2d5c1d286f4e5307 100644 (file)
@@ -1153,6 +1153,7 @@ void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
        dprintf3("%s()::%d\n", __func__, __LINE__);
 
        /*
+        * On x86:
         * There are 16 pkeys supported in hardware.  Three are
         * allocated by the time we get here:
         *   1. The default key (0)
@@ -1160,8 +1161,16 @@ void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
         *   3. One allocated by the test code and passed in via
         *      'pkey' to this function.
         * Ensure that we can allocate at least another 13 (16-3).
+        *
+        * On powerpc:
+        * There are either 5, 28, 29 or 32 pkeys supported in
+        * hardware depending on the page size (4K or 64K) and
+        * platform (powernv or powervm). Four are allocated by
+        * the time we get here. These include pkey-0, pkey-1,
+        * exec-only pkey and the one allocated by the test code.
+        * Ensure that we can allocate the remaining.
         */
-       pkey_assert(i >= NR_PKEYS-3);
+       pkey_assert(i >= (NR_PKEYS - get_arch_reserved_keys() - 1));
 
        for (i = 0; i < nr_allocated_pkeys; i++) {
                err = sys_pkey_free(allocated_pkeys[i]);