• Zheng Liu's avatar
    ext4: reclaim extents from extent status tree · 74cd15cd
    Zheng Liu authored
    Although extent status is loaded on-demand, we also need to reclaim
    extent from the tree when we are under a heavy memory pressure because
    in some cases fragmented extent tree causes status tree costs too much
    memory.
    
    Here we maintain a lru list in super_block.  When the extent status of
    an inode is accessed and changed, this inode will be move to the tail
    of the list.  The inode will be dropped from this list when it is
    cleared.  In the inode, a counter is added to count the number of
    cached objects in extent status tree.  Here only written/unwritten/hole
    extent is counted because delayed extent doesn't be reclaimed due to
    fiemap, bigalloc and seek_data/hole need it.  The counter will be
    increased as a new extent is allocated, and it will be decreased as a
    extent is freed.
    
    In this commit we use normal shrinker framework to reclaim memory from
    the status tree.  ext4_es_reclaim_extents_count() traverses the lru list
    to count the number of reclaimable extents.  ext4_es_shrink() tries to
    reclaim written/unwritten/hole extents from extent status tree.  The
    inode that has been shrunk is moved to the tail of lru list.
    Signed-off-by: default avatarZheng Liu <wenqing.lz@taobao.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    Cc: Jan kara <jack@suse.cz>
    74cd15cd
super.c 149 KB