All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dev Jain <dev.jain@arm.com>
To: shuah@kernel.org, linux-arm-kernel@lists.infradead.org
Cc: linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
	Anshuman.Khandual@arm.com, suzuki.poulose@arm.com,
	ryan.roberts@arm.com, rob.herring@arm.com,
	Catalin.Marinas@arm.com, broonie@kernel.org, will@kernel.org,
	mark.rutland@arm.com, Dev Jain <dev.jain@arm.com>
Subject: [PATCH 1/4] selftests/arm: Add mm test
Date: Fri,  5 Apr 2024 14:14:07 +0530	[thread overview]
Message-ID: <20240405084410.256788-2-dev.jain@arm.com> (raw)
In-Reply-To: <20240405084410.256788-1-dev.jain@arm.com>

This patch tests the 4GB VA restriction for 32-bit processes; it is required
to test the compat layer, whether the kernel knows that it is running a 32-bit
process or not. Chunks are allocated until the VA gets exhausted; mmap must
fail beyond 4GB. This is asserted against the VA mappings found
in /proc/self/maps.

Signed-off-by: Dev Jain <dev.jain@arm.com>
---
 tools/testing/selftests/arm/mm/compat_va.c | 94 ++++++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100644 tools/testing/selftests/arm/mm/compat_va.c

