diff options
Diffstat (limited to 'fs/proc/page.c')
| -rw-r--r-- | fs/proc/page.c | 16 | 
1 files changed, 13 insertions, 3 deletions
| diff --git a/fs/proc/page.c b/fs/proc/page.c index 1e3187da1fed..7eee2d8b97d9 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -5,6 +5,7 @@  #include <linux/ksm.h>  #include <linux/mm.h>  #include <linux/mmzone.h> +#include <linux/huge_mm.h>  #include <linux/proc_fs.h>  #include <linux/seq_file.h>  #include <linux/hugetlb.h> @@ -121,9 +122,18 @@ u64 stable_page_flags(struct page *page)  	 * just checks PG_head/PG_tail, so we need to check PageLRU/PageAnon  	 * to make sure a given page is a thp, not a non-huge compound page.  	 */ -	else if (PageTransCompound(page) && (PageLRU(compound_head(page)) || -					     PageAnon(compound_head(page)))) -		u |= 1 << KPF_THP; +	else if (PageTransCompound(page)) { +		struct page *head = compound_head(page); + +		if (PageLRU(head) || PageAnon(head)) +			u |= 1 << KPF_THP; +		else if (is_huge_zero_page(head)) { +			u |= 1 << KPF_ZERO_PAGE; +			u |= 1 << KPF_THP; +		} +	} else if (is_zero_pfn(page_to_pfn(page))) +		u |= 1 << KPF_ZERO_PAGE; +  	/*  	 * Caveats on high order pages: page->_count will only be set |