Skip to content

Commit c2f7c32

Browse files
chaseyuJaegeuk Kim
authored andcommitted
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] Fixes: ba8dac3 ("f2fs: fix to zero post-eof page") Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent d625a2b commit c2f7c32

File tree

1 file changed

+19
-20
lines changed

1 file changed

+19
-20
lines changed

fs/f2fs/file.c

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,23 @@
3535
#include <trace/events/f2fs.h>
3636
#include <uapi/linux/f2fs.h>
3737

38-
static void f2fs_zero_post_eof_page(struct inode *inode, loff_t new_size)
38+
static void f2fs_zero_post_eof_page(struct inode *inode,
39+
loff_t new_size, bool lock)
3940
{
4041
loff_t old_size = i_size_read(inode);
4142

4243
if (old_size >= new_size)
4344
return;
4445

46+
if (mapping_empty(inode->i_mapping))
47+
return;
48+
49+
if (lock)
50+
filemap_invalidate_lock(inode->i_mapping);
4551
/* zero or drop pages only in range of [old_size, new_size] */
46-
truncate_pagecache(inode, old_size);
52+
truncate_inode_pages_range(inode->i_mapping, old_size, new_size);
53+
if (lock)
54+
filemap_invalidate_unlock(inode->i_mapping);
4755
}
4856

4957
static vm_fault_t f2fs_filemap_fault(struct vm_fault *vmf)
@@ -114,9 +122,7 @@ static vm_fault_t f2fs_vm_page_mkwrite(struct vm_fault *vmf)
114122

115123
f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
116124

117-
filemap_invalidate_lock(inode->i_mapping);
118-
f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT);
119-
filemap_invalidate_unlock(inode->i_mapping);
125+
f2fs_zero_post_eof_page(inode, (folio->index + 1) << PAGE_SHIFT, true);
120126

121127
file_update_time(vmf->vma->vm_file);
122128
filemap_invalidate_lock_shared(inode->i_mapping);
@@ -1149,7 +1155,7 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
11491155
filemap_invalidate_lock(inode->i_mapping);
11501156

11511157
if (attr->ia_size > old_size)
1152-
f2fs_zero_post_eof_page(inode, attr->ia_size);
1158+
f2fs_zero_post_eof_page(inode, attr->ia_size, false);
11531159
truncate_setsize(inode, attr->ia_size);
11541160

11551161
if (attr->ia_size <= old_size)
@@ -1268,9 +1274,7 @@ static int f2fs_punch_hole(struct inode *inode, loff_t offset, loff_t len)
12681274
if (ret)
12691275
return ret;
12701276

1271-
filemap_invalidate_lock(inode->i_mapping);
1272-
f2fs_zero_post_eof_page(inode, offset + len);
1273-
filemap_invalidate_unlock(inode->i_mapping);
1277+
f2fs_zero_post_eof_page(inode, offset + len, true);
12741278

12751279
pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
12761280
pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
@@ -1555,7 +1559,7 @@ static int f2fs_do_collapse(struct inode *inode, loff_t offset, loff_t len)
15551559
f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
15561560
filemap_invalidate_lock(inode->i_mapping);
15571561

1558-
f2fs_zero_post_eof_page(inode, offset + len);
1562+
f2fs_zero_post_eof_page(inode, offset + len, false);
15591563

15601564
f2fs_lock_op(sbi);
15611565
f2fs_drop_extent_tree(inode);
@@ -1678,9 +1682,7 @@ static int f2fs_zero_range(struct inode *inode, loff_t offset, loff_t len,
16781682
if (ret)
16791683
return ret;
16801684

1681-
filemap_invalidate_lock(mapping);
1682-
f2fs_zero_post_eof_page(inode, offset + len);
1683-
filemap_invalidate_unlock(mapping);
1685+
f2fs_zero_post_eof_page(inode, offset + len, true);
16841686

16851687
pg_start = ((unsigned long long) offset) >> PAGE_SHIFT;
16861688
pg_end = ((unsigned long long) offset + len) >> PAGE_SHIFT;
@@ -1814,7 +1816,7 @@ static int f2fs_insert_range(struct inode *inode, loff_t offset, loff_t len)
18141816
f2fs_down_write(&F2FS_I(inode)->i_gc_rwsem[WRITE]);
18151817
filemap_invalidate_lock(mapping);
18161818

1817-
f2fs_zero_post_eof_page(inode, offset + len);
1819+
f2fs_zero_post_eof_page(inode, offset + len, false);
18181820
truncate_pagecache(inode, offset);
18191821

18201822
while (!ret && idx > pg_start) {
@@ -1872,9 +1874,7 @@ static int f2fs_expand_inode_data(struct inode *inode, loff_t offset,
18721874
if (err)
18731875
return err;
18741876

1875-
filemap_invalidate_lock(inode->i_mapping);
1876-
f2fs_zero_post_eof_page(inode, offset + len);
1877-
filemap_invalidate_unlock(inode->i_mapping);
1877+
f2fs_zero_post_eof_page(inode, offset + len, true);
18781878

18791879
f2fs_balance_fs(sbi, true);
18801880

@@ -4922,9 +4922,8 @@ static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from)
49224922
if (err)
49234923
return err;
49244924

4925-
filemap_invalidate_lock(inode->i_mapping);
4926-
f2fs_zero_post_eof_page(inode, iocb->ki_pos + iov_iter_count(from));
4927-
filemap_invalidate_unlock(inode->i_mapping);
4925+
f2fs_zero_post_eof_page(inode,
4926+
iocb->ki_pos + iov_iter_count(from), true);
49284927
return count;
49294928
}
49304929

0 commit comments

Comments
 (0)