Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1210335

Re: [PATCH 06/10] mm: page_alloc: Distinguish between being unable to sleep, unwilling to unwilling and avoiding waking kswapd

From Mel Gorman <mgorman@techsingularity.net>
Newsgroups linux.kernel
Subject Re: [PATCH 06/10] mm: page_alloc: Distinguish between being unable to sleep, unwilling to unwilling and avoiding waking kswapd
Date 2015-08-20 11:20 +0200
Message-ID <pZuaT-wx-39@gated-at.bofh.it> (permalink)
References <pWBLz-1Xg-7@gated-at.bofh.it> <pWBLB-1Xg-43@gated-at.bofh.it> <pZcQG-qk-23@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


On Wed, Aug 19, 2015 at 04:44:40PM +0200, Vlastimil Babka wrote:
> 
> Unfortunately this is not as simple for all uses of GFP_TRANSHUGE.
> Namely in __alloc_pages_slowpath() the checks could use __GFP_NO_KSWAPD as one
> of the distinguishing flags, but to test for lack of __GFP_KSWAPD_RECLAIM, they
> should be adjusted in order to be functionally equivalent.
> Yes, it would be better if we could get rid of them, but that's out of scope
> here. So, something like this?
> 

Nicely spotted. The only modification I made was to add a helper because
the flags trick is sufficiently complex. That results in this;

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 9617e79d6931..0f92d4d42e2e 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2774,6 +2774,11 @@ bool gfp_pfmemalloc_allowed(gfp_t gfp_mask)
 	return !!(gfp_to_alloc_flags(gfp_mask) & ALLOC_NO_WATERMARKS);
 }
 
+static inline bool is_thp_gfp_mask(gfp_t gfp_mask)
+{
+	return (gfp_mask & (GFP_TRANSHUGE | __GFP_KSWAPD_RECLAIM)) == GFP_TRANSHUGE;
+}
+
 static inline struct page *
 __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 						struct alloc_context *ac)
@@ -2889,7 +2894,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 		goto got_pg;
 
 	/* Checks for THP-specific high-order allocations */
-	if ((gfp_mask & GFP_TRANSHUGE) == GFP_TRANSHUGE) {
+	if (is_thp_gfp_mask(gfp_mask)) {
 		/*
 		 * If compaction is deferred for high-order allocations, it is
 		 * because sync compaction recently failed. If this is the case
@@ -2924,8 +2929,7 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
 	 * fault, so use asynchronous memory compaction for THP unless it is
 	 * khugepaged trying to collapse.
 	 */
-	if ((gfp_mask & GFP_TRANSHUGE) != GFP_TRANSHUGE ||
-						(current->flags & PF_KTHREAD))
+	if (!is_thp_gfp_mask(gfp_mask) || (current->flags & PF_KTHREAD))
 		migration_mode = MIGRATE_SYNC_LIGHT;
 
 	/* Try direct reclaim and then allocating */
-- 
Mel Gorman
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH 00/10] Remove zonelist cache and high-order watermark checking v2 Mel Gorman <mgorman@techsingularity.net> - 2015-08-12 12:50 +0200
  Re: [PATCH 06/10] mm: page_alloc: Distinguish between being unable to  sleep, unwilling to unwilling and avoiding waking kswapd Vlastimil Babka <vbabka@suse.cz> - 2015-08-19 16:50 +0200
    Re: [PATCH 06/10] mm: page_alloc: Distinguish between being unable  to sleep, unwilling to unwilling and avoiding waking kswapd Mel Gorman <mgorman@techsingularity.net> - 2015-08-20 11:20 +0200
  Re: [PATCH 06/10] mm: page_alloc: Distinguish between being unable to  sleep, unwilling to unwilling and avoiding waking kswapd Vlastimil Babka <vbabka@suse.cz> - 2015-08-21 15:50 +0200
    Re: [PATCH 06/10] mm: page_alloc: Distinguish between being unable  to sleep, unwilling to unwilling and avoiding waking kswapd Mel Gorman <mgorman@techsingularity.net> - 2015-08-21 22:50 +0200

csiph-web