The patch titled Subject: mm: Introduce compound_nr() has been added to the -mm tree. Its filename is mm-introduce-compound_nr.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-introduce-compound_nr.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-introduce-compound_nr.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/process/submit-checklist.rst when testing your code *** The -mm tree is included into linux-next and is updated there every 3-4 working days ------------------------------------------------------ From: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Subject: mm: Introduce compound_nr() Replace 1 << compound_order(page) with compound_nr(page). Minor improvements in readability. Link: http://lkml.kernel.org/r/20190721104612.19120-4-willy@xxxxxxxxxxxxx Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Reviewed-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Reviewed-by: Ira Weiny <ira.weiny@xxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- 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(-) --- a/arch/arm64/include/asm/xen/page-coherent.h~mm-introduce-compound_nr +++ a/arch/arm64/include/asm/xen/page-coherent.h @@ -45,8 +45,7 @@ static inline void xen_dma_map_page(stru { 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); --- a/arch/arm/include/asm/xen/page-coherent.h~mm-introduce-compound_nr +++ a/arch/arm/include/asm/xen/page-coherent.h @@ -31,8 +31,7 @@ static inline void xen_dma_map_page(stru { 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); --- a/arch/arm/mm/flush.c~mm-introduce-compound_nr +++ a/arch/arm/mm/flush.c @@ -208,13 +208,13 @@ void __flush_dcache_page(struct address_ } 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); --- a/arch/powerpc/mm/hugetlbpage.c~mm-introduce-compound_nr +++ a/arch/powerpc/mm/hugetlbpage.c @@ -667,7 +667,7 @@ void flush_dcache_icache_hugepage(struct 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 { --- a/fs/proc/task_mmu.c~mm-introduce-compound_nr +++ a/fs/proc/task_mmu.c @@ -461,7 +461,7 @@ static void smaps_page_accumulate(struct 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; /* --- a/include/linux/mm.h~mm-introduce-compound_nr +++ a/include/linux/mm.h @@ -805,6 +805,12 @@ static inline void set_compound_order(st 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) { --- a/mm/compaction.c~mm-introduce-compound_nr +++ a/mm/compaction.c @@ -969,7 +969,7 @@ isolate_migratepages_block(struct compac * 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; } } --- a/mm/filemap.c~mm-introduce-compound_nr +++ a/mm/filemap.c @@ -126,7 +126,7 @@ static void page_cache_delete(struct add /* 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); --- a/mm/gup.c~mm-introduce-compound_nr +++ a/mm/gup.c @@ -1460,7 +1460,7 @@ check_again: * 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 --- a/mm/hugetlb_cgroup.c~mm-introduce-compound_nr +++ a/mm/hugetlb_cgroup.c @@ -139,7 +139,7 @@ static void hugetlb_cgroup_move_parent(i 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 */ --- a/mm/kasan/common.c~mm-introduce-compound_nr +++ a/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); --- a/mm/memcontrol.c~mm-introduce-compound_nr +++ a/mm/memcontrol.c @@ -6257,7 +6257,7 @@ static void uncharge_page(struct page *p 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 *p } ug->pgpgout++; } else { - ug->nr_kmem += 1 << compound_order(page); + ug->nr_kmem += compound_nr(page); __ClearPageKmemcg(page); } --- a/mm/memory_hotplug.c~mm-introduce-compound_nr +++ a/mm/memory_hotplug.c @@ -1311,7 +1311,7 @@ static unsigned long scan_movable_pages( 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 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)) --- a/mm/migrate.c~mm-introduce-compound_nr +++ a/mm/migrate.c @@ -1891,7 +1891,7 @@ static int numamigrate_isolate_page(pg_d 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)) --- a/mm/page_alloc.c~mm-introduce-compound_nr +++ a/mm/page_alloc.c @@ -8207,7 +8207,7 @@ bool has_unmovable_pages(struct zone *zo 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; } --- a/mm/rmap.c~mm-introduce-compound_nr +++ a/mm/rmap.c @@ -1515,8 +1515,7 @@ static bool try_to_unmap_one(struct page 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)); --- a/mm/shmem.c~mm-introduce-compound_nr +++ a/mm/shmem.c @@ -594,7 +594,7 @@ static int shmem_add_to_page_cache(struc { 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 @@ alloc_nohuge: 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 @@ clear: 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 @@ clear: * 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); --- a/mm/swap_state.c~mm-introduce-compound_nr +++ a/mm/swap_state.c @@ -116,7 +116,7 @@ int add_to_swap_cache(struct page *page, 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); --- a/mm/util.c~mm-introduce-compound_nr +++ a/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; } --- a/mm/vmscan.c~mm-introduce-compound_nr +++ a/mm/vmscan.c @@ -1152,7 +1152,7 @@ static unsigned long shrink_page_list(st 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; @@ -1708,7 +1708,7 @@ static unsigned long isolate_lru_pages(u 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) { _ Patches currently in -mm which might be from willy@xxxxxxxxxxxxx are mm-introduce-page_size.patch mm-introduce-page_shift.patch mm-introduce-compound_nr.patch