linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V2] selftest/vm: Add test case for mmap across 128TB boundary.
@ 2017-11-23  3:03 Aneesh Kumar K.V
  2017-11-23  3:42 ` Anshuman Khandual
  2017-11-23 10:14 ` Kirill A. Shutemov
  0 siblings, 2 replies; 3+ messages in thread
From: Aneesh Kumar K.V @ 2017-11-23  3:03 UTC (permalink / raw)
  To: akpm, Kirill A . Shutemov; +Cc: linux-mm, linux-kernel, Aneesh Kumar K . V

From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>

This patch add a self-test that covers a few corner cases of the interface.

Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---

Changes from V1:
* Add the test to run_vmtests script

 tools/testing/selftests/vm/Makefile         |   1 +
 tools/testing/selftests/vm/run_vmtests      |  11 ++
 tools/testing/selftests/vm/va_128TBswitch.c | 297 ++++++++++++++++++++++++++++
 3 files changed, 309 insertions(+)
 create mode 100644 tools/testing/selftests/vm/va_128TBswitch.c

diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile
index cbb29e41ef2b..b1fb3cd7cf52 100644
--- a/tools/testing/selftests/vm/Makefile
+++ b/tools/testing/selftests/vm/Makefile
@@ -17,6 +17,7 @@ TEST_GEN_FILES += transhuge-stress
 TEST_GEN_FILES += userfaultfd
 TEST_GEN_FILES += mlock-random-test
 TEST_GEN_FILES += virtual_address_range
+TEST_GEN_FILES += va_128TBswitch
 
 TEST_PROGS := run_vmtests
 
diff --git a/tools/testing/selftests/vm/run_vmtests b/tools/testing/selftests/vm/run_vmtests
index 07548a1fa901..d8305fb83125 100755
--- a/tools/testing/selftests/vm/run_vmtests
+++ b/tools/testing/selftests/vm/run_vmtests
@@ -176,4 +176,15 @@ else
 	echo "[PASS]"
 fi
 
+echo "-----------------------------"
+echo "running virtual address 128TB switch test"
+echo "-----------------------------"
+./va_128TBswitch
+if [ $? -ne 0 ]; then
+    echo "[FAIL]"
+    exitcode=1
+else
+    echo "[PASS]"
+fi
+
 exit $exitcode
