mm: Micro-optimisation: Save two branches on hot - page allocation path
Subsystems (3)
PATCH v2 1/1 mm: Micro-optimisation: Save two branches on hot - page allocation path
From: Mateusz Nosek <[email protected]>
This patch makes ALLOC_KSWAPD equal to __GFP_KSWAPD_RECLAIM (cast to int).
Thanks to that code like:
if (gfp_mask & __GFP_KSWAPD_RECLAIM)
alloc_flags |= ALLOC_KSWAPD;
can be changed to:
alloc_flags |= (__force int) (gfp_mask &__GFP_KSWAPD_RECLAIM);
Thanks to this one branch less is generated in the assembly.
In case of ALLOC_KSWAPD flag two branches are saved, first one in code that always executes in the beginning of page allocation and the second one in loop in page allocator slowpath.
Signed-off-by Mateusz Nosek <[email protected]>
Acked-by Vlastimil Babka <[email protected]>
Acked-by Mel Gorman <[email protected]>
--- mm/internal.h | 2 +- mm/page_alloc.c | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-)
mm/internal.h +1 -1
@@ -535,7 +535,7 @@ unsigned long reclaim_clean_pages_from_list(struct zone *zone,#else #define ALLOC_NOFRAGMENT 0x0#endif -#define ALLOC_KSWAPD 0x200/* allow waking of kswapd */ +#define ALLOC_KSWAPD 0x800/* allow waking of kswapd, __GFP_KSWAPD_RECLAIM set */ enum ttu_flags ;struct tlbflush_unmap_batch ;
mm/page_alloc.c +14 -8
@@ -3609,10 +3609,13 @@ static bool zone_allows_reclaim(struct zone *local_zone, struct zone *zone)static inline unsigned int alloc_flags_nofragment (struct zone *zone,gfp_t gfp_mask) { -unsigned int alloc_flags =0 ; +unsigned int alloc_flags; -if (gfp_mask & __GFP_KSWAPD_RECLAIM) - alloc_flags |=ALLOC_KSWAPD ; +/* +* __GFP_KSWAPD_RECLAIM is assumed to be the same as ALLOC_KSWAPD +* to save a branch. +*/ + alloc_flags = (__force int ) (gfp_mask & __GFP_KSWAPD_RECLAIM);#ifdef CONFIG_ZONE_DMA32 if (!zone)
@@ -4248,8 +4251,13 @@ gfp_to_alloc_flags(gfp_t gfp_mask) {unsigned int alloc_flags =ALLOC_WMARK_MIN |ALLOC_CPUSET ; -/* __GFP_HIGH is assumed to be the same as ALLOC_HIGH to save a branch. */ +/* +* __GFP_HIGH is assumed to be the same as ALLOC_HIGH +* and __GFP_KSWAPD_RECLAIM is assumed to be the same as ALLOC_KSWAPD +* to save two branches. +*/ BUILD_BUG_ON (__GFP_HIGH != (__force gfp_t )ALLOC_HIGH ); +BUILD_BUG_ON (__GFP_KSWAPD_RECLAIM != (__force gfp_t )ALLOC_KSWAPD );/* * The caller may dip into page reserves a bit more if the caller
@@ -4257,7 +4265,8 @@ gfp_to_alloc_flags(gfp_t gfp_mask)* policy or is asking for __GFP_HIGH memory. GFP_ATOMIC requests will * set both ALLOC_HARDER (__GFP_ATOMIC) and ALLOC_HIGH (__GFP_HIGH). */ - alloc_flags |= (__force int ) (gfp_mask & __GFP_HIGH); + alloc_flags |= (__force int ) + (gfp_mask & (__GFP_HIGH | __GFP_KSWAPD_RECLAIM));if (gfp_mask & __GFP_ATOMIC) {/*
@@ -4274,9 +4283,6 @@ gfp_to_alloc_flags(gfp_t gfp_mask) }else if (unlikely (rt_task (current)) && !in_interrupt ()) alloc_flags |=ALLOC_HARDER ; -if (gfp_mask & __GFP_KSWAPD_RECLAIM) - alloc_flags |=ALLOC_KSWAPD ; -#ifdef CONFIG_CMA if (gfpflags_to_migratetype (gfp_mask) ==MIGRATE_MOVABLE ) alloc_flags |=ALLOC_CMA ;
Signature · 1 line
2.17.1