| From 17741892eb9076cd581130b2b5592d554a629bfe Mon Sep 17 00:00:00 2001 |
| From: Goldwyn Rodrigues <rgoldwyn@suse.com> |
| Date: Wed, 11 Sep 2019 11:45:15 -0500 |
| Subject: [PATCH] btrfs: simplify inode locking for RWF_NOWAIT |
| |
| commit 9cf35f673583ccc9f3e2507498b3079d56614ad3 upstream. |
| |
| This is similar to 942491c9e6d6 ("xfs: fix AIM7 regression"). Apparently |
| our current rwsem code doesn't like doing the trylock, then lock for |
| real scheme. This causes extra contention on the lock and can be |
| measured eg. by AIM7 benchmark. So change our read/write methods to |
| just do the trylock for the RWF_NOWAIT case. |
| |
| Fixes: edf064e7c6fe ("btrfs: nowait aio support") |
| Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| [ update changelog ] |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c |
| index f77c4f0aaf3e..95c3b7b22e06 100644 |
| --- a/fs/btrfs/file.c |
| +++ b/fs/btrfs/file.c |
| @@ -1912,9 +1912,10 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb, |
| (iocb->ki_flags & IOCB_NOWAIT)) |
| return -EOPNOTSUPP; |
| |
| - if (!inode_trylock(inode)) { |
| - if (iocb->ki_flags & IOCB_NOWAIT) |
| + if (iocb->ki_flags & IOCB_NOWAIT) { |
| + if (!inode_trylock(inode)) |
| return -EAGAIN; |
| + } else { |
| inode_lock(inode); |
| } |
| |
| -- |
| 2.7.4 |
| |