diff --git a/tools/testing/selftests/vm/va_128TBswitch.c b/tools/testing/selftests/vm/va_128TBswitch.c
new file mode 100644
index 000000000000..2fdb84ab94b1
--- /dev/null
+++ b/tools/testing/selftests/vm/va_128TBswitch.c
@@ -0,0 +1,297 @@
+/*
+ *
+ * Authors: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+ * Authors: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2.1 of the GNU Lesser General Public License
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#include <stdio.h>
+#include <sys/mman.h>
+#include <string.h>
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+#ifdef __powerpc64__
+#define PAGE_SIZE	(64 << 10)
+/*
+ * This will work with 16M and 2M hugepage size
+ */
+#define HUGETLB_SIZE	(16 << 20)
+#else
+#define PAGE_SIZE	(4 << 10)
+#define HUGETLB_SIZE	(2 << 20)
+#endif
+
+/*
+ * >= 128TB is the hint addr value we used to select
+ * large address space.
+ */
+#define ADDR_SWITCH_HINT (1UL << 47)
+#define LOW_ADDR	((void *) (1UL << 30))
+#define HIGH_ADDR	((void *) (1UL << 48))
+
+struct testcase {
+	void *addr;
+	unsigned long size;
+	unsigned long flags;
+	const char *msg;
+	unsigned int low_addr_required:1;
+	unsigned int keep_mapped:1;
+};
+
+static struct testcase testcases[] = {
+	{
+		/*
+		 * If stack is moved, we could possibly allocate
+		 * this at the requested address.
+		 */
+		.addr = ((void *)(ADDR_SWITCH_HINT - PAGE_SIZE)),
+		.size = PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, PAGE_SIZE)",
+		.low_addr_required = 1,
+	},
+	{
+		/*
+		 * We should never allocate at the requested address or above it
+		 * The len cross the 128TB boundary. Without MAP_FIXED
+		 * we will always search in the lower address space.
+		 */
+		.addr = ((void *)(ADDR_SWITCH_HINT - PAGE_SIZE)),
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, (2 * PAGE_SIZE))",
+		.low_addr_required = 1,
+	},
+	{
+		/*
+		 * Exact mapping at 128TB, the area is free we should get that
+		 * even without MAP_FIXED.
+		 */
+		.addr = ((void *)(ADDR_SWITCH_HINT)),
+		.size = PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT, PAGE_SIZE)",
+		.keep_mapped = 1,
+	},
+	{
+		.addr = (void *)(ADDR_SWITCH_HINT),
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
+		.msg = "mmap(ADDR_SWITCH_HINT, 2 * PAGE_SIZE, MAP_FIXED)",
+	},
+	{
+		.addr = NULL,
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(NULL)",
+		.low_addr_required = 1,
+	},
+	{
+		.addr = LOW_ADDR,
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(LOW_ADDR)",
+		.low_addr_required = 1,
+	},
+	{
+		.addr = HIGH_ADDR,
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(HIGH_ADDR)",
+		.keep_mapped = 1,
+	},
+	{
+		.addr = HIGH_ADDR,
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(HIGH_ADDR) again",
+		.keep_mapped = 1,
+	},
+	{
+		.addr = HIGH_ADDR,
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
+		.msg = "mmap(HIGH_ADDR, MAP_FIXED)",
+	},
+	{
+		.addr = (void *) -1,
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(-1)",
+		.keep_mapped = 1,
+	},
+	{
+		.addr = (void *) -1,
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(-1) again",
+	},
+	{
+		.addr = ((void *)(ADDR_SWITCH_HINT - PAGE_SIZE)),
+		.size = PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, PAGE_SIZE)",
+		.low_addr_required = 1,
+	},
+	{
+		.addr = (void *)(ADDR_SWITCH_HINT - PAGE_SIZE),
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, 2 * PAGE_SIZE)",
+		.low_addr_required = 1,
+		.keep_mapped = 1,
+	},
+	{
+		.addr = (void *)(ADDR_SWITCH_HINT - PAGE_SIZE / 2),
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE/2 , 2 * PAGE_SIZE)",
+		.low_addr_required = 1,
+		.keep_mapped = 1,
+	},
+	{
+		.addr = ((void *)(ADDR_SWITCH_HINT)),
+		.size = PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT, PAGE_SIZE)",
+	},
+	{
+		.addr = (void *)(ADDR_SWITCH_HINT),
+		.size = 2 * PAGE_SIZE,
+		.flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
+		.msg = "mmap(ADDR_SWITCH_HINT, 2 * PAGE_SIZE, MAP_FIXED)",
+	},
+};
+
+static struct testcase hugetlb_testcases[] = {
+	{
+		.addr = NULL,
+		.size = HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(NULL, MAP_HUGETLB)",
+		.low_addr_required = 1,
+	},
+	{
+		.addr = LOW_ADDR,
+		.size = HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(LOW_ADDR, MAP_HUGETLB)",
+		.low_addr_required = 1,
+	},
+	{
+		.addr = HIGH_ADDR,
+		.size = HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(HIGH_ADDR, MAP_HUGETLB)",
+		.keep_mapped = 1,
+	},
+	{
+		.addr = HIGH_ADDR,
+		.size = HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(HIGH_ADDR, MAP_HUGETLB) again",
+		.keep_mapped = 1,
+	},
+	{
+		.addr = HIGH_ADDR,
+		.size = HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
+		.msg = "mmap(HIGH_ADDR, MAP_FIXED | MAP_HUGETLB)",
+	},
+	{
+		.addr = (void *) -1,
+		.size = HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(-1, MAP_HUGETLB)",
+		.keep_mapped = 1,
+	},
+	{
+		.addr = (void *) -1,
+		.size = HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(-1, MAP_HUGETLB) again",
+	},
+	{
+		.addr = (void *)(ADDR_SWITCH_HINT - PAGE_SIZE),
+		.size = 2 * HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
+		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, 2*HUGETLB_SIZE, MAP_HUGETLB)",
+		.low_addr_required = 1,
+		.keep_mapped = 1,
+	},
+	{
+		.addr = (void *)(ADDR_SWITCH_HINT),
+		.size = 2 * HUGETLB_SIZE,
+		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
+		.msg = "mmap(ADDR_SWITCH_HINT , 2*HUGETLB_SIZE, MAP_FIXED | MAP_HUGETLB)",
+	},
+};
+
+static int run_test(struct testcase *test, int count)
+{
+	void *p;
+	int i, ret = 0;
+
+	for (i = 0; i < count; i++) {
+		struct testcase *t = test + i;
+
+		p = mmap(t->addr, t->size, PROT_READ | PROT_WRITE, t->flags, -1, 0);
+
+		printf("%s: %p - ", t->msg, p);
+
+		if (p == MAP_FAILED) {
+			printf("FAILED\n");
+			ret = 1;
+			continue;
+		}
+
+		if (t->low_addr_required && p >= (void *)(1UL << 47)) {
+			printf("FAILED\n");
+			ret = 1;
+		} else {
+			/*
+			 * Do a dereference of the address returned so that we catch
+			 * bugs in page fault handling
+			 */
+			*(int *)p = 10;
+			printf("OK\n");
+		}
+		if (!t->keep_mapped)
+			munmap(p, t->size);
+	}
+
+	return ret;
+}
+
+static int supported_arch(void)
+{
+#if defined(__powerpc64__)
+	return 1;
+#elif defined(__x86_64__)
+	return 1;
+#else
+	return 0;
+#endif
+}
+
+int main(int argc, char **argv)
+{
+	int ret;
+
+	if (!supported_arch())
+		return 0;
+
+	ret = run_test(testcases, ARRAY_SIZE(testcases));
+	if (argc == 2 && !strcmp(argv[1], "--run-hugetlb"))
+		ret = run_test(hugetlb_testcases, ARRAY_SIZE(hugetlb_testcases));
+	return ret;
+}
-- 
2.14.3

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH V2] selftest/vm: Add test case for mmap across 128TB boundary.
  2017-11-23  3:03 [PATCH V2] selftest/vm: Add test case for mmap across 128TB boundary Aneesh Kumar K.V
