• Roman Gushchin's avatar
    ext4: use non-movable memory for superblock readahead · d87f6392
    Roman Gushchin authored
    Since commit a8ac900b ("ext4: use non-movable memory for the
    superblock") buffers for ext4 superblock were allocated using
    the sb_bread_unmovable() helper which allocated buffer heads
    out of non-movable memory blocks. It was necessarily to not block
    page migrations and do not cause cma allocation failures.
    
    However commit 85c8f176 ("ext4: preload block group descriptors")
    broke this by introducing pre-reading of the ext4 superblock.
    The problem is that __breadahead() is using __getblk() underneath,
    which allocates buffer heads out of movable memory.
    
    It resulted in page migration failures I've seen on a machine
    with an ext4 partition and a preallocated cma area.
    
    Fix this by introducing sb_breadahead_unmovable() and
    __breadahead_gfp() helpers which use non-movable memory for buffer
    head allocations and use them for the ext4 superblock readahead.
    Reviewed-by: default avatarAndreas Dilger <adilger@dilger.ca>
    Fixes: 85c8f176 ("ext4: preload block group descriptors")
    Signed-off-by: default avatarRoman Gushchin <guro@fb.com>
    Link: https://lore.kernel.org/r/20200229001411.128010-1-guro@fb.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    d87f6392
buffer.c 89.6 KB