diff options
Diffstat (limited to 'mm/vmscan.c')
-rw-r--r-- | mm/vmscan.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/mm/vmscan.c b/mm/vmscan.c index faa0a088f9cc..8ff834e19c24 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1124,8 +1124,20 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan, | |||
1124 | nr_lumpy_dirty++; | 1124 | nr_lumpy_dirty++; |
1125 | scan++; | 1125 | scan++; |
1126 | } else { | 1126 | } else { |
1127 | /* the page is freed already. */ | 1127 | /* |
1128 | if (!page_count(cursor_page)) | 1128 | * Check if the page is freed already. |
1129 | * | ||
1130 | * We can't use page_count() as that | ||
1131 | * requires compound_head and we don't | ||
1132 | * have a pin on the page here. If a | ||
1133 | * page is tail, we may or may not | ||
1134 | * have isolated the head, so assume | ||
1135 | * it's not free, it'd be tricky to | ||
1136 | * track the head status without a | ||
1137 | * page pin. | ||
1138 | */ | ||
1139 | if (!PageTail(cursor_page) && | ||
1140 | !atomic_read(&cursor_page->_count)) | ||
1129 | continue; | 1141 | continue; |
1130 | break; | 1142 | break; |
1131 | } | 1143 | } |
@@ -2081,7 +2093,7 @@ static unsigned long do_try_to_free_pages(struct zonelist *zonelist, | |||
2081 | for (priority = DEF_PRIORITY; priority >= 0; priority--) { | 2093 | for (priority = DEF_PRIORITY; priority >= 0; priority--) { |
2082 | sc->nr_scanned = 0; | 2094 | sc->nr_scanned = 0; |
2083 | if (!priority) | 2095 | if (!priority) |
2084 | disable_swap_token(); | 2096 | disable_swap_token(sc->mem_cgroup); |
2085 | total_scanned += shrink_zones(priority, zonelist, sc); | 2097 | total_scanned += shrink_zones(priority, zonelist, sc); |
2086 | /* | 2098 | /* |
2087 | * Don't shrink slabs when reclaiming memory from | 2099 | * Don't shrink slabs when reclaiming memory from |
@@ -2407,7 +2419,7 @@ loop_again: | |||
2407 | 2419 | ||
2408 | /* The swap token gets in the way of swapout... */ | 2420 | /* The swap token gets in the way of swapout... */ |
2409 | if (!priority) | 2421 | if (!priority) |
2410 | disable_swap_token(); | 2422 | disable_swap_token(NULL); |
2411 | 2423 | ||
2412 | all_zones_ok = 1; | 2424 | all_zones_ok = 1; |
2413 | balanced = 0; | 2425 | balanced = 0; |