Skip to content

Commit 74a4608

Browse files
chaseyudhavale
authored andcommitted
BACKPORT: f2fs: fix to mitigate overhead of f2fs_zero_post_eof_page()
f2fs_zero_post_eof_page() may cuase more overhead due to invalidate_lock and page lookup, change as below to mitigate its overhead: - check new_size before grabbing invalidate_lock - lookup and invalidate pages only in range of [old_size, new_size] Bug: 432527227 [Chao: adjust the code] (cherry picked from commit c2f7c32) Change-Id: If1f91fb4a7651272e90ebc63dd9d691d5bd323fb Fixes: ba8dac3 ("f2fs: fix to zero post-eof page") Signed-off-by: Chao Yu <chao@kernel.org> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Signed-off-by: Chao Yu <chao@kernel.org>
1 parent fc2f50b commit 74a4608

1 file changed

Lines changed: 19 additions & 20 deletions

File tree

fs/f2fs/file.c

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,23 @@
3838
#undef CREATE_TRACE_POINTS
3939
#include <trace/hooks/fs.h>
4040

41-
static void f2fs_zero_post_eof_page(struct inode *inode, loff_t new_size)
41+
static void f2fs_zero_post_eof_page(struct inode *inode,
42+
loff_t new_size, bool lock)
4243
{
4344
loff_t old_size = i_size_read(inode);
4445

4546
if (old_size >= new_size)
4647
return;
4748

49+
if (mapping_empty(inode->i_mapping))
50+
return;
51+
52+
if (lock)
53+
filemap_invalidate_lock(inode->i_mapping);
4854
/* zero or drop pages only in range of [old_size, new_size] */
49-
truncate_pagecache(inode, old_size);
55+
truncate_inode_pages_range(inode->i_mapping, old_size, new_size);
56+
if (lock)
57+
filemap_invalidate_unlock(inode->i_mapping);
5058
}
5159

5260
vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
@@ -117,9 +125,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
117125

118126
f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
119127

120-
filemap_invalidate_lock(inode->i_mapping);
121-
f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT);
122-
filemap_invalidate_unlock(inode->i_mapping);
128+
f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT, true);
123129

124130
file_update_time(vmf->vma->vm_file);
125131
filemap_invalidate_lock_shared(inode->i_mapping);
@@ -1134,7 +1140,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
11341140
filemap_invalidate_lock(inode->i_mapping);
11351141

11361142
if (attr->ia_size > old_size)
1137-
f2fs_zero_post_eof_page(inode, attr->ia_size);
1143+
f2fs_zero_post_eof_page(inode, attr->ia_size, false);
11381144
truncate_setsize(inode, attr->ia_size);
11391145

11401146
if (attr->ia_size <= old_size)
@@ -1253,9 +1259,7 @@ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
12531259
if (ret)
12541260
return ret;
12551261

1256-
filemap_invalidate_lock(inode->i_mapping);
1257-
f2fs_zero_post_eof_page(inode, offset + len);
1258-
filemap_invalidate_unlock(inode->i_mapping);
1262+
f2fs_zero_post_eof_page(inode, offset + len, true);
12591263

12601264
pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
12611265
pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
@@ -1540,7 +1544,7 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len)
15401544
f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
15411545
filemap_invalidate_lock(inode->i_mapping);
15421546

1543-
f2fs_zero_post_eof_page(inode, offset + len);
1547+
f2fs_zero_post_eof_page(inode, offset + len, false);
15441548

15451549
f2fs_lock_op(sbi);
15461550
f2fs_drop_extent_tree(inode);
@@ -1663,9 +1667,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
16631667
if (ret)
16641668
return ret;
16651669

1666-
filemap_invalidate_lock(mapping);
1667-
f2fs_zero_post_eof_page(inode, offset + len);
1668-
filemap_invalidate_unlock(mapping);
1670+
f2fs_zero_post_eof_page(inode, offset + len, true);
16691671

16701672
pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
16711673
pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
@@ -1799,7 +1801,7 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
17991801
f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
18001802
filemap_invalidate_lock(mapping);
18011803

1802-
f2fs_zero_post_eof_page(inode, offset + len);
1804+
f2fs_zero_post_eof_page(inode, offset + len, false);
18031805
truncate_pagecache(inode, offset);
18041806

18051807
while (!ret && idx > pg_start) {
@@ -1857,9 +1859,7 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset,
18571859
if (err)
18581860
return err;
18591861

1860-
filemap_invalidate_lock(inode->i_mapping);
1861-
f2fs_zero_post_eof_page(inode, offset + len);
1862-
filemap_invalidate_unlock(inode->i_mapping);
1862+
f2fs_zero_post_eof_page(inode, offset + len, true);
18631863

18641864
f2fs_balance_fs(sbi, true);
18651865

@@ -4912,9 +4912,8 @@ static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from)
49124912
if (err)
49134913
return err;
49144914

4915-
filemap_invalidate_lock(inode->i_mapping);
4916-
f2fs_zero_post_eof_page(inode, iocb->ki_pos + iov_iter_count(from));
4917-
filemap_invalidate_unlock(inode->i_mapping);
4915+
f2fs_zero_post_eof_page(inode,
4916+
iocb->ki_pos + iov_iter_count(from), true);
49184917
return count;
49194918
}
49204919

0 commit comments

Comments
 (0)