• Filipe Manana's avatar
    btrfs: use the flags of an extent map to identify the compression type · f86f7a75
    Filipe Manana authored
    Currently, in struct extent_map, we use an unsigned int (32 bits) to
    identify the compression type of an extent and an unsigned long (64 bits
    on a 64 bits platform, 32 bits otherwise) for flags. We are only using
    6 different flags, so an unsigned long is excessive and we can use flags
    to identify the compression type instead of using a dedicated 32 bits
    field.
    
    We can easily have tens or hundreds of thousands (or more) of extent maps
    on busy and large filesystems, specially with compression enabled or many
    or large files with tons of small extents. So it's convenient to have the
    extent_map structure as small as possible in order to use less memory.
    
    So remove the compression type field from struct extent_map, use flags
    to identify the compression type and shorten the flags field from an
    unsigned long to a u32. This saves 8 bytes (on 64 bits platforms) and
    reduces the size of the structure from 136 bytes down to 128 bytes, using
    now only two cache lines, and increases the number of extent maps we can
    have per 4K page from 30 to 32. By using a u32 for the flags instead of
    an unsigned long, we no longer use test_bit(), set_bit() and clear_bit(),
    but that level of atomicity is not needed as most flags are never cleared
    once set (before adding an extent map to the tree), and the ones that can
    be cleared or set after an extent map is added to the tree, are always
    performed while holding the write lock on the extent map tree, while the
    reader holds a lock on the tree or tests for a flag that never changes
    once the extent map is in the tree (such as compression flags).
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    f86f7a75
btrfs.h 69.1 KB