Commit 6bd8a97a authored by Michael Ellerman's avatar Michael Ellerman Committed by Khalid Elmously

selftests/powerpc: Skip the subpage_prot tests if the syscall is unavailable

BugLink: https://bugs.launchpad.net/bugs/1775771

[ Upstream commit cd4a6f3a ]

The subpage_prot syscall is only functional when the system is using
the Hash MMU. Since commit 5b2b8071 ("powerpc/mm: Invalidate
subpage_prot() system call on radix platforms") it returns ENOENT when
the Radix MMU is active. Currently this just makes the test fail.

Additionally the syscall is not available if the kernel is built with
4K pages, or if CONFIG_PPC_SUBPAGE_PROT=n, in which case it returns
ENOSYS because the syscall is missing entirely.

So check explicitly for ENOENT and ENOSYS and skip if we see either of
those.
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarJuerg Haefliger <juergh@canonical.com>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
parent b43f201a
...@@ -135,6 +135,16 @@ static int run_test(void *addr, unsigned long size) ...@@ -135,6 +135,16 @@ static int run_test(void *addr, unsigned long size)
return 0; return 0;
} }
static int syscall_available(void)
{
int rc;
errno = 0;
rc = syscall(__NR_subpage_prot, 0, 0, 0);
return rc == 0 || (errno != ENOENT && errno != ENOSYS);
}
int test_anon(void) int test_anon(void)
{ {
unsigned long align; unsigned long align;
...@@ -145,6 +155,8 @@ int test_anon(void) ...@@ -145,6 +155,8 @@ int test_anon(void)
void *mallocblock; void *mallocblock;
unsigned long mallocsize; unsigned long mallocsize;
SKIP_IF(!syscall_available());
if (getpagesize() != 0x10000) { if (getpagesize() != 0x10000) {
fprintf(stderr, "Kernel page size must be 64K!\n"); fprintf(stderr, "Kernel page size must be 64K!\n");
return 1; return 1;
...@@ -180,6 +192,8 @@ int test_file(void) ...@@ -180,6 +192,8 @@ int test_file(void)
off_t filesize; off_t filesize;
int fd; int fd;
SKIP_IF(!syscall_available());
fd = open(file_name, O_RDWR); fd = open(file_name, O_RDWR);
if (fd == -1) { if (fd == -1) {
perror("failed to open file"); perror("failed to open file");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment