On Wed, Oct 14, 2020 at 11:04:31PM +0200, Pavel Reichl wrote: > > > On 10/12/20 6:03 PM, Brian Foster wrote: > > On Fri, Oct 09, 2020 at 09:55:12PM +0200, Pavel Reichl wrote: > >> Refactor xfs_isilocked() to use newly introduced __xfs_rwsem_islocked(). > >> __xfs_rwsem_islocked() is a helper function which encapsulates checking > >> state of rw_semaphores hold by inode. > >> > >> Signed-off-by: Pavel Reichl <preichl@xxxxxxxxxx> > >> Suggested-by: Dave Chinner <dchinner@xxxxxxxxxx> > >> Suggested-by: Eric Sandeen <sandeen@xxxxxxxxxx> > >> Suggested-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > >> Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > >> --- > >> fs/xfs/xfs_inode.c | 48 ++++++++++++++++++++++++++++++++++++++-------- > >> fs/xfs/xfs_inode.h | 21 +++++++++++++------- > >> 2 files changed, 54 insertions(+), 15 deletions(-) > >> > >> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > >> index c06129cffba9..7c1ceb4df4ec 100644 > >> --- a/fs/xfs/xfs_inode.c > >> +++ b/fs/xfs/xfs_inode.c > >> @@ -345,9 +345,43 @@ xfs_ilock_demote( > >> } > >> > >> #if defined(DEBUG) || defined(XFS_WARN) > >> -int > >> +static inline bool > >> +__xfs_rwsem_islocked( > >> + struct rw_semaphore *rwsem, > >> + int lock_flags) > >> +{ > >> + int arg; > >> + > >> + if (!debug_locks) > >> + return rwsem_is_locked(rwsem); > >> + > >> + if (lock_flags & (1 << XFS_SHARED_LOCK_SHIFT)) { > >> + /* > >> + * The caller could be asking if we have (shared | excl) > >> + * access to the lock. Ask lockdep if the rwsem is > >> + * locked either for read or write access. > >> + * > >> + * The caller could also be asking if we have only > >> + * shared access to the lock. Holding a rwsem > >> + * write-locked implies read access as well, so the > >> + * request to lockdep is the same for this case. > >> + */ > >> + arg = -1; > >> + } else { > >> + /* > >> + * The caller is asking if we have only exclusive access > >> + * to the lock. Ask lockdep if the rwsem is locked for > >> + * write access. > >> + */ > >> + arg = 0; > >> + } > ... > > > > Also, I find the pattern of shifting in the caller slightly confusing, > > particularly with the 'lock_flags' name being passed down through the > > caller. Any reason we couldn't pass the shift value as a parameter and > > do the shift at the top of the function so the logic is clear and in one > > place? > > > > Hi Brian, is following change what you had in mind? Thanks! > Yep, pretty much. I find shifted_lock_flags to be a little verbose as a name. I'd be fine with just doing something like 'lock_flags >>= shift' near the top of the function, but that's more of a personal nit. I also like Christoph's suggestion to avoid the arg variable (along with the comment update suggested in the discussion with Darrick). Brian > > >> @@ -349,14 +349,16 @@ xfs_ilock_demote( > static inline bool > __xfs_rwsem_islocked( > struct rw_semaphore *rwsem, > - int lock_flags) > + int lock_flags, > + int shift) > { > int arg; > + const int shifted_lock_flags = lock_flags >> shift; > > if (!debug_locks) > return rwsem_is_locked(rwsem); > > - if (lock_flags & (1 << XFS_SHARED_LOCK_SHIFT)) { > + if (shifted_lock_flags & (1 << XFS_SHARED_LOCK_SHIFT)) { > /* > * The caller could be asking if we have (shared | excl) > * access to the lock. Ask lockdep if the rwsem is > @@ -387,20 +389,20 @@ xfs_isilocked( > { > if (lock_flags & (XFS_ILOCK_EXCL | XFS_ILOCK_SHARED)) { > ASSERT(!(lock_flags & ~(XFS_ILOCK_EXCL | XFS_ILOCK_SHARED))); > - return __xfs_rwsem_islocked(&ip->i_lock, > - (lock_flags >> XFS_ILOCK_FLAG_SHIFT)); > + return __xfs_rwsem_islocked(&ip->i_lock, lock_flags, > + XFS_ILOCK_FLAG_SHIFT); > } > > if (lock_flags & (XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED)) { > ASSERT(!(lock_flags & > ~(XFS_MMAPLOCK_EXCL | XFS_MMAPLOCK_SHARED))); > - return __xfs_rwsem_islocked(&ip->i_mmaplock, > - (lock_flags >> XFS_MMAPLOCK_FLAG_SHIFT)); > + return __xfs_rwsem_islocked(&ip->i_mmaplock, lock_flags, > + XFS_MMAPLOCK_FLAG_SHIFT); > } > > if (lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED)) { > - return __xfs_rwsem_islocked(&VFS_I(ip)->i_rwsem, > - (lock_flags >> XFS_IOLOCK_FLAG_SHIFT)); > + return __xfs_rwsem_islocked(&VFS_I(ip)->i_rwsem, lock_flags, > + XFS_IOLOCK_FLAG_SHIFT); > } > > ASSERT(0); >