aboutsummaryrefslogtreecommitdiffstats
path: root/mm/vmscan.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r--mm/vmscan.c52
1 files changed, 28 insertions, 24 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c
index c55763ee8312..915dceb487c1 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -89,12 +89,6 @@ struct scan_control {
89 * are scanned. 89 * are scanned.
90 */ 90 */
91 nodemask_t *nodemask; 91 nodemask_t *nodemask;
92
93 /* Pluggable isolate pages callback */
94 unsigned long (*isolate_pages)(unsigned long nr, struct list_head *dst,
95 unsigned long *scanned, int order, int mode,
96 struct zone *z, struct mem_cgroup *mem_cont,
97 int active, int file);
98}; 92};
99 93
100#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru)) 94#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))
@@ -1010,7 +1004,6 @@ static unsigned long isolate_pages_global(unsigned long nr,
1010 struct list_head *dst, 1004 struct list_head *dst,
1011 unsigned long *scanned, int order, 1005 unsigned long *scanned, int order,
1012 int mode, struct zone *z, 1006 int mode, struct zone *z,
1013 struct mem_cgroup *mem_cont,
1014 int active, int file) 1007 int active, int file)
1015{ 1008{
1016 int lru = LRU_BASE; 1009 int lru = LRU_BASE;
@@ -1154,11 +1147,11 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
1154 unsigned long nr_anon; 1147 unsigned long nr_anon;
1155 unsigned long nr_file; 1148 unsigned long nr_file;
1156 1149
1157 nr_taken = sc->isolate_pages(SWAP_CLUSTER_MAX,
1158 &page_list, &nr_scan, sc->order, mode,
1159 zone, sc->mem_cgroup, 0, file);
1160
1161 if (scanning_global_lru(sc)) { 1150 if (scanning_global_lru(sc)) {
1151 nr_taken = isolate_pages_global(SWAP_CLUSTER_MAX,
1152 &page_list, &nr_scan,
1153 sc->order, mode,
1154 zone, 0, file);
1162 zone->pages_scanned += nr_scan; 1155 zone->pages_scanned += nr_scan;
1163 if (current_is_kswapd()) 1156 if (current_is_kswapd())
1164 __count_zone_vm_events(PGSCAN_KSWAPD, zone, 1157 __count_zone_vm_events(PGSCAN_KSWAPD, zone,
@@ -1166,6 +1159,16 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
1166 else 1159 else
1167 __count_zone_vm_events(PGSCAN_DIRECT, zone, 1160 __count_zone_vm_events(PGSCAN_DIRECT, zone,
1168 nr_scan); 1161 nr_scan);
1162 } else {
1163 nr_taken = mem_cgroup_isolate_pages(SWAP_CLUSTER_MAX,
1164 &page_list, &nr_scan,
1165 sc->order, mode,
1166 zone, sc->mem_cgroup,
1167 0, file);
1168 /*
1169 * mem_cgroup_isolate_pages() keeps track of
1170 * scanned pages on its own.
1171 */
1169 } 1172 }
1170 1173
1171 if (nr_taken == 0) 1174 if (nr_taken == 0)
@@ -1343,16 +1346,23 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone,
1343 1346
1344 lru_add_drain(); 1347 lru_add_drain();
1345 spin_lock_irq(&zone->lru_lock); 1348 spin_lock_irq(&zone->lru_lock);
1346 nr_taken = sc->isolate_pages(nr_pages, &l_hold, &pgscanned, sc->order,
1347 ISOLATE_ACTIVE, zone,
1348 sc->mem_cgroup, 1, file);
1349 /*
1350 * zone->pages_scanned is used for detect zone's oom
1351 * mem_cgroup remembers nr_scan by itself.
1352 */
1353 if (scanning_global_lru(sc)) { 1349 if (scanning_global_lru(sc)) {
1350 nr_taken = isolate_pages_global(nr_pages, &l_hold,
1351 &pgscanned, sc->order,
1352 ISOLATE_ACTIVE, zone,
1353 1, file);
1354 zone->pages_scanned += pgscanned; 1354 zone->pages_scanned += pgscanned;
1355 } else {
1356 nr_taken = mem_cgroup_isolate_pages(nr_pages, &l_hold,
1357 &pgscanned, sc->order,
1358 ISOLATE_ACTIVE, zone,
1359 sc->mem_cgroup, 1, file);
1360 /*
1361 * mem_cgroup_isolate_pages() keeps track of
1362 * scanned pages on its own.
1363 */
1355 } 1364 }
1365
1356 reclaim_stat->recent_scanned[file] += nr_taken; 1366 reclaim_stat->recent_scanned[file] += nr_taken;
1357 1367
1358 __count_zone_vm_events(PGREFILL, zone, pgscanned); 1368 __count_zone_vm_events(PGREFILL, zone, pgscanned);
@@ -1882,7 +1892,6 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order,
1882 .swappiness = vm_swappiness, 1892 .swappiness = vm_swappiness,
1883 .order = order, 1893 .order = order,
1884 .mem_cgroup = NULL, 1894 .mem_cgroup = NULL,
1885 .isolate_pages = isolate_pages_global,
1886 .nodemask = nodemask, 1895 .nodemask = nodemask,
1887 }; 1896 };
1888 1897
@@ -1903,7 +1912,6 @@ unsigned long mem_cgroup_shrink_node_zone(struct mem_cgroup *mem,
1903 .swappiness = swappiness, 1912 .swappiness = swappiness,
1904 .order = 0, 1913 .order = 0,
1905 .mem_cgroup = mem, 1914 .mem_cgroup = mem,
1906 .isolate_pages = mem_cgroup_isolate_pages,
1907 }; 1915 };
1908 nodemask_t nm = nodemask_of_node(nid); 1916 nodemask_t nm = nodemask_of_node(nid);
1909 1917
@@ -1937,7 +1945,6 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem_cont,
1937 .swappiness = swappiness, 1945 .swappiness = swappiness,
1938 .order = 0, 1946 .order = 0,
1939 .mem_cgroup = mem_cont, 1947 .mem_cgroup = mem_cont,
1940 .isolate_pages = mem_cgroup_isolate_pages,
1941 .nodemask = NULL, /* we don't care the placement */ 1948 .nodemask = NULL, /* we don't care the placement */
1942 }; 1949 };
1943 1950
@@ -2015,7 +2022,6 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order)
2015 .swappiness = vm_swappiness, 2022 .swappiness = vm_swappiness,
2016 .order = order, 2023 .order = order,
2017 .mem_cgroup = NULL, 2024 .mem_cgroup = NULL,
2018 .isolate_pages = isolate_pages_global,
2019 }; 2025 };
2020 /* 2026 /*
2021 * temp_priority is used to remember the scanning priority at which 2027 * temp_priority is used to remember the scanning priority at which
@@ -2394,7 +2400,6 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim)
2394 .hibernation_mode = 1, 2400 .hibernation_mode = 1,
2395 .swappiness = vm_swappiness, 2401 .swappiness = vm_swappiness,
2396 .order = 0, 2402 .order = 0,
2397 .isolate_pages = isolate_pages_global,
2398 }; 2403 };
2399 struct zonelist * zonelist = node_zonelist(numa_node_id(), sc.gfp_mask); 2404 struct zonelist * zonelist = node_zonelist(numa_node_id(), sc.gfp_mask);
2400 struct task_struct *p = current; 2405 struct task_struct *p = current;
@@ -2579,7 +2584,6 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order)
2579 .gfp_mask = gfp_mask, 2584 .gfp_mask = gfp_mask,
2580 .swappiness = vm_swappiness, 2585 .swappiness = vm_swappiness,
2581 .order = order, 2586 .order = order,
2582 .isolate_pages = isolate_pages_global,
2583 }; 2587 };
2584 unsigned long slab_reclaimable; 2588 unsigned long slab_reclaimable;
2585 2589