diff options
-rw-r--r-- | include/linux/mm.h | 30 | ||||
-rw-r--r-- | include/linux/mm_types.h | 4 | ||||
-rw-r--r-- | mm/page_alloc.c | 2 |
3 files changed, 36 insertions, 0 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index d04c2f0aab36..d87f9ec4a145 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -693,6 +693,36 @@ static inline int page_to_nid(const struct page *page) | |||
693 | } | 693 | } |
694 | #endif | 694 | #endif |
695 | 695 | ||
696 | #ifdef CONFIG_NUMA_BALANCING | ||
697 | static inline int page_xchg_last_nid(struct page *page, int nid) | ||
698 | { | ||
699 | return xchg(&page->_last_nid, nid); | ||
700 | } | ||
701 | |||
702 | static inline int page_last_nid(struct page *page) | ||
703 | { | ||
704 | return page->_last_nid; | ||
705 | } | ||
706 | static inline void reset_page_last_nid(struct page *page) | ||
707 | { | ||
708 | page->_last_nid = -1; | ||
709 | } | ||
710 | #else | ||
711 | static inline int page_xchg_last_nid(struct page *page, int nid) | ||
712 | { | ||
713 | return page_to_nid(page); | ||
714 | } | ||
715 | |||
716 | static inline int page_last_nid(struct page *page) | ||
717 | { | ||
718 | return page_to_nid(page); | ||
719 | } | ||
720 | |||
721 | static inline void reset_page_last_nid(struct page *page) | ||
722 | { | ||
723 | } | ||
724 | #endif | ||
725 | |||
696 | static inline struct zone *page_zone(const struct page *page) | 726 | static inline struct zone *page_zone(const struct page *page) |
697 | { | 727 | { |
698 | return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)]; | 728 | return &NODE_DATA(page_to_nid(page))->node_zones[page_zonenum(page)]; |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index d1e246c5e50c..c5fffa239861 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -175,6 +175,10 @@ struct page { | |||
175 | */ | 175 | */ |
176 | void *shadow; | 176 | void *shadow; |
177 | #endif | 177 | #endif |
178 | |||
179 | #ifdef CONFIG_NUMA_BALANCING | ||
180 | int _last_nid; | ||
181 | #endif | ||
178 | } | 182 | } |
179 | /* | 183 | /* |
180 | * The struct page can be forced to be double word aligned so that atomic ops | 184 | * The struct page can be forced to be double word aligned so that atomic ops |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index ef025e20dbee..73f226a1206e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -608,6 +608,7 @@ static inline int free_pages_check(struct page *page) | |||
608 | bad_page(page); | 608 | bad_page(page); |
609 | return 1; | 609 | return 1; |
610 | } | 610 | } |
611 | reset_page_last_nid(page); | ||
611 | if (page->flags & PAGE_FLAGS_CHECK_AT_PREP) | 612 | if (page->flags & PAGE_FLAGS_CHECK_AT_PREP) |
612 | page->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; | 613 | page->flags &= ~PAGE_FLAGS_CHECK_AT_PREP; |
613 | return 0; | 614 | return 0; |
@@ -3826,6 +3827,7 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone, | |||
3826 | mminit_verify_page_links(page, zone, nid, pfn); | 3827 | mminit_verify_page_links(page, zone, nid, pfn); |
3827 | init_page_count(page); | 3828 | init_page_count(page); |
3828 | reset_page_mapcount(page); | 3829 | reset_page_mapcount(page); |
3830 | reset_page_last_nid(page); | ||
3829 | SetPageReserved(page); | 3831 | SetPageReserved(page); |
3830 | /* | 3832 | /* |
3831 | * Mark the block movable so that blocks are reserved for | 3833 | * Mark the block movable so that blocks are reserved for |