Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 619d0d76 authored by Weijie Yang's avatar Weijie Yang Committed by Linus Torvalds
Browse files

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 cc715d99 ("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: default avatarWeijie Yang <weijie.yang@samsung.com>
Acked-by: default avatarMel Gorman <mgorman@suse.de>
Acked-by: default avatarRik van Riel <riel@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent a5338093
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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;
}