xfs: replace i_flock with a sleeping bitlock
We almost never block on i_flock, the exception is synchronous inode flushing. Instead of bloating the inode with a 16/24-byte completion that we abuse as a semaphore just implement it as a bitlock that uses a bit waitqueue for the rare sleeping path. This primarily is a tradeoff between a much smaller inode and a faster non-blocking path vs faster wakeups, and we are much better off with the former. A small downside is that we will lose lockdep checking for i_flock, but given that it's always taken inside the ilock that should be acceptable. Note that for example the inode writeback locking is implemented in a very similar way. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Alex Elder <aelder@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:

committed by
Ben Myers

parent
49e4c70e52
commit
474fce0675
@@ -707,14 +707,13 @@ xfs_reclaim_inode_grab(
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* do some unlocked checks first to avoid unnecessary lock traffic.
|
||||
* The first is a flush lock check, the second is a already in reclaim
|
||||
* check. Only do these checks if we are not going to block on locks.
|
||||
* If we are asked for non-blocking operation, do unlocked checks to
|
||||
* see if the inode already is being flushed or in reclaim to avoid
|
||||
* lock traffic.
|
||||
*/
|
||||
if ((flags & SYNC_TRYLOCK) &&
|
||||
(!ip->i_flush.done || __xfs_iflags_test(ip, XFS_IRECLAIM))) {
|
||||
__xfs_iflags_test(ip, XFS_IFLOCK | XFS_IRECLAIM))
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* The radix tree lock here protects a thread in xfs_iget from racing
|
||||
|
Reference in New Issue
Block a user