sync: serialise per-superblock sync operations
authorDave Chinner <dchinner@redhat.com>
Wed, 4 Mar 2015 18:40:00 +0000 (13:40 -0500)
committerJosef Bacik <jbacik@fb.com>
Mon, 17 Aug 2015 22:39:47 +0000 (18:39 -0400)
commite97fedb9ef9868ff24d588be781906cf7c1b59ae
treed686280c3fef0894125e9ba6de9f7797f6518084
parent74278da9f70d84d715601fe794567a6d2bfdf078
sync: serialise per-superblock sync operations

When competing sync(2) calls walk the same filesystem, they need to
walk the list of inodes on the superblock to find all the inodes
that we need to wait for IO completion on. However, when multiple
wait_sb_inodes() calls do this at the same time, they contend on the
the inode_sb_list_lock and the contention causes system wide
slowdowns. In effect, concurrent sync(2) calls can take longer and
burn more CPU than if they were serialised.

Stop the worst of the contention by adding a per-sb mutex to wrap
around wait_sb_inodes() so that we only execute one sync(2) IO
completion walk per superblock superblock at a time and hence avoid
contention being triggered by concurrent sync(2) calls.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Josef Bacik <jbacik@fb.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Tested-by: Dave Chinner <dchinner@redhat.com>
fs/fs-writeback.c
fs/super.c
include/linux/fs.h