diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2016-12-02 18:11:32 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-01-06 04:40:14 -0500 |
commit | a43e1c459a3dc6e2d44ae53c7f5b107006663cde (patch) | |
tree | ea97a861026afa9856568b43931b24235b056fe3 | |
parent | 9abce3ca80a735218854cd5ad4b3cc567ed1b9c9 (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.h | 10 | ||||
-rw-r--r-- | fs/f2fs/file.c | 2 | ||||
-rw-r--r-- | fs/f2fs/super.c | 7 |
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 | ||
1243 | static inline void inode_inc_dirty_pages(struct inode *inode) | 1243 | static 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 | ||
1271 | static inline s64 get_dirty_pages(struct inode *inode) | 1271 | static 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 | ||
1276 | static inline int get_blocktype_secs(struct f2fs_sb_info *sbi, int block_type) | 1276 | static 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 | ||
688 | static void f2fs_destroy_inode(struct inode *inode) | 684 | static 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 | ||