lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 118/862] btrfs: fix alignment of VMA for memory mapped files on THP
    Date
    From: Alexander Zhu <alexlzhu@fb.com>

    commit b0c582233a8563f3c4228df838cdc67a8807ec78 upstream.

    With CONFIG_READ_ONLY_THP_FOR_FS, the Linux kernel supports using THPs for
    read-only mmapped files, such as shared libraries. However, the kernel
    makes no attempt to actually align those mappings on 2MB boundaries,
    which makes it impossible to use those THPs most of the time. This issue
    applies to general file mapping THP as well as existing setups using
    CONFIG_READ_ONLY_THP_FOR_FS. This is easily fixed by using
    thp_get_unmapped_area for the unmapped_area function in btrfs, which
    is what ext2, ext4, fuse, and xfs all use.

    Initially btrfs had been left out in commit 8c07fc452ac0 ("btrfs: fix
    alignment of VMA for memory mapped files on THP") as btrfs does not support
    DAX. However, commit 1854bc6e2420 ("mm/readahead: Align file mappings
    for non-DAX") removed the DAX requirement. We should now be able to call
    thp_get_unmapped_area() for btrfs.

    The problem can be seen in /proc/PID/smaps where THPeligible is set to 0
    on mappings to eligible shared object files as shown below.

    Before this patch:

    7fc6a7e18000-7fc6a80cc000 r-xp 00000000 00:1e 199856
    /usr/lib64/libcrypto.so.1.1.1k
    Size: 2768 kB
    THPeligible: 0
    VmFlags: rd ex mr mw me

    With this patch the library is mapped at a 2MB aligned address:

    fbdfe200000-7fbdfe4b4000 r-xp 00000000 00:1e 199856
    /usr/lib64/libcrypto.so.1.1.1k
    Size: 2768 kB
    THPeligible: 1
    VmFlags: rd ex mr mw me

    This fixes the alignment of VMAs for any mmap of a file that has the
    rd and ex permissions and size >= 2MB. The VMA alignment and
    THPeligible field for anonymous memory is handled separately and
    is thus not effected by this change.

    CC: stable@vger.kernel.org # 5.18+
    Signed-off-by: Alexander Zhu <alexlzhu@fb.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/btrfs/file.c | 1 +
    1 file changed, 1 insertion(+)

    --- a/fs/btrfs/file.c
    +++ b/fs/btrfs/file.c
    @@ -3810,6 +3810,7 @@ const struct file_operations btrfs_file_
    .mmap = btrfs_file_mmap,
    .open = btrfs_file_open,
    .release = btrfs_release_file,
    + .get_unmapped_area = thp_get_unmapped_area,
    .fsync = btrfs_sync_file,
    .fallocate = btrfs_fallocate,
    .unlocked_ioctl = btrfs_ioctl,

    \
     
     \ /
      Last update: 2022-10-19 11:01    [W:4.084 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site