Skip to content

Commit 9d8116e

Browse files
Jaegeuk Kimpundiramit
authored andcommitted
Revert "f2fs: use percpu_counter for # of dirty pages in inode"
commit 204706c7accfabb67b97eef9f9a28361b6201199 upstream. This reverts commit 1beba1b3a953107c3ff5448ab4e4297db4619c76. The perpcu_counter doesn't provide atomicity in single core and consume more DRAM. That incurs fs_mark test failure due to ENOMEM. Cc: stable@vger.kernel.org # 4.7+ Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent 9c9f348 commit 9d8116e

3 files changed

Lines changed: 7 additions & 12 deletions

File tree

fs/f2fs/f2fs.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ struct f2fs_inode_info {
479479
/* Use below internally in f2fs*/
480480
unsigned long flags; /* use to pass per-file flags */
481481
struct rw_semaphore i_sem; /* protect fi info */
482-
struct percpu_counter dirty_pages; /* # of dirty pages */
482+
atomic_t dirty_pages; /* # of dirty pages */
483483
f2fs_hash_t chash; /* hash value of given file name */
484484
unsigned int clevel; /* maximum level of given file name */
485485
nid_t i_xattr_nid; /* node id that contains xattrs */
@@ -1316,7 +1316,7 @@ static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type)
13161316

13171317
static inline void inode_inc_dirty_pages(struct inode *inode)
13181318
{
1319-
percpu_counter_inc(&F2FS_I(inode)->dirty_pages);
1319+
atomic_inc(&F2FS_I(inode)->dirty_pages);
13201320
inc_page_count(F2FS_I_SB(inode), S_ISDIR(inode->i_mode) ?
13211321
F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA);
13221322
}
@@ -1332,7 +1332,7 @@ static inline void inode_dec_dirty_pages(struct inode *inode)
13321332
!S_ISLNK(inode->i_mode))
13331333
return;
13341334

1335-
percpu_counter_dec(&F2FS_I(inode)->dirty_pages);
1335+
atomic_dec(&F2FS_I(inode)->dirty_pages);
13361336
dec_page_count(F2FS_I_SB(inode), S_ISDIR(inode->i_mode) ?
13371337
F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA);
13381338
}
@@ -1342,9 +1342,9 @@ static inline s64 get_pages(struct f2fs_sb_info *sbi, int count_type)
13421342
return atomic_read(&sbi->nr_pages[count_type]);
13431343
}
13441344

1345-
static inline s64 get_dirty_pages(struct inode *inode)
1345+
static inline int get_dirty_pages(struct inode *inode)
13461346
{
1347-
return percpu_counter_sum_positive(&F2FS_I(inode)->dirty_pages);
1347+
return atomic_read(&F2FS_I(inode)->dirty_pages);
13481348
}
13491349

13501350
static inline int get_blocktype_secs(struct f2fs_sb_info *sbi, int block_type)

fs/f2fs/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1537,7 +1537,7 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
15371537
goto out;
15381538

15391539
f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
1540-
"Unexpected flush for atomic writes: ino=%lu, npages=%lld",
1540+
"Unexpected flush for atomic writes: ino=%lu, npages=%u",
15411541
inode->i_ino, get_dirty_pages(inode));
15421542
ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
15431543
if (ret)

fs/f2fs/super.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -571,13 +571,9 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
571571

572572
init_once((void *) fi);
573573

574-
if (percpu_counter_init(&fi->dirty_pages, 0, GFP_NOFS)) {
575-
kmem_cache_free(f2fs_inode_cachep, fi);
576-
return NULL;
577-
}
578-
579574
/* Initialize f2fs-specific inode info */
580575
fi->vfs_inode.i_version = 1;
576+
atomic_set(&fi->dirty_pages, 0);
581577
fi->i_current_depth = 1;
582578
fi->i_advise = 0;
583579
init_rwsem(&fi->i_sem);
@@ -703,7 +699,6 @@ static void f2fs_i_callback(struct rcu_head *head)
703699

704700
static void f2fs_destroy_inode(struct inode *inode)
705701
{
706-
percpu_counter_destroy(&F2FS_I(inode)->dirty_pages);
707702
call_rcu(&inode->i_rcu, f2fs_i_callback);
708703
}
709704

0 commit comments

Comments
 (0)