diff options
Diffstat (limited to 'include/linux/mm.h')
| -rw-r--r-- | include/linux/mm.h | 53 | 
1 files changed, 48 insertions, 5 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index 0755b9fd03a7..2e872f92dbac 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -27,6 +27,7 @@ struct anon_vma_chain;  struct file_ra_state;  struct user_struct;  struct writeback_control; +struct bdi_writeback;  #ifndef CONFIG_NEED_MULTIPLE_NODES	/* Don't use mapnrs, do it properly */  extern unsigned long max_mapnr; @@ -499,7 +500,7 @@ static inline int page_count(struct page *page)  static inline bool __compound_tail_refcounted(struct page *page)  { -	return !PageSlab(page) && !PageHeadHuge(page); +	return PageAnon(page) && !PageSlab(page) && !PageHeadHuge(page);  }  /* @@ -1211,10 +1212,13 @@ int __set_page_dirty_nobuffers(struct page *page);  int __set_page_dirty_no_writeback(struct page *page);  int redirty_page_for_writepage(struct writeback_control *wbc,  				struct page *page); -void account_page_dirtied(struct page *page, struct address_space *mapping); -void account_page_cleaned(struct page *page, struct address_space *mapping); +void account_page_dirtied(struct page *page, struct address_space *mapping, +			  struct mem_cgroup *memcg); +void account_page_cleaned(struct page *page, struct address_space *mapping, +			  struct mem_cgroup *memcg, struct bdi_writeback *wb);  int set_page_dirty(struct page *page);  int set_page_dirty_lock(struct page *page); +void cancel_dirty_page(struct page *page);  int clear_page_dirty_for_io(struct page *page);  int get_cmdline(struct task_struct *task, char *buffer, int buflen); @@ -1631,6 +1635,8 @@ extern void free_highmem_page(struct page *page);  extern void adjust_managed_page_count(struct page *page, long count);  extern void mem_init_print_info(const char *str); +extern void reserve_bootmem_region(unsigned long start, unsigned long end); +  /* Free the reserved page into the buddy system, so it gets managed. */  static inline void __free_reserved_page(struct page *page)  { @@ -1720,7 +1726,8 @@ extern void sparse_memory_present_with_active_regions(int nid);  #if !defined(CONFIG_HAVE_MEMBLOCK_NODE_MAP) && \      !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID) -static inline int __early_pfn_to_nid(unsigned long pfn) +static inline int __early_pfn_to_nid(unsigned long pfn, +					struct mminit_pfnnid_cache *state)  {  	return 0;  } @@ -1728,7 +1735,8 @@ static inline int __early_pfn_to_nid(unsigned long pfn)  /* please see mm/page_alloc.c */  extern int __meminit early_pfn_to_nid(unsigned long pfn);  /* there is a per-arch backend function. */ -extern int __meminit __early_pfn_to_nid(unsigned long pfn); +extern int __meminit __early_pfn_to_nid(unsigned long pfn, +					struct mminit_pfnnid_cache *state);  #endif  extern void set_dma_reserve(unsigned long new_dma_reserve); @@ -2146,12 +2154,47 @@ enum mf_flags {  extern int memory_failure(unsigned long pfn, int trapno, int flags);  extern void memory_failure_queue(unsigned long pfn, int trapno, int flags);  extern int unpoison_memory(unsigned long pfn); +extern int get_hwpoison_page(struct page *page);  extern int sysctl_memory_failure_early_kill;  extern int sysctl_memory_failure_recovery;  extern void shake_page(struct page *p, int access);  extern atomic_long_t num_poisoned_pages;  extern int soft_offline_page(struct page *page, int flags); + +/* + * Error handlers for various types of pages. + */ +enum mf_result { +	MF_IGNORED,	/* Error: cannot be handled */ +	MF_FAILED,	/* Error: handling failed */ +	MF_DELAYED,	/* Will be handled later */ +	MF_RECOVERED,	/* Successfully recovered */ +}; + +enum mf_action_page_type { +	MF_MSG_KERNEL, +	MF_MSG_KERNEL_HIGH_ORDER, +	MF_MSG_SLAB, +	MF_MSG_DIFFERENT_COMPOUND, +	MF_MSG_POISONED_HUGE, +	MF_MSG_HUGE, +	MF_MSG_FREE_HUGE, +	MF_MSG_UNMAP_FAILED, +	MF_MSG_DIRTY_SWAPCACHE, +	MF_MSG_CLEAN_SWAPCACHE, +	MF_MSG_DIRTY_MLOCKED_LRU, +	MF_MSG_CLEAN_MLOCKED_LRU, +	MF_MSG_DIRTY_UNEVICTABLE_LRU, +	MF_MSG_CLEAN_UNEVICTABLE_LRU, +	MF_MSG_DIRTY_LRU, +	MF_MSG_CLEAN_LRU, +	MF_MSG_TRUNCATED_LRU, +	MF_MSG_BUDDY, +	MF_MSG_BUDDY_2ND, +	MF_MSG_UNKNOWN, +}; +  #if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLBFS)  extern void clear_huge_page(struct page *page,  			    unsigned long addr,  |