On Thu, Oct 19, 2017 at 09:47:05AM +0200, Christoph Hellwig wrote: > Apparently our current rwsem code doesn't like doing the trylock, then > lock for real scheme. So change our read/write methods to just do the > trylock for the RWF_NOWAIT case. This fixes a ~25% regression in > AIM7. > The code looks fine, but this seems really strange. If the trylock fails, then wouldn't the blocking lock have slept anyways if done initially? Is there any more background info available on this, or perhaps a theory on why there is such a significant regression..? Brian > Fixes: 91f9943e ("fs: support RWF_NOWAIT for buffered reads") > Reported-by: kernel test robot <xiaolong.ye@xxxxxxxxx> > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- > fs/xfs/xfs_file.c | 21 +++++++++++++-------- > 1 file changed, 13 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 309e26c9dddb..f40b5da5d467 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -237,11 +237,13 @@ xfs_file_dax_read( > if (!count) > return 0; /* skip atime */ > > - if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) { > - if (iocb->ki_flags & IOCB_NOWAIT) > + if (iocb->ki_flags & IOCB_NOWAIT) { > + if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) > return -EAGAIN; > + } else { > xfs_ilock(ip, XFS_IOLOCK_SHARED); > } > + > ret = dax_iomap_rw(iocb, to, &xfs_iomap_ops); > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > > @@ -259,9 +261,10 @@ xfs_file_buffered_aio_read( > > trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos); > > - if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) { > - if (iocb->ki_flags & IOCB_NOWAIT) > + if (iocb->ki_flags & IOCB_NOWAIT) { > + if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) > return -EAGAIN; > + } else { > xfs_ilock(ip, XFS_IOLOCK_SHARED); > } > ret = generic_file_read_iter(iocb, to); > @@ -552,9 +555,10 @@ xfs_file_dio_aio_write( > iolock = XFS_IOLOCK_SHARED; > } > > - if (!xfs_ilock_nowait(ip, iolock)) { > - if (iocb->ki_flags & IOCB_NOWAIT) > + if (iocb->ki_flags & IOCB_NOWAIT) { > + if (!xfs_ilock_nowait(ip, iolock)) > return -EAGAIN; > + } else { > xfs_ilock(ip, iolock); > } > > @@ -606,9 +610,10 @@ xfs_file_dax_write( > size_t count; > loff_t pos; > > - if (!xfs_ilock_nowait(ip, iolock)) { > - if (iocb->ki_flags & IOCB_NOWAIT) > + if (iocb->ki_flags & IOCB_NOWAIT) { > + if (!xfs_ilock_nowait(ip, iolock)) > return -EAGAIN; > + } else { > xfs_ilock(ip, iolock); > } > > -- > 2.14.2 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html