ext4: make ext4_block_in_group() much more efficient
authorLukas Czerner <lczerner@redhat.com>
Thu, 4 Apr 2013 02:12:52 +0000 (22:12 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 4 Apr 2013 02:12:52 +0000 (22:12 -0400)
commit689110098c7df10fab8800d3bf8e727c21f426fb
tree4115e575da8b49716e358ebd2459095863ad00e1
parenta75ae78f087f933ab3432e98bb4dbbf2196cf6d5
ext4: make ext4_block_in_group() much more efficient

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: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/balloc.c
fs/ext4/ext4.h
fs/ext4/super.c