@ 2017-11-23  3:42 ` Anshuman Khandual
  2017-11-23 10:14 ` Kirill A. Shutemov
  1 sibling, 0 replies; 3+ messages in thread
From: Anshuman Khandual @ 2017-11-23  3:42 UTC (permalink / raw)
  To: Aneesh Kumar K.V, akpm, Kirill A . Shutemov; +Cc: linux-mm, linux-kernel

On 11/23/2017 08:33 AM, Aneesh Kumar K.V wrote:
> From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
> 
> This patch add a self-test that covers a few corner cases of the interface.
> 
> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> ---
> 
> Changes from V1:
> * Add the test to run_vmtests script
> 
>  tools/testing/selftests/vm/Makefile         |   1 +
>  tools/testing/selftests/vm/run_vmtests      |  11 ++
>  tools/testing/selftests/vm/va_128TBswitch.c | 297 ++++++++++++++++++++++++++++
>  3 files changed, 309 insertions(+)
>  create mode 100644 tools/testing/selftests/vm/va_128TBswitch.c
> 
> diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile
> index cbb29e41ef2b..b1fb3cd7cf52 100644
> --- a/tools/testing/selftests/vm/Makefile
> +++ b/tools/testing/selftests/vm/Makefile
> @@ -17,6 +17,7 @@ TEST_GEN_FILES += transhuge-stress
>  TEST_GEN_FILES += userfaultfd
>  TEST_GEN_FILES += mlock-random-test
>  TEST_GEN_FILES += virtual_address_range
> +TEST_GEN_FILES += va_128TBswitch

This will conflict with a test case for mremap clone functionality
which might have been queued in Shuah's tree.

https://patchwork.kernel.org/patch/10031943/

>  
>  TEST_PROGS := run_vmtests
>  
> diff --git a/tools/testing/selftests/vm/run_vmtests b/tools/testing/selftests/vm/run_vmtests
> index 07548a1fa901..d8305fb83125 100755
> --- a/tools/testing/selftests/vm/run_vmtests
> +++ b/tools/testing/selftests/vm/run_vmtests
> @@ -176,4 +176,15 @@ else
>  	echo "[PASS]"
>  fi
>  
> +echo "-----------------------------"
> +echo "running virtual address 128TB switch test"
> +echo "-----------------------------"
> +./va_128TBswitch
> +if [ $? -ne 0 ]; then
> +    echo "[FAIL]"
> +    exitcode=1
> +else
> +    echo "[PASS]"
> +fi
> +
>  exit $exitcode
> diff --git a/tools/testing/selftests/vm/va_128TBswitch.c b/tools/testing/selftests/vm/va_128TBswitch.c
> new file mode 100644
> index 000000000000..2fdb84ab94b1
> --- /dev/null
> +++ b/tools/testing/selftests/vm/va_128TBswitch.c
> @@ -0,0 +1,297 @@
> +/*
> + *
> + * Authors: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> + * Authors: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of version 2.1 of the GNU Lesser General Public License
> + * as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it would be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> + *
> + */
> +
> +#include <stdio.h>
> +#include <sys/mman.h>
> +#include <string.h>
> +
> +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
> +
> +#ifdef __powerpc64__
> +#define PAGE_SIZE	(64 << 10)
> +/*
> + * This will work with 16M and 2M hugepage size
> + */
> +#define HUGETLB_SIZE	(16 << 20)
> +#else
> +#define PAGE_SIZE	(4 << 10)
> +#define HUGETLB_SIZE	(2 << 20)
> +#endif
> +
> +/*
> + * >= 128TB is the hint addr value we used to select
> + * large address space.
> + */
> +#define ADDR_SWITCH_HINT (1UL << 47)
> +#define LOW_ADDR	((void *) (1UL << 30))
> +#define HIGH_ADDR	((void *) (1UL << 48))

