[PATCH 31/31] huge tmpfs: no kswapd by default on sync allocations

From: Hugh Dickins
Date: Tue Apr 05 2016 - 18:07:37 EST


From: Andres Lagar-Cavilla <andreslc@xxxxxxxxxx>

This triggers early compaction abort while in process context, to
ameliorate mmap semaphore stalls.

Suggested-by: David Rientjes <rientjes@xxxxxxxxxx>
Signed-off-by: Andres Lagar-Cavilla <andreslc@xxxxxxxxxx>
Signed-off-by: Hugh Dickins <hughd@xxxxxxxxxx>
---
Documentation/filesystems/tmpfs.txt | 5 +++--
mm/shmem.c | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)

--- a/Documentation/filesystems/tmpfs.txt
+++ b/Documentation/filesystems/tmpfs.txt
@@ -194,8 +194,9 @@ to force huge off for all (intended for

/proc/sys/vm/shmem_huge_gfpmask (intended for experimentation only):

-Default 38146762, that is 0x24612ca:
-GFP_HIGHUSER_MOVABLE|__GFP_NOWARN|__GFP_THISNODE|__GFP_NORETRY.
+Default 4592330, that is 0x4612ca:
+GFP_HIGHUSER_MOVABLE|__GFP_NOWARN|__GFP_THISNODE|__GFP_NORETRY
+minus __GFP_KSWAPD_RECLAIM.
Write a gfpmask built from __GFP flags in include/linux/gfp.h, to experiment
with better alternatives for the synchronous huge tmpfs allocation used
when faulting or writing.
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -324,7 +324,8 @@ int shmem_huge __read_mostly;
int shmem_huge_recoveries __read_mostly = 8; /* concurrent recovery limit */

int shmem_huge_gfpmask __read_mostly =
- (int)(GFP_HIGHUSER_MOVABLE|__GFP_NOWARN|__GFP_THISNODE|__GFP_NORETRY);
+ (int)(GFP_HIGHUSER_MOVABLE|__GFP_NOWARN|__GFP_THISNODE|__GFP_NORETRY) &
+ ~__GFP_KSWAPD_RECLAIM;
int shmem_recovery_gfpmask __read_mostly =
(int)(GFP_HIGHUSER_MOVABLE|__GFP_NOWARN|__GFP_THISNODE);