From bb24e7e6309ae1bbc80062366b8f9bb2e8fcc025 Mon Sep 17 00:00:00 2001 From: yangerkun Date: Tue, 19 Mar 2019 21:59:03 +0800 Subject: [PATCH] Revert "ext4: Allow parallel DIO reads" euler inclusion category: perf bugzilla: 12801 CVE: NA --------------------------- This reverts commit 16c54688592ce8eea85d2a26d37b64fa07e3e233. This patch will lead to the mixreadwrite performance degradation, just revert it. Signed-off-by: yangerkun Reviewed-by: Miao Xie Signed-off-by: Yang Yingliang --- fs/ext4/inode.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 81ce6bf2dacf..0e16c3118ea1 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3819,25 +3819,31 @@ static ssize_t ext4_direct_IO_write(struct kiocb *iocb, struct iov_iter *iter) static ssize_t ext4_direct_IO_read(struct kiocb *iocb, struct iov_iter *iter) { - struct address_space *mapping = iocb->ki_filp->f_mapping; - struct inode *inode = mapping->host; - size_t count = iov_iter_count(iter); + int unlocked = 0; + struct inode *inode = iocb->ki_filp->f_mapping->host; ssize_t ret; - /* - * Shared inode_lock is enough for us - it protects against concurrent - * writes & truncates and since we take care of writing back page cache, - * we are protected against page writeback as well. - */ - inode_lock_shared(inode); - ret = filemap_write_and_wait_range(mapping, iocb->ki_pos, - iocb->ki_pos + count - 1); - if (ret) - goto out_unlock; + if (ext4_should_dioread_nolock(inode)) { + /* + * Nolock dioread optimization may be dynamically disabled + * via ext4_inode_block_unlocked_dio(). Check inode's state + * while holding extra i_dio_count ref. + */ + inode_dio_begin(inode); + smp_mb(); + if (unlikely(ext4_test_inode_state(inode, + EXT4_STATE_DIOREAD_LOCK))) + inode_dio_end(inode); + else + unlocked = 1; + } ret = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, - iter, ext4_dio_get_block, NULL, NULL, 0); -out_unlock: - inode_unlock_shared(inode); + iter, ext4_dio_get_block, + NULL, NULL, + unlocked ? 0 : DIO_LOCKING); + + if (unlocked) + inode_dio_end(inode); return ret; } -- GitLab