diff mbox series

[v2,3/3] mm: Introduce compound_nr()

Message ID 20190721104612.19120-4-willy@infradead.org (mailing list archive)
State New, archived
Headers show
Series Make working with compound pages easier | expand

Commit Message

Matthew Wilcox July 21, 2019, 10:46 a.m. UTC
From: Matthew Wilcox (Oracle) <willy@infradead.org>

Replace 1 << compound_order(page) with compound_nr(page).  Minor
improvements in readability.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 arch/arm/include/asm/xen/page-coherent.h   | 3 +--
 arch/arm/mm/flush.c                        | 4 ++--
 arch/arm64/include/asm/xen/page-coherent.h | 3 +--
 arch/powerpc/mm/hugetlbpage.c              | 2 +-
 fs/proc/task_mmu.c                         | 2 +-
 include/linux/mm.h                         | 6 ++++++
 mm/compaction.c                            | 2 +-
 mm/filemap.c                               | 2 +-
 mm/gup.c                                   | 2 +-
 mm/hugetlb_cgroup.c                        | 2 +-
 mm/kasan/common.c                          | 2 +-
 mm/memcontrol.c                            | 4 ++--
 mm/memory_hotplug.c                        | 4 ++--
 mm/migrate.c                               | 2 +-
 mm/page_alloc.c                            | 2 +-
 mm/rmap.c                                  | 3 +--
 mm/shmem.c                                 | 8 ++++----
 mm/swap_state.c                            | 2 +-
 mm/util.c                                  | 2 +-
 mm/vmscan.c                                | 4 ++--
 20 files changed, 32 insertions(+), 29 deletions(-)

Comments

Ira Weiny July 23, 2019, 12:46 a.m. UTC | #1
On Sun, Jul 21, 2019 at 03:46:12AM -0700, Matthew Wilcox wrote:
> From: Matthew Wilcox (Oracle) <willy@infradead.org>
> 
> Replace 1 << compound_order(page) with compound_nr(page).  Minor
> improvements in readability.
> 
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>

Reviewed-by: Ira Weiny <ira.weiny@intel.com>