Is there any particular reason for choosing 1GB as low and 256TB
as high address ?

> +
> +struct testcase {
> +	void *addr;
> +	unsigned long size;
> +	unsigned long flags;
> +	const char *msg;
> +	unsigned int low_addr_required:1;
> +	unsigned int keep_mapped:1;
> +};
> +
> +static struct testcase testcases[] = {
> +	{
> +		/*
> +		 * If stack is moved, we could possibly allocate
> +		 * this at the requested address.
> +		 */
> +		.addr = ((void *)(ADDR_SWITCH_HINT - PAGE_SIZE)),
> +		.size = PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, PAGE_SIZE)",
> +		.low_addr_required = 1,
> +	},
> +	{
> +		/*
> +		 * We should never allocate at the requested address or above it
> +		 * The len cross the 128TB boundary. Without MAP_FIXED
> +		 * we will always search in the lower address space.
> +		 */
> +		.addr = ((void *)(ADDR_SWITCH_HINT - PAGE_SIZE)),
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, (2 * PAGE_SIZE))",
> +		.low_addr_required = 1,
> +	},
> +	{
> +		/*
> +		 * Exact mapping at 128TB, the area is free we should get that
> +		 * even without MAP_FIXED.
> +		 */
> +		.addr = ((void *)(ADDR_SWITCH_HINT)),
> +		.size = PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT, PAGE_SIZE)",
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = (void *)(ADDR_SWITCH_HINT),
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
> +		.msg = "mmap(ADDR_SWITCH_HINT, 2 * PAGE_SIZE, MAP_FIXED)",
> +	},
> +	{
> +		.addr = NULL,
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(NULL)",
> +		.low_addr_required = 1,
> +	},
> +	{
> +		.addr = LOW_ADDR,
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(LOW_ADDR)",
> +		.low_addr_required = 1,
> +	},
> +	{
> +		.addr = HIGH_ADDR,
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(HIGH_ADDR)",
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = HIGH_ADDR,
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(HIGH_ADDR) again",
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = HIGH_ADDR,
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
> +		.msg = "mmap(HIGH_ADDR, MAP_FIXED)",
> +	},
> +	{
> +		.addr = (void *) -1,
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(-1)",
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = (void *) -1,
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(-1) again",
> +	},
> +	{
> +		.addr = ((void *)(ADDR_SWITCH_HINT - PAGE_SIZE)),
> +		.size = PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, PAGE_SIZE)",
> +		.low_addr_required = 1,
> +	},
> +	{
> +		.addr = (void *)(ADDR_SWITCH_HINT - PAGE_SIZE),
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, 2 * PAGE_SIZE)",
> +		.low_addr_required = 1,
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = (void *)(ADDR_SWITCH_HINT - PAGE_SIZE / 2),
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE/2 , 2 * PAGE_SIZE)",
> +		.low_addr_required = 1,
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = ((void *)(ADDR_SWITCH_HINT)),
> +		.size = PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT, PAGE_SIZE)",
> +	},
> +	{
> +		.addr = (void *)(ADDR_SWITCH_HINT),
> +		.size = 2 * PAGE_SIZE,
> +		.flags = MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
> +		.msg = "mmap(ADDR_SWITCH_HINT, 2 * PAGE_SIZE, MAP_FIXED)",
> +	},
> +};
> +
> +static struct testcase hugetlb_testcases[] = {
> +	{
> +		.addr = NULL,
> +		.size = HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(NULL, MAP_HUGETLB)",
> +		.low_addr_required = 1,
> +	},
> +	{
> +		.addr = LOW_ADDR,
> +		.size = HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(LOW_ADDR, MAP_HUGETLB)",
> +		.low_addr_required = 1,
> +	},
> +	{
> +		.addr = HIGH_ADDR,
> +		.size = HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(HIGH_ADDR, MAP_HUGETLB)",
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = HIGH_ADDR,
> +		.size = HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(HIGH_ADDR, MAP_HUGETLB) again",
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = HIGH_ADDR,
> +		.size = HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
> +		.msg = "mmap(HIGH_ADDR, MAP_FIXED | MAP_HUGETLB)",
> +	},
> +	{
> +		.addr = (void *) -1,
> +		.size = HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(-1, MAP_HUGETLB)",
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = (void *) -1,
> +		.size = HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(-1, MAP_HUGETLB) again",
> +	},
> +	{
> +		.addr = (void *)(ADDR_SWITCH_HINT - PAGE_SIZE),
> +		.size = 2 * HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS,
> +		.msg = "mmap(ADDR_SWITCH_HINT - PAGE_SIZE, 2*HUGETLB_SIZE, MAP_HUGETLB)",
> +		.low_addr_required = 1,
> +		.keep_mapped = 1,
> +	},
> +	{
> +		.addr = (void *)(ADDR_SWITCH_HINT),
> +		.size = 2 * HUGETLB_SIZE,
> +		.flags = MAP_HUGETLB | MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
> +		.msg = "mmap(ADDR_SWITCH_HINT , 2*HUGETLB_SIZE, MAP_FIXED | MAP_HUGETLB)",
> +	},
> +};

