diff options
Diffstat (limited to 'include/linux/page-isolation.h')
| -rw-r--r-- | include/linux/page-isolation.h | 69 |
1 files changed, 38 insertions, 31 deletions
diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h index 5456b7be38ae..3e2f960e166c 100644 --- a/include/linux/page-isolation.h +++ b/include/linux/page-isolation.h @@ -3,10 +3,6 @@ #define __LINUX_PAGEISOLATION_H #ifdef CONFIG_MEMORY_ISOLATION -static inline bool has_isolate_pageblock(struct zone *zone) -{ - return zone->nr_isolate_pageblock; -} static inline bool is_migrate_isolate_page(struct page *page) { return get_pageblock_migratetype(page) == MIGRATE_ISOLATE; @@ -15,49 +11,60 @@ static inline bool is_migrate_isolate(int migratetype) { return migratetype == MIGRATE_ISOLATE; } +#define get_pageblock_isolate(page) \ + get_pfnblock_bit(page, page_to_pfn(page), PB_migrate_isolate) +#define clear_pageblock_isolate(page) \ + clear_pfnblock_bit(page, page_to_pfn(page), PB_migrate_isolate) +#define set_pageblock_isolate(page) \ + set_pfnblock_bit(page, page_to_pfn(page), PB_migrate_isolate) #else -static inline bool has_isolate_pageblock(struct zone *zone) +static inline bool is_migrate_isolate_page(struct page *page) { return false; } -static inline bool is_migrate_isolate_page(struct page *page) +static inline bool is_migrate_isolate(int migratetype) { return false; } -static inline bool is_migrate_isolate(int migratetype) +static inline bool get_pageblock_isolate(struct page *page) { return false; } +static inline void clear_pageblock_isolate(struct page *page) +{ +} +static inline void set_pageblock_isolate(struct page *page) +{ +} #endif -#define MEMORY_OFFLINE 0x1 -#define REPORT_FAILURE 0x2 - -void set_pageblock_migratetype(struct page *page, int migratetype); -int move_freepages_block(struct zone *zone, struct page *page, - int migratetype, int *num_movable); - /* - * Changes migrate type in [start_pfn, end_pfn) to be MIGRATE_ISOLATE. + * Pageblock isolation modes: + * PB_ISOLATE_MODE_MEM_OFFLINE - isolate to offline (!allocate) memory + * e.g., skip over PageHWPoison() pages and + * PageOffline() pages. Unmovable pages will be + * reported in this mode. + * PB_ISOLATE_MODE_CMA_ALLOC - isolate for CMA allocations + * PB_ISOLATE_MODE_OTHER - isolate for other purposes */ -int -start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, - int migratetype, int flags, gfp_t gfp_flags); +enum pb_isolate_mode { + PB_ISOLATE_MODE_MEM_OFFLINE, + PB_ISOLATE_MODE_CMA_ALLOC, + PB_ISOLATE_MODE_OTHER, +}; -/* - * Changes MIGRATE_ISOLATE to MIGRATE_MOVABLE. - * target range is [start_pfn, end_pfn) - */ -void -undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, - int migratetype); +void __meminit init_pageblock_migratetype(struct page *page, + enum migratetype migratetype, + bool isolate); -/* - * Test all pages in [start_pfn, end_pfn) are isolated or not. - */ -int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn, - int isol_flags); +bool pageblock_isolate_and_move_free_pages(struct zone *zone, struct page *page); +bool pageblock_unisolate_and_move_free_pages(struct zone *zone, struct page *page); -struct page *alloc_migrate_target(struct page *page, unsigned long private); +int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, + enum pb_isolate_mode mode); +void undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn); + +int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn, + enum pb_isolate_mode mode); #endif |
