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
|
@ -2314,6 +2314,7 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc)
|
|||
unsigned long lru_pages = 0;
|
||||
bool aborted_reclaim = false;
|
||||
struct reclaim_state *reclaim_state = current->reclaim_state;
|
||||
gfp_t orig_mask;
|
||||
struct shrink_control shrink = {
|
||||
.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
|
||||
* highmem pages could be pinning lowmem pages storing buffer_heads
|
||||
*/
|
||||
orig_mask = sc->gfp_mask;
|
||||
if (buffer_heads_over_limit)
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue