aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaegeuk Kim <jaegeuk@kernel.org>2016-12-02 18:11:32 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-06 04:40:14 -0500
commita43e1c459a3dc6e2d44ae53c7f5b107006663cde (patch)
treeea97a861026afa9856568b43931b24235b056fe3
parent9abce3ca80a735218854cd5ad4b3cc567ed1b9c9 (diff)
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. Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/f2fs/f2fs.h10
-rw-r--r--fs/f2fs/file.c2
-rw-r--r--fs/f2fs/super.c7
3 files changed, 7 insertions, 12 deletions
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 9e8de18a168a..830c51b36089 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -428,7 +428,7 @@ struct f2fs_inode_info {
428 /* Use below internally in f2fs*/ 428 /* Use below internally in f2fs*/
429 unsigned long flags; /* use to pass per-file flags */ 429 unsigned long flags; /* use to pass per-file flags */
430 struct rw_semaphore i_sem; /* protect fi info */ 430 struct rw_semaphore i_sem; /* protect fi info */
431 struct percpu_counter dirty_pages; /* # of dirty pages */ 431 atomic_t dirty_pages; /* # of dirty pages */
432 f2fs_hash_t chash; /* hash value of given file name */ 432 f2fs_hash_t chash; /* hash value of given file name */
433 unsigned int clevel; /* maximum level of given file name */ 433 unsigned int clevel; /* maximum level of given file name */
434 nid_t i_xattr_nid; /* node id that contains xattrs */ 434 nid_t i_xattr_nid; /* node id that contains xattrs */
@@ -1242,7 +1242,7 @@ static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type)
1242 1242
1243static inline void inode_inc_dirty_pages(struct inode *inode) 1243static inline void inode_inc_dirty_pages(struct inode *inode)
1244{ 1244{
1245 percpu_counter_inc(&F2FS_I(inode)->dirty_pages); 1245 atomic_inc(&F2FS_I(inode)->dirty_pages);
1246 inc_page_count(F2FS_I_SB(inode), S_ISDIR(inode->i_mode) ? 1246 inc_page_count(F2FS_I_SB(inode), S_ISDIR(inode->i_mode) ?
1247 F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA); 1247 F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA);
1248} 1248}
@@ -1258,7 +1258,7 @@ static inline void inode_dec_dirty_pages(struct inode *inode)
1258 !S_ISLNK(inode->i_mode)) 1258 !S_ISLNK(inode->i_mode))
1259 return; 1259 return;
1260 1260
1261 percpu_counter_dec(&F2FS_I(inode)->dirty_pages); 1261 atomic_dec(&F2FS_I(inode)->dirty_pages);
1262 dec_page_count(F2FS_I_SB(inode), S_ISDIR(inode->i_mode) ? 1262 dec_page_count(F2FS_I_SB(inode), S_ISDIR(inode->i_mode) ?
1263 F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA); 1263 F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA);
1264} 1264}
@@ -1268,9 +1268,9 @@ static inline s64 get_pages(struct f2fs_sb_info *sbi, int count_type)
1268 return percpu_counter_sum_positive(&sbi->nr_pages[count_type]); 1268 return percpu_counter_sum_positive(&sbi->nr_pages[count_type]);
1269} 1269}
1270 1270
1271static inline s64 get_dirty_pages(struct inode *inode) 1271static inline int get_dirty_pages(struct inode *inode)
1272{ 1272{
1273 return percpu_counter_sum_positive(&F2FS_I(inode)->dirty_pages); 1273 return atomic_read(&F2FS_I(inode)->dirty_pages);
1274} 1274}
1275 1275
1276static inline int get_blocktype_secs(struct f2fs_sb_info *sbi, int block_type) 1276static inline int get_blocktype_secs(struct f2fs_sb_info *sbi, int block_type)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index c7865073cd26..4d6fbdb7ab9b 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -1526,7 +1526,7 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
1526 goto out; 1526 goto out;
1527 1527
1528 f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING, 1528 f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
1529 "Unexpected flush for atomic writes: ino=%lu, npages=%lld", 1529 "Unexpected flush for atomic writes: ino=%lu, npages=%u",
1530 inode->i_ino, get_dirty_pages(inode)); 1530 inode->i_ino, get_dirty_pages(inode));
1531 ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX); 1531 ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
1532 if (ret) 1532 if (ret)
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 6132b4ce4e4c..8021d35df7b0 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -558,13 +558,9 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
558 558
559 init_once((void *) fi); 559 init_once((void *) fi);
560 560
561 if (percpu_counter_init(&fi->dirty_pages, 0, GFP_NOFS)) {
562 kmem_cache_free(f2fs_inode_cachep, fi);
563 return NULL;
564 }
565
566 /* Initialize f2fs-specific inode info */ 561 /* Initialize f2fs-specific inode info */
567 fi->vfs_inode.i_version = 1; 562 fi->vfs_inode.i_version = 1;
563 atomic_set(&fi->dirty_pages, 0);
568 fi->i_current_depth = 1; 564 fi->i_current_depth = 1;
569 fi->i_advise = 0; 565 fi->i_advise = 0;
570 init_rwsem(&fi->i_sem); 566 init_rwsem(&fi->i_sem);
@@ -687,7 +683,6 @@ static void f2fs_i_callback(struct rcu_head *head)
687 683
688static void f2fs_destroy_inode(struct inode *inode) 684static void f2fs_destroy_inode(struct inode *inode)
689{ 685{
690 percpu_counter_destroy(&F2FS_I(inode)->dirty_pages);
691 call_rcu(&inode->i_rcu, f2fs_i_callback); 686 call_rcu(&inode->i_rcu, f2fs_i_callback);
692} 687}
693 688