• Wang Jianchao's avatar
    ext4: get discard out of jbd2 commit kthread contex · 55cdd0af
    Wang Jianchao authored
    Right now, discard is issued and waited to be completed in jbd2
    commit kthread context after the logs are committed. When large
    amount of files are deleted and discard is flooding, jbd2 commit
    kthread can be blocked for long time. Then all of the metadata
    operations can be blocked to wait the log space.
    
    One case is the page fault path with read mm->mmap_sem held, which
    wants to update the file time but has to wait for the log space.
    When other threads in the task wants to do mmap, then write mmap_sem
    is blocked. Finally all of the following read mmap_sem requirements
    are blocked, even the ps command which need to read the /proc/pid/
    -cmdline. Our monitor service which needs to read /proc/pid/cmdline
    used to be blocked for 5 mins.
    
    This patch frees the blocks back to buddy after commit and then do
    discard in a async kworker context in fstrim fashion, namely,
     - mark blocks to be discarded as used if they have not been allocated
     - do discard
     - mark them free
    After this, jbd2 commit kthread won't be blocked any more by discard
    and we won't get NOSPC even if the discard is slow or throttled.
    
    Link: https://marc.info/?l=linux-kernel&m=162143690731901&w=2Suggested-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarWang Jianchao <wangjianchao@kuaishou.com>
    Link: https://lore.kernel.org/r/20210830075246.12516-5-jianchao.wan9@gmail.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    55cdd0af
ext4.h 132 KB