• Kemeng Shi's avatar
    ext4: Separate block bitmap and buddy bitmap freeing in ext4_group_add_blocks() · 03c7fc39
    Kemeng Shi authored
    This patch separates block bitmap and buddy bitmap freeing in order to
    update block bitmap with ext4_mb_mark_context in following patch.
    The reason why this can be sperated is explained in previous submit.
    Put the explanation here to simplify the code archeology to
    ext4_group_add_blocks():
    
    Separated freeing is safe with concurrent allocation as long as:
    1. Firstly allocate block in buddy bitmap, and then in block bitmap.
    2. Firstly free block in block bitmap, and then buddy bitmap.
    Then freed block will only be available to allocation when both buddy
    bitmap and block bitmap are updated by freeing.
    Allocation obeys rule 1 already, just do sperated freeing with rule 2.
    
    Separated freeing has no race with generate_buddy as:
    Once ext4_mb_load_buddy_gfp is executed successfully, the update-to-date
    buddy page can be found in sbi->s_buddy_cache and no more buddy
    initialization of the buddy page will be executed concurrently until
    buddy page is unloaded. As we always do free in "load buddy, free,
    unload buddy" sequence, separated freeing has no race with generate_buddy.
    Signed-off-by: default avatarKemeng Shi <shikemeng@huaweicloud.com>
    Reviewed-by: default avatar"Ritesh Harjani (IBM)" <ritesh.list@gmail.com>
    Link: https://lore.kernel.org/r/20230928160407.142069-9-shikemeng@huaweicloud.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    03c7fc39
mballoc.c 199 KB