diff options
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 963e14c0486f..d66010e0049d 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -211,24 +211,29 @@ static void put_huge_zero_page(void) | |||
211 | BUG_ON(atomic_dec_and_test(&huge_zero_refcount)); | 211 | BUG_ON(atomic_dec_and_test(&huge_zero_refcount)); |
212 | } | 212 | } |
213 | 213 | ||
214 | static int shrink_huge_zero_page(struct shrinker *shrink, | 214 | static unsigned long shrink_huge_zero_page_count(struct shrinker *shrink, |
215 | struct shrink_control *sc) | 215 | struct shrink_control *sc) |
216 | { | 216 | { |
217 | if (!sc->nr_to_scan) | 217 | /* we can free zero page only if last reference remains */ |
218 | /* we can free zero page only if last reference remains */ | 218 | return atomic_read(&huge_zero_refcount) == 1 ? HPAGE_PMD_NR : 0; |
219 | return atomic_read(&huge_zero_refcount) == 1 ? HPAGE_PMD_NR : 0; | 219 | } |
220 | 220 | ||
221 | static unsigned long shrink_huge_zero_page_scan(struct shrinker *shrink, | ||
222 | struct shrink_control *sc) | ||
223 | { | ||
221 | if (atomic_cmpxchg(&huge_zero_refcount, 1, 0) == 1) { | 224 | if (atomic_cmpxchg(&huge_zero_refcount, 1, 0) == 1) { |
222 | struct page *zero_page = xchg(&huge_zero_page, NULL); | 225 | struct page *zero_page = xchg(&huge_zero_page, NULL); |
223 | BUG_ON(zero_page == NULL); | 226 | BUG_ON(zero_page == NULL); |
224 | __free_page(zero_page); | 227 | __free_page(zero_page); |
228 | return HPAGE_PMD_NR; | ||
225 | } | 229 | } |
226 | 230 | ||
227 | return 0; | 231 | return 0; |
228 | } | 232 | } |
229 | 233 | ||
230 | static struct shrinker huge_zero_page_shrinker = { | 234 | static struct shrinker huge_zero_page_shrinker = { |
231 | .shrink = shrink_huge_zero_page, | 235 | .count_objects = shrink_huge_zero_page_count, |
236 | .scan_objects = shrink_huge_zero_page_scan, | ||
232 | .seeks = DEFAULT_SEEKS, | 237 | .seeks = DEFAULT_SEEKS, |
233 | }; | 238 | }; |
234 | 239 | ||