mm/vmscan: restore sc->gfp_mask after promoting it to __GFP_HIGHMEM
We promote sc->gfp_mask to __GFP_HIGHMEM to forcibly scan highmem if
there are too many buffer_heads pinning highmem. See cc715d99e5
("mm:
vmscan: forcibly scan highmem if there are too many buffer_heads pinning
highmem").
This patch restores sc->gfp_mask to its caller original value after
finishing the scan job, to avoid the impact on other invocations from
its upper caller, such as vmpressure_prio(), shrink_slab().
Signed-off-by: Weijie Yang <weijie.yang@samsung.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Acked-by: Rik van Riel <riel@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a5338093bf
commit
619d0d76c1
1 changed files with 8 additions and 0 deletions
|
@ -2314,6 +2314,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
||||||
unsigned long lru_pages = 0;
|
unsigned long lru_pages = 0;
|
||||||
bool aborted_reclaim = false;
|
bool aborted_reclaim = false;
|
||||||
struct reclaim_state *reclaim_state = current->reclaim_state;
|
struct reclaim_state *reclaim_state = current->reclaim_state;
|
||||||
|
gfp_t orig_mask;
|
||||||
struct shrink_control shrink = {
|
struct shrink_control shrink = {
|
||||||
.gfp_mask = sc->gfp_mask,
|
.gfp_mask = sc->gfp_mask,
|
||||||
};
|
};
|
||||||
|
@ -2323,6 +2324,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
||||||
* allowed level, force direct reclaim to scan the highmem zone as
|
* allowed level, force direct reclaim to scan the highmem zone as
|
||||||
* highmem pages could be pinning lowmem pages storing buffer_heads
|
* highmem pages could be pinning lowmem pages storing buffer_heads
|
||||||
*/
|
*/
|
||||||
|
orig_mask = sc->gfp_mask;
|
||||||
if (buffer_heads_over_limit)
|
if (buffer_heads_over_limit)
|
||||||
sc->gfp_mask |= __GFP_HIGHMEM;
|
sc->gfp_mask |= __GFP_HIGHMEM;
|
||||||
|
|
||||||
|
@ -2393,6 +2395,12 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restore to original mask to avoid the impact on the caller if we
|
||||||
|
* promoted it to __GFP_HIGHMEM.
|
||||||
|
*/
|
||||||
|
sc->gfp_mask = orig_mask;
|
||||||
|
|
||||||
return aborted_reclaim;
|
return aborted_reclaim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue