]> git.baikalelectronics.ru Git - kernel.git/commit
writeback, cgroup: inode_switch_wbs() shouldn't give up on wb_switch_rwsem trylock...
authorTejun Heo <tj@kernel.org>
Fri, 2 Aug 2019 19:08:13 +0000 (12:08 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 15 Aug 2019 19:30:46 +0000 (13:30 -0600)
commit3025f51c133b7d01df8bcda986c0917be7ce7419
tree8ad4e7d6831c77414208f33e5dfeb729ab5dcc4c
parent26d8418e50a05ee08c78e702417c7e5a46e62016
writeback, cgroup: inode_switch_wbs() shouldn't give up on wb_switch_rwsem trylock fail

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: Jan Kara <jack@suse.cz>
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/fs-writeback.c