summaryrefslogtreecommitdiffstats
path: root/fs/super.c
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2015-03-04 13:40:00 -0500
committerJosef Bacik <jbacik@fb.com>2015-08-17 18:39:47 -0400
commite97fedb9ef9868ff24d588be781906cf7c1b59ae (patch)
treed686280c3fef0894125e9ba6de9f7797f6518084 /fs/super.c
parent74278da9f70d84d715601fe794567a6d2bfdf078 (diff)
downloadlinux-stable-e97fedb9ef9868ff24d588be781906cf7c1b59ae.tar.gz
linux-stable-e97fedb9ef9868ff24d588be781906cf7c1b59ae.tar.bz2
linux-stable-e97fedb9ef9868ff24d588be781906cf7c1b59ae.zip
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>
Diffstat (limited to 'fs/super.c')
-rw-r--r--fs/super.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/super.c b/fs/super.c
index c808183554a2..fd427ec0b372 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -190,6 +190,7 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
s->s_flags = flags;
INIT_HLIST_NODE(&s->s_instances);
INIT_HLIST_BL_HEAD(&s->s_anon);
+ mutex_init(&s->s_sync_lock);
INIT_LIST_HEAD(&s->s_inodes);
spin_lock_init(&s->s_inode_list_lock);