Does the test permutations with 'keep_mapped' form some sort of corner
case for later test cases ? If yes, could you please describe it.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH V2] selftest/vm: Add test case for mmap across 128TB boundary.
  2017-11-23  3:03 [PATCH V2] selftest/vm: Add test case for mmap across 128TB boundary Aneesh Kumar K.V
  2017-11-23  3:42 ` Anshuman Khandual
@ 2017-11-23 10:14 ` Kirill A. Shutemov
  1 sibling, 0 replies; 3+ messages in thread
From: Kirill A. Shutemov @ 2017-11-23 10:14 UTC (permalink / raw)
  To: Aneesh Kumar K.V; +Cc: akpm, Kirill A . Shutemov, linux-mm, linux-kernel

On Thu, Nov 23, 2017 at 08:33:13AM +0530, Aneesh Kumar K.V wrote:
> From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
> 
> This patch add a self-test that covers a few corner cases of the interface.
> 
> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> ---
> 
> Changes from V1:
> * Add the test to run_vmtests script
> 
>  tools/testing/selftests/vm/Makefile         |   1 +
>  tools/testing/selftests/vm/run_vmtests      |  11 ++
>  tools/testing/selftests/vm/va_128TBswitch.c | 297 ++++++++++++++++++++++++++++
>  3 files changed, 309 insertions(+)
>  create mode 100644 tools/testing/selftests/vm/va_128TBswitch.c

Patch with my selftest is already in -tip tree. I think this selftest
should replace it, not add another one.

> diff --git a/tools/testing/selftests/vm/va_128TBswitch.c b/tools/testing/selftests/vm/va_128TBswitch.c
> new file mode 100644
> index 000000000000..2fdb84ab94b1
> --- /dev/null
> +++ b/tools/testing/selftests/vm/va_128TBswitch.c
> @@ -0,0 +1,297 @@
> +/*
> + *
> + * Authors: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
> + * Authors: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of version 2.1 of the GNU Lesser General Public License
> + * as published by the Free Software Foundation.

LGPL? Why?

> + *
> + * This program is distributed in the hope that it would be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> + *
> + */
> +
> +static int run_test(struct testcase *test, int count)
> +{
> +	void *p;
> +	int i, ret = 0;
> +
> +	for (i = 0; i < count; i++) {
> +		struct testcase *t = test + i;
> +
> +		p = mmap(t->addr, t->size, PROT_READ | PROT_WRITE, t->flags, -1, 0);
> +
> +		printf("%s: %p - ", t->msg, p);
> +
> +		if (p == MAP_FAILED) {
> +			printf("FAILED\n");
> +			ret = 1;
> +			continue;
> +		}
> +
> +		if (t->low_addr_required && p >= (void *)(1UL << 47)) {
> +			printf("FAILED\n");
> +			ret = 1;
> +		} else {
> +			/*
> +			 * Do a dereference of the address returned so that we catch
> +			 * bugs in page fault handling
> +			 */
> +			*(int *)p = 10;

If we are going to touch memory, maybe not just first page, but whole
range? memset()?

> +			printf("OK\n");
> +		}
> +		if (!t->keep_mapped)
> +			munmap(p, t->size);
> +	}
> +
> +	return ret;
> +}

-- 
 Kirill A. Shutemov

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-11-23 10:14 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-23  3:03 [PATCH V2] selftest/vm: Add test case for mmap across 128TB boundary Aneesh Kumar K.V
2017-11-23  3:42 ` Anshuman Khandual
2017-11-23 10:14 ` Kirill A. Shutemov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).