aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/mm.h30
-rw-r--r--include/linux/mm_types.h4
-rw-r--r--mm/page_alloc.c2
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
697static inline int page_xchg_last_nid(struct page *page, int nid)
698{
699 return xchg(&page->_last_nid, nid);
700}
701
702static inline int page_last_nid(struct page *page)
703{
704 return page->_last_nid;
705}
706static inline void reset_page_last_nid(struct page *page)
707{
708 page->_last_nid = -1;
709}
710#else
711static inline int page_xchg_last_nid(struct page *page, int nid)
712{
713 return page_to_nid(page);
714}
715
716static inline int page_last_nid(struct page *page)
717{
718 return page_to_nid(page);
719}
720
721static inline void reset_page_last_nid(struct page *page)
722{
723}
724#endif
725
696static inline struct zone *page_zone(const struct page *page) 726static 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