From 089b443aafb1d8fe4e6d7ecdadecc6b8973f9087 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Wed, 5 Jun 2019 16:07:34 +0900 Subject: [PATCH] mmap()/shmget(): use Linux default huge page size when not specified Change-Id: I8a9e3bed65ac1902adfaeaa254597dd30f540319 --- arch/arm64/kernel/syscall.c | 6 ++++-- arch/x86_64/kernel/syscall.c | 8 ++++++-- ihk | 2 +- lib/include/ihk/mm.h | 1 + 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c index 54d54e5e..732385ce 100644 --- a/arch/arm64/kernel/syscall.c +++ b/arch/arm64/kernel/syscall.c @@ -1940,7 +1940,8 @@ SYSCALL_DECLARE(mmap) if (hugeshift == 0) { /* default hugepage size */ - flags |= MAP_HUGE_SECOND_BLOCK; + flags |= ihk_mc_get_linux_default_huge_page_shift() << + MAP_HUGE_SHIFT; } else if ((first_level_block_support && hugeshift == MAP_HUGE_FIRST_BLOCK) || (first_level_block_support && @@ -2017,7 +2018,8 @@ SYSCALL_DECLARE(shmget) if (hugeshift == 0) { /* default hugepage size */ - shmflg |= SHM_HUGE_SECOND_BLOCK; + shmflg |= ihk_mc_get_linux_default_huge_page_shift() << + MAP_HUGE_SHIFT; } else if ((first_level_block_support && hugeshift == SHM_HUGE_FIRST_BLOCK) || (first_level_block_support && diff --git a/arch/x86_64/kernel/syscall.c b/arch/x86_64/kernel/syscall.c index 2f76662b..231f5d51 100644 --- a/arch/x86_64/kernel/syscall.c +++ b/arch/x86_64/kernel/syscall.c @@ -1683,7 +1683,9 @@ SYSCALL_DECLARE(mmap) if (flags & MAP_HUGETLB) { switch (flags & (0x3F << MAP_HUGE_SHIFT)) { case 0: - flags |= MAP_HUGE_2MB; /* default hugepage size */ + /* default hugepage size */ + flags |= ihk_mc_get_linux_default_huge_page_shift() << + MAP_HUGE_SHIFT; break; case MAP_HUGE_2MB: @@ -1785,7 +1787,9 @@ SYSCALL_DECLARE(shmget) int hugeshift = shmflg & (0x3F << SHM_HUGE_SHIFT); if (hugeshift == 0) { - shmflg |= SHM_HUGE_2MB; /* default hugepage size */ + /* default hugepage size */ + shmflg |= ihk_mc_get_linux_default_huge_page_shift() << + MAP_HUGE_SHIFT; } else if (hugeshift == SHM_HUGE_2MB || hugeshift == SHM_HUGE_1GB) { /*nop*/ diff --git a/ihk b/ihk index ab078956..c505d9c2 160000 --- a/ihk +++ b/ihk @@ -1 +1 @@ -Subproject commit ab078956b26867c3d05a369dd1d24e2fbcf4fd0e +Subproject commit c505d9c25ea959fccffb8336ccab2867d1fb0261 diff --git a/lib/include/ihk/mm.h b/lib/include/ihk/mm.h index d917a047..5a68378a 100644 --- a/lib/include/ihk/mm.h +++ b/lib/include/ihk/mm.h @@ -211,6 +211,7 @@ struct smp_coreset; int ihk_mc_get_numa_node(int id, int *linux_numa_id, int *type); int ihk_mc_get_numa_distance(int i, int j); int ihk_mc_get_nr_memory_chunks(void); +int ihk_mc_get_linux_default_huge_page_shift(void); int ihk_mc_get_memory_chunk(int id, unsigned long *start, unsigned long *end,