• Lukas Czerner's avatar
    ext4: make ext4_block_in_group() much more efficient · 68911009
    Lukas Czerner authored
    Currently in when getting the block group number for a particular
    block in ext4_block_in_group() we're using
    ext4_get_group_no_and_offset() which uses do_div() to get the block
    group and the remainer which is offset within the group.
    
    We don't need all of that in ext4_block_in_group() as we only need to
    figure out the group number.
    
    This commit changes ext4_block_in_group() to calculate group number
    directly. This shows as a big improvement with regards to cpu
    utilization. Measuring fallocate -l 15T on fresh file system with perf
    showed that 23% of cpu time was spend in the
    ext4_get_group_no_and_offset(). With this change it completely
    disappears from the list only bumping the occurrence of
    ext4_init_block_bitmap() which is the biggest user of
    ext4_block_in_group() by 4%. As the result of this change on my system
    the fallocate call was approx. 10% faster.
    
    However since there is '-g' option in mkfs which allow us setting
    different groups size (mostly for developers) I've introduced new per
    file system flag whether we have a standard block group size or
    not. The flag is used to determine whether we can use the bit shift
    optimization or not.
    Signed-off-by: default avatarLukas Czerner <lczerner@redhat.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    68911009
balloc.c 23.5 KB