> ---
>  arch/arm/include/asm/xen/page-coherent.h   | 3 +--
>  arch/arm/mm/flush.c                        | 4 ++--
>  arch/arm64/include/asm/xen/page-coherent.h | 3 +--
>  arch/powerpc/mm/hugetlbpage.c              | 2 +-
>  fs/proc/task_mmu.c                         | 2 +-
>  include/linux/mm.h                         | 6 ++++++
>  mm/compaction.c                            | 2 +-
>  mm/filemap.c                               | 2 +-
>  mm/gup.c                                   | 2 +-
>  mm/hugetlb_cgroup.c                        | 2 +-
>  mm/kasan/common.c                          | 2 +-
>  mm/memcontrol.c                            | 4 ++--
>  mm/memory_hotplug.c                        | 4 ++--
>  mm/migrate.c                               | 2 +-
>  mm/page_alloc.c                            | 2 +-
>  mm/rmap.c                                  | 3 +--
>  mm/shmem.c                                 | 8 ++++----
>  mm/swap_state.c                            | 2 +-
>  mm/util.c                                  | 2 +-
>  mm/vmscan.c                                | 4 ++--
>  20 files changed, 32 insertions(+), 29 deletions(-)
> 
> diff --git a/arch/arm/include/asm/xen/page-coherent.h b/arch/arm/include/asm/xen/page-coherent.h
> index 2c403e7c782d..ea39cb724ffa 100644
> --- a/arch/arm/include/asm/xen/page-coherent.h
> +++ b/arch/arm/include/asm/xen/page-coherent.h
> @@ -31,8 +31,7 @@ static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
>  {
>  	unsigned long page_pfn = page_to_xen_pfn(page);
>  	unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr);
> -	unsigned long compound_pages =
> -		(1<<compound_order(page)) * XEN_PFN_PER_PAGE;
> +	unsigned long compound_pages = compound_nr(page) * XEN_PFN_PER_PAGE;
>  	bool local = (page_pfn <= dev_pfn) &&
>  		(dev_pfn - page_pfn < compound_pages);
>  
> diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
> index 4c7ebe094a83..6d89db7895d1 100644
> --- a/arch/arm/mm/flush.c
> +++ b/arch/arm/mm/flush.c
> @@ -208,13 +208,13 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page)
>  	} else {
>  		unsigned long i;
>  		if (cache_is_vipt_nonaliasing()) {
> -			for (i = 0; i < (1 << compound_order(page)); i++) {
> +			for (i = 0; i < compound_nr(page); i++) {
>  				void *addr = kmap_atomic(page + i);
>  				__cpuc_flush_dcache_area(addr, PAGE_SIZE);
>  				kunmap_atomic(addr);
>  			}
>  		} else {
> -			for (i = 0; i < (1 << compound_order(page)); i++) {
> +			for (i = 0; i < compound_nr(page); i++) {
>  				void *addr = kmap_high_get(page + i);
>  				if (addr) {
>  					__cpuc_flush_dcache_area(addr, PAGE_SIZE);
> diff --git a/arch/arm64/include/asm/xen/page-coherent.h b/arch/arm64/include/asm/xen/page-coherent.h
> index d88e56b90b93..b600a8ef3349 100644
> --- a/arch/arm64/include/asm/xen/page-coherent.h
> +++ b/arch/arm64/include/asm/xen/page-coherent.h
> @@ -45,8 +45,7 @@ static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
>  {
>  	unsigned long page_pfn = page_to_xen_pfn(page);
>  	unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr);
> -	unsigned long compound_pages =
> -		(1<<compound_order(page)) * XEN_PFN_PER_PAGE;
> +	unsigned long compound_pages = compound_nr(page) * XEN_PFN_PER_PAGE;
>  	bool local = (page_pfn <= dev_pfn) &&
>  		(dev_pfn - page_pfn < compound_pages);
>  
> diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
> index a8953f108808..73d4873fc7f8 100644
> --- a/arch/powerpc/mm/hugetlbpage.c
> +++ b/arch/powerpc/mm/hugetlbpage.c
> @@ -667,7 +667,7 @@ void flush_dcache_icache_hugepage(struct page *page)
>  
>  	BUG_ON(!PageCompound(page));
>  
> -	for (i = 0; i < (1UL << compound_order(page)); i++) {
> +	for (i = 0; i < compound_nr(page); i++) {
>  		if (!PageHighMem(page)) {
>  			__flush_dcache_icache(page_address(page+i));
>  		} else {
> diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
> index 731642e0f5a0..a9f2deb8ab79 100644
> --- a/fs/proc/task_mmu.c
> +++ b/fs/proc/task_mmu.c
> @@ -461,7 +461,7 @@ static void smaps_page_accumulate(struct mem_size_stats *mss,
>  static void smaps_account(struct mem_size_stats *mss, struct page *page,
>  		bool compound, bool young, bool dirty, bool locked)
>  {
> -	int i, nr = compound ? 1 << compound_order(page) : 1;
> +	int i, nr = compound ? compound_nr(page) : 1;
>  	unsigned long size = nr * PAGE_SIZE;
>  
>  	/*
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index 64762559885f..726d7f046b49 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -805,6 +805,12 @@ static inline void set_compound_order(struct page *page, unsigned int order)
>  	page[1].compound_order = order;
>  }
>  
> +/* Returns the number of pages in this potentially compound page. */
> +static inline unsigned long compound_nr(struct page *page)
> +{
> +	return 1UL << compound_order(page);
> +}
> +
>  /* Returns the number of bytes in this potentially compound page. */
>  static inline unsigned long page_size(struct page *page)
>  {
> diff --git a/mm/compaction.c b/mm/compaction.c
> index 9e1b9acb116b..78d42e2dbc64 100644
> --- a/mm/compaction.c
> +++ b/mm/compaction.c
> @@ -967,7 +967,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
>  			 * is safe to read and it's 0 for tail pages.
>  			 */
>  			if (unlikely(PageCompound(page))) {
> -				low_pfn += (1UL << compound_order(page)) - 1;
> +				low_pfn += compound_nr(page) - 1;
>  				goto isolate_fail;
>  			}
>  		}
> diff --git a/mm/filemap.c b/mm/filemap.c
> index d0cf700bf201..f00f53ad383f 100644
> --- a/mm/filemap.c
> +++ b/mm/filemap.c
> @@ -126,7 +126,7 @@ static void page_cache_delete(struct address_space *mapping,
>  	/* hugetlb pages are represented by a single entry in the xarray */
>  	if (!PageHuge(page)) {
>  		xas_set_order(&xas, page->index, compound_order(page));
> -		nr = 1U << compound_order(page);
> +		nr = compound_nr(page);
>  	}
>  
>  	VM_BUG_ON_PAGE(!PageLocked(page), page);
> diff --git a/mm/gup.c b/mm/gup.c
> index 98f13ab37bac..84a36d80dd2e 100644
> --- a/mm/gup.c
> +++ b/mm/gup.c
> @@ -1460,7 +1460,7 @@ static long check_and_migrate_cma_pages(struct task_struct *tsk,
>  		 * gup may start from a tail page. Advance step by the left
>  		 * part.
>  		 */
> -		step = (1 << compound_order(head)) - (pages[i] - head);
> +		step = compound_nr(head) - (pages[i] - head);
>  		/*
>  		 * If we get a page from the CMA zone, since we are going to
>  		 * be pinning these entries, we might as well move them out
> diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c
> index 68c2f2f3c05b..f1930fa0b445 100644
> --- a/mm/hugetlb_cgroup.c
> +++ b/mm/hugetlb_cgroup.c
> @@ -139,7 +139,7 @@ static void hugetlb_cgroup_move_parent(int idx, struct hugetlb_cgroup *h_cg,
>  	if (!page_hcg || page_hcg != h_cg)
>  		goto out;
>  
> -	nr_pages = 1 << compound_order(page);
> +	nr_pages = compound_nr(page);
>  	if (!parent) {
>  		parent = root_h_cgroup;
>  		/* root has no limit */
> diff --git a/mm/kasan/common.c b/mm/kasan/common.c
> index a929a3b9444d..895dc5e2b3d5 100644
> --- a/mm/kasan/common.c
> +++ b/mm/kasan/common.c
> @@ -319,7 +319,7 @@ void kasan_poison_slab(struct page *page)
>  {
>  	unsigned long i;
>  
> -	for (i = 0; i < (1 << compound_order(page)); i++)
> +	for (i = 0; i < compound_nr(page); i++)
>  		page_kasan_tag_reset(page + i);
>  	kasan_poison_shadow(page_address(page), page_size(page),
>  			KASAN_KMALLOC_REDZONE);
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index cdbb7a84cb6e..b5c4c618d087 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -6257,7 +6257,7 @@ static void uncharge_page(struct page *page, struct uncharge_gather *ug)
>  		unsigned int nr_pages = 1;
>  
>  		if (PageTransHuge(page)) {
> -			nr_pages <<= compound_order(page);
> +			nr_pages = compound_nr(page);
>  			ug->nr_huge += nr_pages;
>  		}
>  		if (PageAnon(page))
> @@ -6269,7 +6269,7 @@ static void uncharge_page(struct page *page, struct uncharge_gather *ug)
>  		}
>  		ug->pgpgout++;
>  	} else {
> -		ug->nr_kmem += 1 << compound_order(page);
> +		ug->nr_kmem += compound_nr(page);
>  		__ClearPageKmemcg(page);
>  	}
>  
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index 2a9bbddb0e55..bb2ab9f58f8c 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -1311,7 +1311,7 @@ static unsigned long scan_movable_pages(unsigned long start, unsigned long end)
>  		head = compound_head(page);
>  		if (page_huge_active(head))
>  			return pfn;
> -		skip = (1 << compound_order(head)) - (page - head);
> +		skip = compound_nr(head) - (page - head);
>  		pfn += skip - 1;
>  	}
>  	return 0;
> @@ -1349,7 +1349,7 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn)
>  
>  		if (PageHuge(page)) {
>  			struct page *head = compound_head(page);
> -			pfn = page_to_pfn(head) + (1<<compound_order(head)) - 1;
> +			pfn = page_to_pfn(head) + compound_nr(head) - 1;
>  			isolate_huge_page(head, &source);
>  			continue;
>  		} else if (PageTransHuge(page))
> diff --git a/mm/migrate.c b/mm/migrate.c
> index 8992741f10aa..702115a9cf11 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1889,7 +1889,7 @@ static int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
>  	VM_BUG_ON_PAGE(compound_order(page) && !PageTransHuge(page), page);
>  
>  	/* Avoid migrating to a node that is nearly full */
> -	if (!migrate_balanced_pgdat(pgdat, 1UL << compound_order(page)))
> +	if (!migrate_balanced_pgdat(pgdat, compound_nr(page)))
>  		return 0;
>  
>  	if (isolate_lru_page(page))
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 272c6de1bf4e..d3bb601c461b 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -8207,7 +8207,7 @@ bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
>  			if (!hugepage_migration_supported(page_hstate(head)))
>  				goto unmovable;
>  
> -			skip_pages = (1 << compound_order(head)) - (page - head);
> +			skip_pages = compound_nr(head) - (page - head);
>  			iter += skip_pages - 1;
>  			continue;
>  		}
> diff --git a/mm/rmap.c b/mm/rmap.c
> index 09ce05c481fc..05e41f097b1d 100644
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -1514,8 +1514,7 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
>  		if (PageHWPoison(page) && !(flags & TTU_IGNORE_HWPOISON)) {
>  			pteval = swp_entry_to_pte(make_hwpoison_entry(subpage));
>  			if (PageHuge(page)) {
> -				int nr = 1 << compound_order(page);
> -				hugetlb_count_sub(nr, mm);
> +				hugetlb_count_sub(compound_nr(page), mm);
>  				set_huge_swap_pte_at(mm, address,
>  						     pvmw.pte, pteval,
>  						     vma_mmu_pagesize(vma));
> diff --git a/mm/shmem.c b/mm/shmem.c
> index 626d8c74b973..fccb34aca6ea 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -594,7 +594,7 @@ static int shmem_add_to_page_cache(struct page *page,
>  {
>  	XA_STATE_ORDER(xas, &mapping->i_pages, index, compound_order(page));
>  	unsigned long i = 0;
> -	unsigned long nr = 1UL << compound_order(page);
> +	unsigned long nr = compound_nr(page);
>  
>  	VM_BUG_ON_PAGE(PageTail(page), page);
>  	VM_BUG_ON_PAGE(index != round_down(index, nr), page);
> @@ -1869,7 +1869,7 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
>  	lru_cache_add_anon(page);
>  
>  	spin_lock_irq(&info->lock);
> -	info->alloced += 1 << compound_order(page);
> +	info->alloced += compound_nr(page);
>  	inode->i_blocks += BLOCKS_PER_PAGE << compound_order(page);
>  	shmem_recalc_inode(inode);
>  	spin_unlock_irq(&info->lock);
> @@ -1910,7 +1910,7 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
>  		struct page *head = compound_head(page);
>  		int i;
>  
> -		for (i = 0; i < (1 << compound_order(head)); i++) {
> +		for (i = 0; i < compound_nr(head); i++) {
>  			clear_highpage(head + i);
>  			flush_dcache_page(head + i);
>  		}
> @@ -1937,7 +1937,7 @@ static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
>  	 * Error recovery.
>  	 */
>  unacct:
> -	shmem_inode_unacct_blocks(inode, 1 << compound_order(page));
> +	shmem_inode_unacct_blocks(inode, compound_nr(page));
>  
>  	if (PageTransHuge(page)) {
>  		unlock_page(page);
> diff --git a/mm/swap_state.c b/mm/swap_state.c
> index 8368621a0fc7..f844af5f09ba 100644
> --- a/mm/swap_state.c
> +++ b/mm/swap_state.c
> @@ -116,7 +116,7 @@ int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp)
>  	struct address_space *address_space = swap_address_space(entry);
>  	pgoff_t idx = swp_offset(entry);
>  	XA_STATE_ORDER(xas, &address_space->i_pages, idx, compound_order(page));
> -	unsigned long i, nr = 1UL << compound_order(page);
> +	unsigned long i, nr = compound_nr(page);
>  
>  	VM_BUG_ON_PAGE(!PageLocked(page), page);
>  	VM_BUG_ON_PAGE(PageSwapCache(page), page);
> diff --git a/mm/util.c b/mm/util.c
> index e6351a80f248..bab284d69c8c 100644
> --- a/mm/util.c
> +++ b/mm/util.c
> @@ -521,7 +521,7 @@ bool page_mapped(struct page *page)
>  		return true;
>  	if (PageHuge(page))
>  		return false;
> -	for (i = 0; i < (1 << compound_order(page)); i++) {
> +	for (i = 0; i < compound_nr(page); i++) {
>  		if (atomic_read(&page[i]._mapcount) >= 0)
>  			return true;
>  	}
> diff --git a/mm/vmscan.c b/mm/vmscan.c
> index 44df66a98f2a..bb69bd2d9c78 100644
> --- a/mm/vmscan.c
> +++ b/mm/vmscan.c
> @@ -1145,7 +1145,7 @@ static unsigned long shrink_page_list(struct list_head *page_list,
>  
>  		VM_BUG_ON_PAGE(PageActive(page), page);
>  
> -		nr_pages = 1 << compound_order(page);
> +		nr_pages = compound_nr(page);
>  
>  		/* Account the number of base pages even though THP */
>  		sc->nr_scanned += nr_pages;
> @@ -1701,7 +1701,7 @@ static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
>  
>  		VM_BUG_ON_PAGE(!PageLRU(page), page);
>  
> -		nr_pages = 1 << compound_order(page);
> +		nr_pages = compound_nr(page);
>  		total_scan += nr_pages;
>  
>  		if (page_zonenum(page) > sc->reclaim_idx) {
> -- 
> 2.20.1
>
diff mbox series

Patch

diff --git a/arch/arm/include/asm/xen/page-coherent.h b/arch/arm/include/asm/xen/page-coherent.h
index 2c403e7c782d..ea39cb724ffa 100644
--- a/arch/arm/include/asm/xen/page-coherent.h
+++ b/arch/arm/include/asm/xen/page-coherent.h
@@ -31,8 +31,7 @@  static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
 {
 	unsigned long page_pfn = page_to_xen_pfn(page);
 	unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr);
-	unsigned long compound_pages =
-		(1<<compound_order(page)) * XEN_PFN_PER_PAGE;
+	unsigned long compound_pages = compound_nr(page) * XEN_PFN_PER_PAGE;
 	bool local = (page_pfn <= dev_pfn) &&
 		(dev_pfn - page_pfn < compound_pages);
 
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c
index 4c7ebe094a83..6d89db7895d1 100644
--- a/arch/arm/mm/flush.c
+++ b/arch/arm/mm/flush.c
@@ -208,13 +208,13 @@  void __flush_dcache_page(struct address_space *mapping, struct page *page)
 	} else {
 		unsigned long i;
 		if (cache_is_vipt_nonaliasing()) {
-			for (i = 0; i < (1 << compound_order(page)); i++) {
+			for (i = 0; i < compound_nr(page); i++) {
 				void *addr = kmap_atomic(page + i);
 				__cpuc_flush_dcache_area(addr, PAGE_SIZE);
 				kunmap_atomic(addr);
 			}
 		} else {
-			for (i = 0; i < (1 << compound_order(page)); i++) {
+			for (i = 0; i < compound_nr(page); i++) {
 				void *addr = kmap_high_get(page + i);
 				if (addr) {
 					__cpuc_flush_dcache_area(addr, PAGE_SIZE);
diff --git a/arch/arm64/include/asm/xen/page-coherent.h b/arch/arm64/include/asm/xen/page-coherent.h
index d88e56b90b93..b600a8ef3349 100644
--- a/arch/arm64/include/asm/xen/page-coherent.h
+++ b/arch/arm64/include/asm/xen/page-coherent.h
@@ -45,8 +45,7 @@  static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
 {
 	unsigned long page_pfn = page_to_xen_pfn(page);
 	unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr);
-	unsigned long compound_pages =
-		(1<<compound_order(page)) * XEN_PFN_PER_PAGE;
+	unsigned long compound_pages = compound_nr(page) * XEN_PFN_PER_PAGE;
 	bool local = (page_pfn <= dev_pfn) &&
 		(dev_pfn - page_pfn < compound_pages);
 
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
index a8953f108808..73d4873fc7f8 100644
--- a/arch/powerpc/mm/hugetlbpage.c
+++ b/arch/powerpc/mm/hugetlbpage.c
@@ -667,7 +667,7 @@  void flush_dcache_icache_hugepage(struct page *page)
 
 	BUG_ON(!PageCompound(page));
 
-	for (i = 0; i < (1UL << compound_order(page)); i++) {
+	for (i = 0; i < compound_nr(page); i++) {
 		if (!PageHighMem(page)) {
 			__flush_dcache_icache(page_address(page+i));
 		} else {
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 731642e0f5a0..a9f2deb8ab79 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -461,7 +461,7 @@  static void smaps_page_accumulate(struct mem_size_stats *mss,
 static void smaps_account(struct mem_size_stats *mss, struct page *page,
 		bool compound, bool young, bool dirty, bool locked)
 {
-	int i, nr = compound ? 1 << compound_order(page) : 1;
+	int i, nr = compound ? compound_nr(page) : 1;
 	unsigned long size = nr * PAGE_SIZE;
 
 	/*
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 64762559885f..726d7f046b49 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -805,6 +805,12 @@  static inline void set_compound_order(struct page *page, unsigned int order)
 	page[1].compound_order = order;
 }
 
+/* Returns the number of pages in this potentially compound page. */
+static inline unsigned long compound_nr(struct page *page)
+{
+	return 1UL << compound_order(page);
+}
+
 /* Returns the number of bytes in this potentially compound page. */
 static inline unsigned long page_size(struct page *page)
 {
diff --git a/mm/compaction.c b/mm/compaction.c
index 9e1b9acb116b..78d42e2dbc64 100644
--- a/mm/compaction.c
+++ b/mm/compaction.c
@@ -967,7 +967,7 @@  isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn,
 			 * is safe to read and it's 0 for tail pages.
 			 */
 			if (unlikely(PageCompound(page))) {
-				low_pfn += (1UL << compound_order(page)) - 1;
+				low_pfn += compound_nr(page) - 1;
 				goto isolate_fail;
 			}
 		}
diff --git a/mm/filemap.c b/mm/filemap.c
index d0cf700bf201..f00f53ad383f 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -126,7 +126,7 @@  static void page_cache_delete(struct address_space *mapping,
 	/* hugetlb pages are represented by a single entry in the xarray */
 	if (!PageHuge(page)) {
 		xas_set_order(&xas, page->index, compound_order(page));
-		nr = 1U << compound_order(page);
+		nr = compound_nr(page);
 	}
 
 	VM_BUG_ON_PAGE(!PageLocked(page), page);
diff --git a/mm/gup.c b/mm/gup.c
index 98f13ab37bac..84a36d80dd2e 100644
--- a/mm/gup.c
+++ b/mm/gup.c
@@ -1460,7 +1460,7 @@  static long check_and_migrate_cma_pages(struct task_struct *tsk,
 		 * gup may start from a tail page. Advance step by the left
 		 * part.
 		 */
-		step = (1 << compound_order(head)) - (pages[i] - head);
+		step = compound_nr(head) - (pages[i] - head);
 		/*
 		 * If we get a page from the CMA zone, since we are going to
 		 * be pinning these entries, we might as well move them out
diff --git a/mm/hugetlb_cgroup.c b/mm/hugetlb_cgroup.c
index 68c2f2f3c05b..f1930fa0b445 100644
--- a/mm/hugetlb_cgroup.c
+++ b/mm/hugetlb_cgroup.c
@@ -139,7 +139,7 @@  static void hugetlb_cgroup_move_parent(int idx, struct hugetlb_cgroup *h_cg,
 	if (!page_hcg || page_hcg != h_cg)
 		goto out;
 
-	nr_pages = 1 << compound_order(page);
+	nr_pages = compound_nr(page);
 	if (!parent) {
 		parent = root_h_cgroup;
 		/* root has no limit */
diff --git a/mm/kasan/common.c b/mm/kasan/common.c
index a929a3b9444d..895dc5e2b3d5 100644
--- a/mm/kasan/common.c
+++ b/mm/kasan/common.c
@@ -319,7 +319,7 @@  void kasan_poison_slab(struct page *page)
 {
 	unsigned long i;
 
-	for (i = 0; i < (1 << compound_order(page)); i++)
+	for (i = 0; i < compound_nr(page); i++)
 		page_kasan_tag_reset(page + i);
 	kasan_poison_shadow(page_address(page), page_size(page),
 			KASAN_KMALLOC_REDZONE);
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index cdbb7a84cb6e..b5c4c618d087 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -6257,7 +6257,7 @@  static void uncharge_page(struct page *page, struct uncharge_gather *ug)
 		unsigned int nr_pages = 1;
 
 		if (PageTransHuge(page)) {
-			nr_pages <<= compound_order(page);
+			nr_pages = compound_nr(page);
 			ug->nr_huge += nr_pages;
 		}
 		if (PageAnon(page))
@@ -6269,7 +6269,7 @@  static void uncharge_page(struct page *page, struct uncharge_gather *ug)
 		}
 		ug->pgpgout++;
 	} else {
-		ug->nr_kmem += 1 << compound_order(page);
+		ug->nr_kmem += compound_nr(page);
 		__ClearPageKmemcg(page);
 	}
 
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 2a9bbddb0e55..bb2ab9f58f8c 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -1311,7 +1311,7 @@  static unsigned long scan_movable_pages(unsigned long start, unsigned long end)
 		head = compound_head(page);
 		if (page_huge_active(head))
 			return pfn;
-		skip = (1 << compound_order(head)) - (page - head);
+		skip = compound_nr(head) - (page - head);
 		pfn += skip - 1;
 	}
 	return 0;
@@ -1349,7 +1349,7 @@  do_migrate_range(unsigned long start_pfn, unsigned long end_pfn)
 
 		if (PageHuge(page)) {
 			struct page *head = compound_head(page);
-			pfn = page_to_pfn(head) + (1<<compound_order(head)) - 1;
+			pfn = page_to_pfn(head) + compound_nr(head) - 1;
 			isolate_huge_page(head, &source);
 			continue;
 		} else if (PageTransHuge(page))
diff --git a/mm/migrate.c b/mm/migrate.c
index 8992741f10aa..702115a9cf11 100644
--- a/mm/migrate.c
+++ b/mm/migrate.c
@@ -1889,7 +1889,7 @@  static int numamigrate_isolate_page(pg_data_t *pgdat, struct page *page)
 	VM_BUG_ON_PAGE(compound_order(page) && !PageTransHuge(page), page);
 
 	/* Avoid migrating to a node that is nearly full */
-	if (!migrate_balanced_pgdat(pgdat, 1UL << compound_order(page)))
+	if (!migrate_balanced_pgdat(pgdat, compound_nr(page)))
 		return 0;
 
 	if (isolate_lru_page(page))
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 272c6de1bf4e..d3bb601c461b 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -8207,7 +8207,7 @@  bool has_unmovable_pages(struct zone *zone, struct page *page, int count,
 			if (!hugepage_migration_supported(page_hstate(head)))
 				goto unmovable;
 
-			skip_pages = (1 << compound_order(head)) - (page - head);
+			skip_pages = compound_nr(head) - (page - head);
 			iter += skip_pages - 1;
 			continue;
 		}
diff --git a/mm/rmap.c b/mm/rmap.c
index 09ce05c481fc..05e41f097b1d 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -1514,8 +1514,7 @@  static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma,
 		if (PageHWPoison(page) && !(flags & TTU_IGNORE_HWPOISON)) {
 			pteval = swp_entry_to_pte(make_hwpoison_entry(subpage));
 			if (PageHuge(page)) {
-				int nr = 1 << compound_order(page);
-				hugetlb_count_sub(nr, mm);
+				hugetlb_count_sub(compound_nr(page), mm);
 				set_huge_swap_pte_at(mm, address,
 						     pvmw.pte, pteval,
 						     vma_mmu_pagesize(vma));
diff --git a/mm/shmem.c b/mm/shmem.c
index 626d8c74b973..fccb34aca6ea 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -594,7 +594,7 @@  static int shmem_add_to_page_cache(struct page *page,
 {
 	XA_STATE_ORDER(xas, &mapping->i_pages, index, compound_order(page));
 	unsigned long i = 0;
-	unsigned long nr = 1UL << compound_order(page);
+	unsigned long nr = compound_nr(page);
 
 	VM_BUG_ON_PAGE(PageTail(page), page);
 	VM_BUG_ON_PAGE(index != round_down(index, nr), page);
@@ -1869,7 +1869,7 @@  static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
 	lru_cache_add_anon(page);
 
 	spin_lock_irq(&info->lock);
-	info->alloced += 1 << compound_order(page);
+	info->alloced += compound_nr(page);
 	inode->i_blocks += BLOCKS_PER_PAGE << compound_order(page);
 	shmem_recalc_inode(inode);
 	spin_unlock_irq(&info->lock);
@@ -1910,7 +1910,7 @@  static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
 		struct page *head = compound_head(page);
 		int i;
 
-		for (i = 0; i < (1 << compound_order(head)); i++) {
+		for (i = 0; i < compound_nr(head); i++) {
 			clear_highpage(head + i);
 			flush_dcache_page(head + i);
 		}
@@ -1937,7 +1937,7 @@  static int shmem_getpage_gfp(struct inode *inode, pgoff_t index,
 	 * Error recovery.
 	 */
 unacct:
-	shmem_inode_unacct_blocks(inode, 1 << compound_order(page));
+	shmem_inode_unacct_blocks(inode, compound_nr(page));
 
 	if (PageTransHuge(page)) {
 		unlock_page(page);
diff --git a/mm/swap_state.c b/mm/swap_state.c
index 8368621a0fc7..f844af5f09ba 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -116,7 +116,7 @@  int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp)
 	struct address_space *address_space = swap_address_space(entry);
 	pgoff_t idx = swp_offset(entry);
 	XA_STATE_ORDER(xas, &address_space->i_pages, idx, compound_order(page));
-	unsigned long i, nr = 1UL << compound_order(page);
+	unsigned long i, nr = compound_nr(page);
 
 	VM_BUG_ON_PAGE(!PageLocked(page), page);
 	VM_BUG_ON_PAGE(PageSwapCache(page), page);
diff --git a/mm/util.c b/mm/util.c
index e6351a80f248..bab284d69c8c 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -521,7 +521,7 @@  bool page_mapped(struct page *page)
 		return true;
 	if (PageHuge(page))
 		return false;
-	for (i = 0; i < (1 << compound_order(page)); i++) {
+	for (i = 0; i < compound_nr(page); i++) {
 		if (atomic_read(&page[i]._mapcount) >= 0)
 			return true;
 	}
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 44df66a98f2a..bb69bd2d9c78 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -1145,7 +1145,7 @@  static unsigned long shrink_page_list(struct list_head *page_list,
 
 		VM_BUG_ON_PAGE(PageActive(page), page);
 
-		nr_pages = 1 << compound_order(page);
+		nr_pages = compound_nr(page);
 
 		/* Account the number of base pages even though THP */
 		sc->nr_scanned += nr_pages;
@@ -1701,7 +1701,7 @@  static unsigned long isolate_lru_pages(unsigned long nr_to_scan,
 
 		VM_BUG_ON_PAGE(!PageLRU(page), page);
 
-		nr_pages = 1 << compound_order(page);
+		nr_pages = compound_nr(page);
 		total_scan += nr_pages;
 
 		if (page_zonenum(page) > sc->reclaim_idx) {