diff --git a/tools/testing/selftests/arm/mm/compat_va.c b/tools/testing/selftests/arm/mm/compat_va.c
new file mode 100644
index 000000000000..3a78f240bc87
--- /dev/null
+++ b/tools/testing/selftests/arm/mm/compat_va.c
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2024 ARM Limited
+ *
+ * Author : Dev Jain <dev.jain@arm.com>
+ *
+ * Tests 4GB VA restriction for 32 bit process
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+#include <linux/sizes.h>
+#include <kselftest.h>
+
+#define MAP_CHUNK_SIZE	SZ_1M
+#define NR_CHUNKS_4G	(SZ_1G / MAP_CHUNK_SIZE) * 4	/* prevent overflow */
+
+static int validate_address_hint(void)
+{
+	char *ptr;
+
+	ptr = mmap((void *) (1UL << 29), MAP_CHUNK_SIZE, PROT_READ |
+		   PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+	if (ptr == MAP_FAILED)
+		return 0;
+
+	return 1;
+}
+
+int main(int argc, char *argv[])
+{
+	char *ptr[NR_CHUNKS_4G + 3];
+	char line[1000];
+	const char *file_name;
+	int chunks;
+	FILE *file;
+	int i;
+
+	ksft_print_header();
+	ksft_set_plan(1);
+
+	/* try allocation beyond 4 GB */
+	for (i = 0; i < NR_CHUNKS_4G + 3; ++i) {
+		ptr[i] = mmap(NULL, MAP_CHUNK_SIZE, PROT_READ | PROT_WRITE,
+			      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+		if (ptr[i] == MAP_FAILED) {
+			if (validate_address_hint())
+				ksft_exit_fail_msg("VA exhaustion failed\n");
+			break;
+		}
+	}
+
+	chunks = i;
+	if (chunks >= NR_CHUNKS_4G) {
+		ksft_test_result_fail("mmapped chunks beyond 4GB\n");
+		ksft_finished();
+	}
+
+	/* parse /proc/self/maps, confirm 32 bit VA mappings */
+	file_name = "/proc/self/maps";
+	file = fopen(file_name, "r");
+	if (file == NULL)
+		ksft_exit_fail_msg("/proc/self/maps cannot be opened\n");
+
+	while (fgets(line, sizeof(line), file)) {
+		const char *whitespace_loc, *hyphen_loc;
+
+		hyphen_loc = strchr(line, '-');
+		whitespace_loc = strchr(line, ' ');
+
+		if (!(hyphen_loc && whitespace_loc)) {
+			ksft_test_result_skip("Unexpected format");
+			ksft_finished();
+		}
+
+		if ((hyphen_loc - line > 8) ||
+		    (whitespace_loc - hyphen_loc) > 9) {
+			ksft_test_result_fail("Memory map more than 32 bits\n");
+			ksft_finished();
+		}
+	}
+
+	for (int i = 0; i < chunks; ++i)
+		munmap(ptr[i], MAP_CHUNK_SIZE);
+
+	ksft_test_result_pass("Test\n");
+	ksft_finished();
+}
-- 
2.39.2


WARNING: multiple messages have this Message-ID (diff)
From: Dev Jain <dev.jain@arm.com>
To: shuah@kernel.org, linux-arm-kernel@lists.infradead.org
Cc: linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org,
	Anshuman.Khandual@arm.com, suzuki.poulose@arm.com,
	ryan.roberts@arm.com, rob.herring@arm.com,
	Catalin.Marinas@arm.com, broonie@kernel.org, will@kernel.org,
	mark.rutland@arm.com, Dev Jain <dev.jain@arm.com>
Subject: [PATCH 1/4] selftests/arm: Add mm test
Date: Fri,  5 Apr 2024 14:14:07 +0530	[thread overview]
Message-ID: <20240405084410.256788-2-dev.jain@arm.com> (raw)
In-Reply-To: <20240405084410.256788-1-dev.jain@arm.com>

This patch tests the 4GB VA restriction for 32-bit processes; it is required
to test the compat layer, whether the kernel knows that it is running a 32-bit
process or not. Chunks are allocated until the VA gets exhausted; mmap must
fail beyond 4GB. This is asserted against the VA mappings found
in /proc/self/maps.

Signed-off-by: Dev Jain <dev.jain@arm.com>
---
 tools/testing/selftests/arm/mm/compat_va.c | 94 ++++++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100644 tools/testing/selftests/arm/mm/compat_va.c

diff --git a/tools/testing/selftests/arm/mm/compat_va.c b/tools/testing/selftests/arm/mm/compat_va.c
new file mode 100644
index 000000000000..3a78f240bc87
--- /dev/null
+++ b/tools/testing/selftests/arm/mm/compat_va.c
@@ -0,0 +1,94 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2024 ARM Limited
+ *
+ * Author : Dev Jain <dev.jain@arm.com>
+ *
+ * Tests 4GB VA restriction for 32 bit process
+ */
+
+#define _GNU_SOURCE
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+#include <linux/sizes.h>
+#include <kselftest.h>
+
+#define MAP_CHUNK_SIZE	SZ_1M
+#define NR_CHUNKS_4G	(SZ_1G / MAP_CHUNK_SIZE) * 4	/* prevent overflow */
+
+static int validate_address_hint(void)
+{
+	char *ptr;
+
+	ptr = mmap((void *) (1UL << 29), MAP_CHUNK_SIZE, PROT_READ |
+		   PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+	if (ptr == MAP_FAILED)
+		return 0;
+
+	return 1;
+}
+
+int main(int argc, char *argv[])
+{
+	char *ptr[NR_CHUNKS_4G + 3];
+	char line[1000];
+	const char *file_name;
+	int chunks;
+	FILE *file;
+	int i;
+
+	ksft_print_header();
+	ksft_set_plan(1);
+
+	/* try allocation beyond 4 GB */
+	for (i = 0; i < NR_CHUNKS_4G + 3; ++i) {
+		ptr[i] = mmap(NULL, MAP_CHUNK_SIZE, PROT_READ | PROT_WRITE,
+			      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+
+		if (ptr[i] == MAP_FAILED) {
+			if (validate_address_hint())
+				ksft_exit_fail_msg("VA exhaustion failed\n");
+			break;
+		}
+	}
+
+	chunks = i;
+	if (chunks >= NR_CHUNKS_4G) {
+		ksft_test_result_fail("mmapped chunks beyond 4GB\n");
+		ksft_finished();
+	}
+
+	/* parse /proc/self/maps, confirm 32 bit VA mappings */
+	file_name = "/proc/self/maps";
+	file = fopen(file_name, "r");
+	if (file == NULL)
+		ksft_exit_fail_msg("/proc/self/maps cannot be opened\n");
+
+	while (fgets(line, sizeof(line), file)) {
+		const char *whitespace_loc, *hyphen_loc;
+
+		hyphen_loc = strchr(line, '-');
+		whitespace_loc = strchr(line, ' ');
+
+		if (!(hyphen_loc && whitespace_loc)) {
+			ksft_test_result_skip("Unexpected format");
+			ksft_finished();
+		}
+
+		if ((hyphen_loc - line > 8) ||
+		    (whitespace_loc - hyphen_loc) > 9) {
+			ksft_test_result_fail("Memory map more than 32 bits\n");
+			ksft_finished();
+		}
+	}
+
+	for (int i = 0; i < chunks; ++i)
+		munmap(ptr[i], MAP_CHUNK_SIZE);
+
+	ksft_test_result_pass("Test\n");
+	ksft_finished();
+}
-- 
2.39.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2024-04-05  8:49 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-05  8:44 [PATCH 0/4] A new selftests/ directory for arm compatibility testing Dev Jain
2024-04-05  8:44 ` Dev Jain
2024-04-05  8:44 ` Dev Jain [this message]
2024-04-05  8:44   ` [PATCH 1/4] selftests/arm: Add mm test Dev Jain
2024-04-06 21:23   ` Muhammad Usama Anjum
2024-04-06 21:23     ` Muhammad Usama Anjum
2024-04-10  4:15     ` Dev Jain
2024-04-10  4:15       ` Dev Jain
2024-04-17  4:53       ` Dev Jain
2024-04-17  4:53         ` Dev Jain
2024-04-05  8:44 ` [PATCH 2/4] selftests/arm: Add signal tests Dev Jain
2024-04-05  8:44   ` Dev Jain
2024-04-06 21:28   ` Muhammad Usama Anjum
2024-04-06 21:28     ` Muhammad Usama Anjum
2024-04-08 12:12     ` Mark Brown
2024-04-08 12:12       ` Mark Brown
2024-04-10  4:43     ` Dev Jain
2024-04-10  4:43       ` Dev Jain
2024-04-05  8:44 ` [PATCH 3/4] selftests/arm: Add elf test Dev Jain
2024-04-05  8:44   ` Dev Jain
2024-04-06 21:30   ` Muhammad Usama Anjum
2024-04-06 21:30     ` Muhammad Usama Anjum
2024-04-10  4:11     ` Dev Jain
2024-04-10  4:11       ` Dev Jain
2024-04-05  8:44 ` [PATCH 4/4] selftests: Add build infrastructure along with README Dev Jain
2024-04-05  8:44   ` Dev Jain
2024-04-06 21:15   ` Muhammad Usama Anjum
2024-04-06 21:15     ` Muhammad Usama Anjum
2024-04-08 12:24     ` Mark Brown
2024-04-08 12:24       ` Mark Brown
2024-04-11  5:15     ` Dev Jain
2024-04-11  5:15       ` Dev Jain
2024-04-05 17:37 ` [PATCH 0/4] A new selftests/ directory for arm compatibility testing Mark Brown
2024-04-05 17:37   ` Mark Brown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240405084410.256788-2-dev.jain@arm.com \
    --to=dev.jain@arm.com \
    --cc=Anshuman.Khandual@arm.com \
    --cc=Catalin.Marinas@arm.com \
    --cc=broonie@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=rob.herring@arm.com \
    --cc=ryan.roberts@arm.com \
    --cc=shuah@kernel.org \
    --cc=suzuki.poulose@arm.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.