aboutsummaryrefslogtreecommitdiffstats
path: root/mm/vmscan.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r--mm/vmscan.c83
1 files changed, 58 insertions, 25 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index f6b435c80079..7e0116150dc7 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -42,6 +42,7 @@
42#include <linux/delayacct.h> 42#include <linux/delayacct.h>
43#include <linux/sysctl.h> 43#include <linux/sysctl.h>
44#include <linux/oom.h> 44#include <linux/oom.h>
45#include <linux/prefetch.h>
45 46
46#include <asm/tlbflush.h> 47#include <asm/tlbflush.h>
47#include <asm/div64.h> 48#include <asm/div64.h>
@@ -201,6 +202,14 @@ void unregister_shrinker(struct shrinker *shrinker)
201} 202}
202EXPORT_SYMBOL(unregister_shrinker); 203EXPORT_SYMBOL(unregister_shrinker);
203 204
205static inline int do_shrinker_shrink(struct shrinker *shrinker,
206 struct shrink_control *sc,
207 unsigned long nr_to_scan)
208{
209 sc->nr_to_scan = nr_to_scan;
210 return (*shrinker->shrink)(shrinker, sc);
211}
212
204#define SHRINK_BATCH 128 213#define SHRINK_BATCH 128
205/* 214/*
206 * Call the shrink functions to age shrinkable caches 215 * Call the shrink functions to age shrinkable caches
@@ -221,25 +230,29 @@ EXPORT_SYMBOL(unregister_shrinker);
221 * 230 *
222 * Returns the number of slab objects which we shrunk. 231 * Returns the number of slab objects which we shrunk.
223 */ 232 */
224unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask, 233unsigned long shrink_slab(struct shrink_control *shrink,
225 unsigned long lru_pages) 234 unsigned long nr_pages_scanned,
235 unsigned long lru_pages)
226{ 236{
227 struct shrinker *shrinker; 237 struct shrinker *shrinker;
228 unsigned long ret = 0; 238 unsigned long ret = 0;
229 239
230 if (scanned == 0) 240 if (nr_pages_scanned == 0)
231 scanned = SWAP_CLUSTER_MAX; 241 nr_pages_scanned = SWAP_CLUSTER_MAX;
232 242
233 if (!down_read_trylock(&shrinker_rwsem)) 243 if (!down_read_trylock(&shrinker_rwsem)) {
234 return 1; /* Assume we'll be able to shrink next time */ 244 /* Assume we'll be able to shrink next time */
245 ret = 1;
246 goto out;
247 }
235 248
236 list_for_each_entry(shrinker, &shrinker_list, list) { 249 list_for_each_entry(shrinker, &shrinker_list, list) {
237 unsigned long long delta; 250 unsigned long long delta;
238 unsigned long total_scan; 251 unsigned long total_scan;
239 unsigned long max_pass; 252 unsigned long max_pass;
240 253
241 max_pass = (*shrinker->shrink)(shrinker, 0, gfp_mask); 254 max_pass = do_shrinker_shrink(shrinker, shrink, 0);
242 delta = (4 * scanned) / shrinker->seeks; 255 delta = (4 * nr_pages_scanned) / shrinker->seeks;
243 delta *= max_pass; 256 delta *= max_pass;
244 do_div(delta, lru_pages + 1); 257 do_div(delta, lru_pages + 1);
245 shrinker->nr += delta; 258 shrinker->nr += delta;
@@ -266,9 +279,9 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
266 int shrink_ret; 279 int shrink_ret;
267 int nr_before; 280 int nr_before;
268 281
269 nr_before = (*shrinker->shrink)(shrinker, 0, gfp_mask); 282 nr_before = do_shrinker_shrink(shrinker, shrink, 0);
270 shrink_ret = (*shrinker->shrink)(shrinker, this_scan, 283 shrink_ret = do_shrinker_shrink(shrinker, shrink,
271 gfp_mask); 284 this_scan);
272 if (shrink_ret == -1) 285 if (shrink_ret == -1)
273 break; 286 break;
274 if (shrink_ret < nr_before) 287 if (shrink_ret < nr_before)
@@ -282,6 +295,8 @@ unsigned long shrink_slab(unsigned long scanned, gfp_t gfp_mask,
282 shrinker->nr += total_scan; 295 shrinker->nr += total_scan;
283 } 296 }
284 up_read(&shrinker_rwsem); 297 up_read(&shrinker_rwsem);
298out:
299 cond_resched();
285 return ret; 300 return ret;
286} 301}
287 302
@@ -937,7 +952,7 @@ keep_lumpy:
937 * back off and wait for congestion to clear because further reclaim 952 * back off and wait for congestion to clear because further reclaim
938 * will encounter the same problem 953 * will encounter the same problem
939 */ 954 */
940 if (nr_dirty == nr_congested && nr_dirty != 0) 955 if (nr_dirty && nr_dirty == nr_congested && scanning_global_lru(sc))
941 zone_set_flag(zone, ZONE_CONGESTED); 956 zone_set_flag(zone, ZONE_CONGESTED);
942 957
943 free_page_list(&free_pages); 958 free_page_list(&free_pages);
@@ -1201,13 +1216,16 @@ int isolate_lru_page(struct page *page)
1201{ 1216{
1202 int ret = -EBUSY; 1217 int ret = -EBUSY;
1203 1218
1219 VM_BUG_ON(!page_count(page));
1220
1204 if (PageLRU(page)) { 1221 if (PageLRU(page)) {
1205 struct zone *zone = page_zone(page); 1222 struct zone *zone = page_zone(page);
1206 1223
1207 spin_lock_irq(&zone->lru_lock); 1224 spin_lock_irq(&zone->lru_lock);
1208 if (PageLRU(page) && get_page_unless_zero(page)) { 1225 if (PageLRU(page)) {
1209 int lru = page_lru(page); 1226 int lru = page_lru(page);
1210 ret = 0; 1227 ret = 0;
1228 get_page(page);
1211 ClearPageLRU(page); 1229 ClearPageLRU(page);
1212 1230
1213 del_page_from_lru_list(zone, page, lru); 1231 del_page_from_lru_list(zone, page, lru);
@@ -2026,7 +2044,8 @@ static bool all_unreclaimable(struct zonelist *zonelist,
2026 * else, the number of pages reclaimed 2044 * else, the number of pages reclaimed
2027 */ 2045 */
2028static unsigned long do_try_to_free_pages(struct zonelist *zonelist, 2046static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
2029 struct scan_control *sc) 2047 struct scan_control *sc,
2048 struct shrink_control *shrink)
2030{ 2049{
2031 int priority; 2050 int priority;
2032 unsigned long total_scanned = 0; 2051 unsigned long total_scanned = 0;
@@ -2060,7 +2079,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist,
2060 lru_pages += zone_reclaimable_pages(zone); 2079 lru_pages += zone_reclaimable_pages(zone);
2061 } 2080 }
2062 2081
2063 shrink_slab(sc->nr_scanned, sc->gfp_mask, lru_pages); 2082 shrink_slab(shrink, sc->nr_scanned, lru_pages);
2064 if (reclaim_state) { 2083 if (reclaim_state) {
2065 sc->nr_reclaimed += reclaim_state->reclaimed_slab; 2084 sc->nr_reclaimed += reclaim_state->reclaimed_slab;
2066 reclaim_state->reclaimed_slab = 0; 2085 reclaim_state->reclaimed_slab = 0;
@@ -2132,12 +2151,15 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
2132 .mem_cgroup = NULL, 2151 .mem_cgroup = NULL,
2133 .nodemask = nodemask, 2152 .nodemask = nodemask,
2134 }; 2153 };
2154 struct shrink_control shrink = {
2155 .gfp_mask = sc.gfp_mask,
2156 };
2135 2157
2136 trace_mm_vmscan_direct_reclaim_begin(order, 2158 trace_mm_vmscan_direct_reclaim_begin(order,
2137 sc.may_writepage, 2159 sc.may_writepage,
2138 gfp_mask); 2160 gfp_mask);
2139 2161
2140 nr_reclaimed = do_try_to_free_pages(zonelist, &sc); 2162 nr_reclaimed = do_try_to_free_pages(zonelist, &sc, &shrink);
2141 2163
2142 trace_mm_vmscan_direct_reclaim_end(nr_reclaimed); 2164 trace_mm_vmscan_direct_reclaim_end(nr_reclaimed);
2143 2165
@@ -2197,17 +2219,20 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,
2197 .order = 0, 2219 .order = 0,
2198 .mem_cgroup = mem_cont, 2220 .mem_cgroup = mem_cont,
2199 .nodemask = NULL, /* we don't care the placement */ 2221 .nodemask = NULL, /* we don't care the placement */
2222 .gfp_mask = (gfp_mask & GFP_RECLAIM_MASK) |
2223 (GFP_HIGHUSER_MOVABLE & ~GFP_RECLAIM_MASK),
2224 };
2225 struct shrink_control shrink = {
2226 .gfp_mask = sc.gfp_mask,
2200 }; 2227 };
2201 2228
2202 sc.gfp_mask = (gfp_mask & GFP_RECLAIM_MASK) |
2203 (GFP_HIGHUSER_MOVABLE & ~GFP_RECLAIM_MASK);
2204 zonelist = NODE_DATA(numa_node_id())->node_zonelists; 2229 zonelist = NODE_DATA(numa_node_id())->node_zonelists;
2205 2230
2206 trace_mm_vmscan_memcg_reclaim_begin(0, 2231 trace_mm_vmscan_memcg_reclaim_begin(0,
2207 sc.may_writepage, 2232 sc.may_writepage,
2208 sc.gfp_mask); 2233 sc.gfp_mask);
2209 2234
2210 nr_reclaimed = do_try_to_free_pages(zonelist, &sc); 2235 nr_reclaimed = do_try_to_free_pages(zonelist, &sc, &shrink);
2211 2236
2212 trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed); 2237 trace_mm_vmscan_memcg_reclaim_end(nr_reclaimed);
2213 2238
@@ -2286,7 +2311,7 @@ static bool sleeping_prematurely(pg_data_t *pgdat, int order, long remaining,
2286 * must be balanced 2311 * must be balanced
2287 */ 2312 */
2288 if (order) 2313 if (order)
2289 return pgdat_balanced(pgdat, balanced, classzone_idx); 2314 return !pgdat_balanced(pgdat, balanced, classzone_idx);
2290 else 2315 else
2291 return !all_zones_ok; 2316 return !all_zones_ok;
2292} 2317}
@@ -2335,6 +2360,9 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order,
2335 .order = order, 2360 .order = order,
2336 .mem_cgroup = NULL, 2361 .mem_cgroup = NULL,
2337 }; 2362 };
2363 struct shrink_control shrink = {
2364 .gfp_mask = sc.gfp_mask,
2365 };
2338loop_again: 2366loop_again:
2339 total_scanned = 0; 2367 total_scanned = 0;
2340 sc.nr_reclaimed = 0; 2368 sc.nr_reclaimed = 0;
@@ -2434,8 +2462,7 @@ loop_again:
2434 end_zone, 0)) 2462 end_zone, 0))
2435 shrink_zone(priority, zone, &sc); 2463 shrink_zone(priority, zone, &sc);
2436 reclaim_state->reclaimed_slab = 0; 2464 reclaim_state->reclaimed_slab = 0;
2437 nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, 2465 nr_slab = shrink_slab(&shrink, sc.nr_scanned, lru_pages);
2438 lru_pages);
2439 sc.nr_reclaimed += reclaim_state->reclaimed_slab; 2466 sc.nr_reclaimed += reclaim_state->reclaimed_slab;
2440 total_scanned += sc.nr_scanned; 2467 total_scanned += sc.nr_scanned;
2441 2468
@@ -2787,7 +2814,10 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim)
2787 .swappiness = vm_swappiness, 2814 .swappiness = vm_swappiness,
2788 .order = 0, 2815 .order = 0,
2789 }; 2816 };
2790 struct zonelist * zonelist = node_zonelist(numa_node_id(), sc.gfp_mask); 2817 struct shrink_control shrink = {
2818 .gfp_mask = sc.gfp_mask,
2819 };
2820 struct zonelist *zonelist = node_zonelist(numa_node_id(), sc.gfp_mask);
2791 struct task_struct *p = current; 2821 struct task_struct *p = current;
2792 unsigned long nr_reclaimed; 2822 unsigned long nr_reclaimed;
2793 2823
@@ -2796,7 +2826,7 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim)
2796 reclaim_state.reclaimed_slab = 0; 2826 reclaim_state.reclaimed_slab = 0;
2797 p->reclaim_state = &reclaim_state; 2827 p->reclaim_state = &reclaim_state;
2798 2828
2799 nr_reclaimed = do_try_to_free_pages(zonelist, &sc); 2829 nr_reclaimed = do_try_to_free_pages(zonelist, &sc, &shrink);
2800 2830
2801 p->reclaim_state = NULL; 2831 p->reclaim_state = NULL;
2802 lockdep_clear_current_reclaim_state(); 2832 lockdep_clear_current_reclaim_state();
@@ -2971,6 +3001,9 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
2971 .swappiness = vm_swappiness, 3001 .swappiness = vm_swappiness,
2972 .order = order, 3002 .order = order,
2973 }; 3003 };
3004 struct shrink_control shrink = {
3005 .gfp_mask = sc.gfp_mask,
3006 };
2974 unsigned long nr_slab_pages0, nr_slab_pages1; 3007 unsigned long nr_slab_pages0, nr_slab_pages1;
2975 3008
2976 cond_resched(); 3009 cond_resched();
@@ -3012,7 +3045,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
3012 unsigned long lru_pages = zone_reclaimable_pages(zone); 3045 unsigned long lru_pages = zone_reclaimable_pages(zone);
3013 3046
3014 /* No reclaimable slab or very low memory pressure */ 3047 /* No reclaimable slab or very low memory pressure */
3015 if (!shrink_slab(sc.nr_scanned, gfp_mask, lru_pages)) 3048 if (!shrink_slab(&shrink, sc.nr_scanned, lru_pages))
3016 break; 3049 break;
3017 3050
3018 /* Freed enough memory */ 3051 /* Freed enough memory */