• Sidhartha Kumar's avatar
    mm/filemap: remove hugetlb special casing in filemap.c · a08c7193
    Sidhartha Kumar authored
    Remove special cased hugetlb handling code within the page cache by
    changing the granularity of ->index to the base page size rather than the
    huge page size.  The motivation of this patch is to reduce complexity
    within the filemap code while also increasing performance by removing
    branches that are evaluated on every page cache lookup.
    
    To support the change in index, new wrappers for hugetlb page cache
    interactions are added.  These wrappers perform the conversion to a linear
    index which is now expected by the page cache for huge pages.
    
    ========================= PERFORMANCE ======================================
    
    Perf was used to check the performance differences after the patch. 
    Overall the performance is similar to mainline with a very small larger
    overhead that occurs in __filemap_add_folio() and
    hugetlb_add_to_page_cache().  This is because of the larger overhead that
    occurs in xa_load() and xa_store() as the xarray is now using more entries
    to store hugetlb folios in the page cache.
    
    Timing
    
    aarch64
        2MB Page Size
            6.5-rc3 + this patch:
                [root@sidhakum-ol9-1 hugepages]# time fallocate -l 700GB test.txt
                real    1m49.568s
                user    0m0.000s
                sys     1m49.461s
    
            6.5-rc3:
                [root]# time fallocate -l 700GB test.txt
                real    1m47.495s
                user    0m0.000s
                sys     1m47.370s
        1GB Page Size
            6.5-rc3 + this patch:
                [root@sidhakum-ol9-1 hugepages1G]# time fallocate -l 700GB test.txt
                real    1m47.024s
                user    0m0.000s
                sys     1m46.921s
    
            6.5-rc3:
                [root@sidhakum-ol9-1 hugepages1G]# time fallocate -l 700GB test.txt
                real    1m44.551s
                user    0m0.000s
                sys     1m44.438s
    
    x86
        2MB Page Size
            6.5-rc3 + this patch:
                [root@sidhakum-ol9-2 hugepages]# time fallocate -l 100GB test.txt
                real    0m22.383s
                user    0m0.000s
                sys     0m22.255s
    
            6.5-rc3:
                [opc@sidhakum-ol9-2 hugepages]$ time sudo fallocate -l 100GB /dev/hugepages/test.txt
                real    0m22.735s
                user    0m0.038s
                sys     0m22.567s
    
        1GB Page Size
            6.5-rc3 + this patch:
                [root@sidhakum-ol9-2 hugepages1GB]# time fallocate -l 100GB test.txt
                real    0m25.786s
                user    0m0.001s
                sys     0m25.589s
    
            6.5-rc3:
                [root@sidhakum-ol9-2 hugepages1G]# time fallocate -l 100GB test.txt
                real    0m33.454s
                user    0m0.001s
                sys     0m33.193s
    
    aarch64:
        workload - fallocate a 700GB file backed by huge pages
    
        6.5-rc3 + this patch:
            2MB Page Size:
                --100.00%--__arm64_sys_fallocate
                              ksys_fallocate
                              vfs_fallocate
                              hugetlbfs_fallocate
                              |
                              |--95.04%--__pi_clear_page
                              |
                              |--3.57%--clear_huge_page
                              |          |
                              |          |--2.63%--rcu_all_qs
                              |          |
                              |           --0.91%--__cond_resched
                              |
                               --0.67%--__cond_resched
                0.17%     0.00%             0  fallocate  [kernel.vmlinux]       [k] hugetlb_add_to_page_cache
                0.14%     0.10%            11  fallocate  [kernel.vmlinux]       [k] __filemap_add_folio
    
        6.5-rc3
            2MB Page Size:
                    --100.00%--__arm64_sys_fallocate
                              ksys_fallocate
                              vfs_fallocate
                              hugetlbfs_fallocate
                              |
                              |--94.91%--__pi_clear_page
                              |
                              |--4.11%--clear_huge_page
                              |          |
                              |          |--3.00%--rcu_all_qs
                              |          |
                              |           --1.10%--__cond_resched
                              |
                               --0.59%--__cond_resched
                0.08%     0.01%             1  fallocate  [kernel.kallsyms]  [k] hugetlb_add_to_page_cache
                0.05%     0.03%             3  fallocate  [kernel.kallsyms]  [k] __filemap_add_folio
    
    x86
        workload - fallocate a 100GB file backed by huge pages
    
        6.5-rc3 + this patch:
            2MB Page Size:
                hugetlbfs_fallocate
                |
                --99.57%--clear_huge_page
                    |
                    --98.47%--clear_page_erms
                        |
                        --0.53%--asm_sysvec_apic_timer_interrupt
    
                0.04%     0.04%             1  fallocate  [kernel.kallsyms]     [k] xa_load
                0.04%     0.00%             0  fallocate  [kernel.kallsyms]     [k] hugetlb_add_to_page_cache
                0.04%     0.00%             0  fallocate  [kernel.kallsyms]     [k] __filemap_add_folio
                0.04%     0.00%             0  fallocate  [kernel.kallsyms]     [k] xas_store
    
        6.5-rc3
            2MB Page Size:
                    --99.93%--__x64_sys_fallocate
                              vfs_fallocate
                              hugetlbfs_fallocate
                              |
                               --99.38%--clear_huge_page
                                         |
                                         |--98.40%--clear_page_erms
                                         |
                                          --0.59%--__cond_resched
                0.03%     0.03%             1  fallocate  [kernel.kallsyms]  [k] __filemap_add_folio
    
    ========================= TESTING ======================================
    
    This patch passes libhugetlbfs tests and LTP hugetlb tests
    
    ********** TEST SUMMARY
    *                      2M
    *                      32-bit 64-bit
    *     Total testcases:   110    113
    *             Skipped:     0      0
    *                PASS:   107    113
    *                FAIL:     0      0
    *    Killed by signal:     3      0
    *   Bad configuration:     0      0
    *       Expected FAIL:     0      0
    *     Unexpected PASS:     0      0
    *    Test not present:     0      0
    * Strange test result:     0      0
    **********
    
        Done executing testcases.
        LTP Version:  20220527-178-g2761a81c4
    
    page migration was also tested using Mike Kravetz's test program.[8]
    
    [dan.carpenter@linaro.org: fix an NULL vs IS_ERR() bug]
      Link: https://lkml.kernel.org/r/1772c296-1417-486f-8eef-171af2192681@moroto.mountain
    Link: https://lkml.kernel.org/r/20230926192017.98183-1-sidhartha.kumar@oracle.comSigned-off-by: default avatarSidhartha Kumar <sidhartha.kumar@oracle.com>
    Signed-off-by: default avatarDan Carpenter <dan.carpenter@linaro.org>
    Reported-and-tested-by: syzbot+c225dea486da4d5592bd@syzkaller.appspotmail.com
    Closes: https://syzkaller.appspot.com/bug?extid=c225dea486da4d5592bd
    Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
    Cc: Mike Kravetz <mike.kravetz@oracle.com>
    Cc: Muchun Song <songmuchun@bytedance.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    a08c7193
filemap.c 120 KB