From 7871d2e88db3bec785769b20a22a40b6c81d82ea Mon Sep 17 00:00:00 2001 From: Anton Blanchard Date: Mon, 26 Apr 2021 18:41:15 +1000 Subject: [PATCH 1/2] Use MAP_ANONYMOUS|MAP_SHARED instead of unlinked file in /tmp On a large machine we noticed the shared mapping for statistics gathering was causing significant amounts of file I/O. I have no idea why I used an unlinked file to create the shared area in initialise_shared_area(). Use a MAP_ANONYMOUS|MAP_SHARED mmap instead. I've made it as Linux only for now. Signed-off-by: Anton Blanchard --- main.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/main.c b/main.c index e53b7ff..0f8c8be 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,24 @@ extern void __attribute__((weak)) testcase_prepare(unsigned long nr_tasks) { } extern void __attribute__((weak)) testcase_cleanup(void) { } extern void *testcase(unsigned long long *iterations, unsigned long nr); +#ifdef __linux__ +static char *initialise_shared_area(unsigned long size) +{ + char *m; + int page_size = getpagesize(); + + /* Align to page boundary */ + size = (size + page_size-1) & ~(page_size-1); + + m = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, -1, 0); + if (m == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + return m; +} +#else static char *initialise_shared_area(unsigned long size) { char template[] = "/tmp/shared_area_XXXXXX"; @@ -65,6 +83,7 @@ static char *initialise_shared_area(unsigned long size) return m; } +#endif static void usage(char *command) { From 7c6fb82f11eeb5a50a19c4a6204e1adfb011c715 Mon Sep 17 00:00:00 2001 From: Anton Blanchard Date: Thu, 29 Apr 2021 06:19:46 +1000 Subject: [PATCH 2/2] Disable THP in shared memory area We want each page to be node local, so disable THP. Signed-off-by: Anton Blanchard --- main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 0f8c8be..e248653 100644 --- a/main.c +++ b/main.c @@ -41,7 +41,12 @@ static char *initialise_shared_area(unsigned long size) m = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, -1, 0); if (m == MAP_FAILED) { - perror("mmap"); + perror("initialise_shared_area: mmap"); + exit(1); + } + + if (madvise(m, size, MADV_NOHUGEPAGE) == -1) { + perror("initialise_shared_area: madvise"); exit(1); }