inode: convert inode_sb_list_lock to per-sb
The process of reducing contention on per-superblock inode lists starts with moving the locking to match the per-superblock inode list. This takes the global lock out of the picture and reduces the contention problems to within a single filesystem. This doesn't get rid of contention as the locks still have global CPU scope, but it does isolate operations on different superblocks form each other. 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>
This commit is contained in:

committed by
Josef Bacik

parent
cbedaac634
commit
74278da9f7
@@ -1769,7 +1769,7 @@ void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg)
|
||||
{
|
||||
struct inode *inode, *old_inode = NULL;
|
||||
|
||||
spin_lock(&inode_sb_list_lock);
|
||||
spin_lock(&blockdev_superblock->s_inode_list_lock);
|
||||
list_for_each_entry(inode, &blockdev_superblock->s_inodes, i_sb_list) {
|
||||
struct address_space *mapping = inode->i_mapping;
|
||||
|
||||
@@ -1781,13 +1781,13 @@ void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg)
|
||||
}
|
||||
__iget(inode);
|
||||
spin_unlock(&inode->i_lock);
|
||||
spin_unlock(&inode_sb_list_lock);
|
||||
spin_unlock(&blockdev_superblock->s_inode_list_lock);
|
||||
/*
|
||||
* We hold a reference to 'inode' so it couldn't have been
|
||||
* removed from s_inodes list while we dropped the
|
||||
* inode_sb_list_lock. We cannot iput the inode now as we can
|
||||
* s_inode_list_lock We cannot iput the inode now as we can
|
||||
* be holding the last reference and we cannot iput it under
|
||||
* inode_sb_list_lock. So we keep the reference and iput it
|
||||
* s_inode_list_lock. So we keep the reference and iput it
|
||||
* later.
|
||||
*/
|
||||
iput(old_inode);
|
||||
@@ -1795,8 +1795,8 @@ void iterate_bdevs(void (*func)(struct block_device *, void *), void *arg)
|
||||
|
||||
func(I_BDEV(inode), arg);
|
||||
|
||||
spin_lock(&inode_sb_list_lock);
|
||||
spin_lock(&blockdev_superblock->s_inode_list_lock);
|
||||
}
|
||||
spin_unlock(&inode_sb_list_lock);
|
||||
spin_unlock(&blockdev_superblock->s_inode_list_lock);
|
||||
iput(old_inode);
|
||||
}
|
||||
|
Reference in New Issue
Block a user