• Tejun Heo's avatar
    writeback, cgroup: inode_switch_wbs() shouldn't give up on wb_switch_rwsem trylock fail · 6444f47e
    Tejun Heo authored
    As inode wb switching may make sync(2) miss some inodes, they're
    synchronized using wb_switch_rwsem so that no wb switching happens
    while sync(2) is in progress.  In addition to synchronizing the actual
    switching, the rwsem is also used to prevent queueing new switch
    attempts while sync(2) is in progress.  This is to avoid queueing too
    many instances while the rwsem is held by sync(2).  Unfortunately,
    this is too agressive and can block wb switching for a long time if
    sync(2) is frequent.
    
    The goal is avoiding expolding the number of scheduled switches, not
    avoiding scheduling anything.  Let's use wb_switch_rwsem only for
    synchronizing the actual switching and sync(2) and use
    isw_nr_in_flight instead for limiting the maximum number of scheduled
    switches.  The limit is set to 1024 which should be more than enough
    while still avoiding extreme situations.
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    6444f47e
fs-writeback.c 72.8 KB