Messages in this thread Patch in this message | | | From | Weijie Yang <> | Subject | [PATCH 1/2] mm/vmscan: restore sc->gfp_mask after promoting it to __GFP_HIGHMEM | Date | Thu, 13 Feb 2014 10:39:58 +0800 |
| |
We promote sc->gfp_mask to __GFP_HIGHMEM to forcibly scan highmem if there are too many buffer_heads pinning highmem. see: cc715d99e5
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> --- mm/vmscan.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) mode change 100644 => 100755 mm/vmscan.c
diff --git a/mm/vmscan.c b/mm/vmscan.c old mode 100644 new mode 100755 index a9c74b4..35879f0 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2298,14 +2298,17 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc) unsigned long nr_soft_reclaimed; unsigned long nr_soft_scanned; bool aborted_reclaim = false; + bool promoted_mask = false; /* * If the number of buffer_heads in the machine exceeds the maximum * allowed level, force direct reclaim to scan the highmem zone as * highmem pages could be pinning lowmem pages storing buffer_heads */ - if (buffer_heads_over_limit) + if (buffer_heads_over_limit) { + promoted_mask = !(sc->gfp_mask & __GFP_HIGHMEM); sc->gfp_mask |= __GFP_HIGHMEM; + } for_each_zone_zonelist_nodemask(zone, z, zonelist, gfp_zone(sc->gfp_mask), sc->nodemask) { @@ -2354,6 +2357,9 @@ static bool shrink_zones(struct zonelist *zonelist, struct scan_control *sc) shrink_zone(zone, sc); } + if (promoted_mask) + sc->gfp_mask &= ~__GFP_HIGHMEM; + return aborted_reclaim; } -- 1.7.10.4
| |