diff options
-rw-r--r-- | include/linux/mm.h | 4 | ||||
-rw-r--r-- | mm/page_alloc.c | 7 |
2 files changed, 7 insertions, 4 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 4ed5c7367b9b..b01e585ab4b5 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -240,13 +240,13 @@ struct inode; | |||
240 | /* It's valid only if the page is free path or free_list */ | 240 | /* It's valid only if the page is free path or free_list */ |
241 | static inline void set_freepage_migratetype(struct page *page, int migratetype) | 241 | static inline void set_freepage_migratetype(struct page *page, int migratetype) |
242 | { | 242 | { |
243 | set_page_private(page, migratetype); | 243 | page->index = migratetype; |
244 | } | 244 | } |
245 | 245 | ||
246 | /* It's valid only if the page is free path or free_list */ | 246 | /* It's valid only if the page is free path or free_list */ |
247 | static inline int get_freepage_migratetype(struct page *page) | 247 | static inline int get_freepage_migratetype(struct page *page) |
248 | { | 248 | { |
249 | return page_private(page); | 249 | return page->index; |
250 | } | 250 | } |
251 | 251 | ||
252 | /* | 252 | /* |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 6aa0a8e89c5d..94fd283dde98 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -729,6 +729,7 @@ static void __free_pages_ok(struct page *page, unsigned int order) | |||
729 | { | 729 | { |
730 | unsigned long flags; | 730 | unsigned long flags; |
731 | int wasMlocked = __TestClearPageMlocked(page); | 731 | int wasMlocked = __TestClearPageMlocked(page); |
732 | int migratetype; | ||
732 | 733 | ||
733 | if (!free_pages_prepare(page, order)) | 734 | if (!free_pages_prepare(page, order)) |
734 | return; | 735 | return; |
@@ -737,8 +738,9 @@ static void __free_pages_ok(struct page *page, unsigned int order) | |||
737 | if (unlikely(wasMlocked)) | 738 | if (unlikely(wasMlocked)) |
738 | free_page_mlock(page); | 739 | free_page_mlock(page); |
739 | __count_vm_events(PGFREE, 1 << order); | 740 | __count_vm_events(PGFREE, 1 << order); |
740 | free_one_page(page_zone(page), page, order, | 741 | migratetype = get_pageblock_migratetype(page); |
741 | get_pageblock_migratetype(page)); | 742 | set_freepage_migratetype(page, migratetype); |
743 | free_one_page(page_zone(page), page, order, migratetype); | ||
742 | local_irq_restore(flags); | 744 | local_irq_restore(flags); |
743 | } | 745 | } |
744 | 746 | ||
@@ -959,6 +961,7 @@ static int move_freepages(struct zone *zone, | |||
959 | order = page_order(page); | 961 | order = page_order(page); |
960 | list_move(&page->lru, | 962 | list_move(&page->lru, |
961 | &zone->free_area[order].free_list[migratetype]); | 963 | &zone->free_area[order].free_list[migratetype]); |
964 | set_freepage_migratetype(page, migratetype); | ||
962 | page += 1 << order; | 965 | page += 1 << order; |
963 | pages_moved += 1 << order; | 966 | pages_moved += 1 << order; |
964 | } | 967 | } |