The patch titled Subject: mm: shmem: make stat.st_blksize return huge page size if THP is on has been added to the -mm tree. Its filename is mm-shmem-make-statst_blksize-return-huge-page-size-if-thp-is-on.patch This patch should soon appear at http://ozlabs.org/~akpm/mmots/broken-out/mm-shmem-make-statst_blksize-return-huge-page-size-if-thp-is-on.patch and later at http://ozlabs.org/~akpm/mmotm/broken-out/mm-shmem-make-statst_blksize-return-huge-page-size-if-thp-is-on.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: Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx> Subject: mm: shmem: make stat.st_blksize return huge page size if THP is on Since tmpfs THP was supported in 4.8, hugetlbfs is not the only filesystem with huge page support anymore. tmpfs can use huge page via THP when mounting by "huge=" mount option. When applications use huge page on hugetlbfs, it just need check the filesystem magic number, but it is not enough for tmpfs. Make stat.st_blksize return huge page size if it is mounted by appropriate "huge=" option to give applications a hint to optimize the behavior with THP. Some applications may not do wisely with THP. For example, QEMU may mmap file on non huge page aligned hint address with MAP_FIXED, which results in no pages are PMD mapped even though THP is used. Some applications may mmap file with non huge page aligned offset. Both behaviors make THP pointless. statfs.f_bsize still returns 4KB for tmpfs since THP could be split, and it also may fallback to 4KB page silently if there is not enough huge page. Furthermore, different f_bsize makes max_blocks and free_blocks calculation harder but without too much benefit. Returning huge page size via stat.st_blksize sounds good enough. Since PUD size huge page for THP has not been supported, now it just returns HPAGE_PMD_SIZE. Link: http://lkml.kernel.org/r/1524665633-83806-1-git-send-email-yang.shi@xxxxxxxxxxxxxxxxx Signed-off-by: Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx> Suggested-by: Christoph Hellwig <hch@xxxxxxxxxxxxx> Reviewed-by: Christoph Hellwig <hch@xxxxxx> Acked-by: Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> Cc: Hugh Dickins <hughd@xxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxxxx> Cc: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- mm/shmem.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff -puN mm/shmem.c~mm-shmem-make-statst_blksize-return-huge-page-size-if-thp-is-on mm/shmem.c --- a/mm/shmem.c~mm-shmem-make-statst_blksize-return-huge-page-size-if-thp-is-on +++ a/mm/shmem.c @@ -571,6 +571,16 @@ static unsigned long shmem_unused_huge_s } #endif /* CONFIG_TRANSPARENT_HUGE_PAGECACHE */ +static inline bool is_huge_enabled(struct shmem_sb_info *sbinfo) +{ + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE) && + (shmem_huge == SHMEM_HUGE_FORCE || sbinfo->huge) && + shmem_huge != SHMEM_HUGE_DENY) + return true; + else + return false; +} + /* * Like add_to_page_cache_locked, but error if expected item has gone. */ @@ -988,6 +998,7 @@ static int shmem_getattr(const struct pa { struct inode *inode = path->dentry->d_inode; struct shmem_inode_info *info = SHMEM_I(inode); + struct shmem_sb_info *sb_info = SHMEM_SB(inode->i_sb); if (info->alloced - info->swapped != inode->i_mapping->nrpages) { spin_lock_irq(&info->lock); @@ -995,6 +1006,10 @@ static int shmem_getattr(const struct pa spin_unlock_irq(&info->lock); } generic_fillattr(inode, stat); + + if (is_huge_enabled(sb_info)) + stat->blksize = HPAGE_PMD_SIZE; + return 0; } _ Patches currently in -mm which might be from yang.shi@xxxxxxxxxxxxxxxxx are mm-introduce-arg_lock-to-protect-arg_startend-and-env_startend-in-mm_struct.patch mm-introduce-arg_lock-to-protect-arg_startend-and-env_startend-in-mm_struct-fix.patch mm-shmem-make-statst_blksize-return-huge-page-size-if-thp-is-on.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html