Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 204706c7 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

Revert "f2fs: use percpu_counter for # of dirty pages in inode"



This reverts commit 1beba1b3.

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: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 0002b61b
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -431,7 +431,7 @@ struct f2fs_inode_info {
	/* Use below internally in f2fs*/
	unsigned long flags;		/* use to pass per-file flags */
	struct rw_semaphore i_sem;	/* protect fi info */
	struct percpu_counter dirty_pages;	/* # of dirty pages */
	atomic_t dirty_pages;		/* # of dirty pages */
	f2fs_hash_t chash;		/* hash value of given file name */
	unsigned int clevel;		/* maximum level of given file name */
	nid_t i_xattr_nid;		/* node id that contains xattrs */
@@ -1269,7 +1269,7 @@ static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type)

static inline void inode_inc_dirty_pages(struct inode *inode)
{
	percpu_counter_inc(&F2FS_I(inode)->dirty_pages);
	atomic_inc(&F2FS_I(inode)->dirty_pages);
	inc_page_count(F2FS_I_SB(inode), S_ISDIR(inode->i_mode) ?
				F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA);
}
@@ -1285,7 +1285,7 @@ static inline void inode_dec_dirty_pages(struct inode *inode)
			!S_ISLNK(inode->i_mode))
		return;

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

static inline s64 get_dirty_pages(struct inode *inode)
static inline int get_dirty_pages(struct inode *inode)
{
	return percpu_counter_sum_positive(&F2FS_I(inode)->dirty_pages);
	return atomic_read(&F2FS_I(inode)->dirty_pages);
}

static inline int get_blocktype_secs(struct f2fs_sb_info *sbi, int block_type)
+1 −1
Original line number Diff line number Diff line
@@ -1533,7 +1533,7 @@ static int f2fs_ioc_start_atomic_write(struct file *filp)
		goto out;

	f2fs_msg(F2FS_I_SB(inode)->sb, KERN_WARNING,
		"Unexpected flush for atomic writes: ino=%lu, npages=%lld",
		"Unexpected flush for atomic writes: ino=%lu, npages=%u",
					inode->i_ino, get_dirty_pages(inode));
	ret = filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_MAX);
	if (ret)
+1 −6
Original line number Diff line number Diff line
@@ -571,13 +571,9 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)

	init_once((void *) fi);

	if (percpu_counter_init(&fi->dirty_pages, 0, GFP_NOFS)) {
		kmem_cache_free(f2fs_inode_cachep, fi);
		return NULL;
	}

	/* Initialize f2fs-specific inode info */
	fi->vfs_inode.i_version = 1;
	atomic_set(&fi->dirty_pages, 0);
	fi->i_current_depth = 1;
	fi->i_advise = 0;
	init_rwsem(&fi->i_sem);
@@ -703,7 +699,6 @@ static void f2fs_i_callback(struct rcu_head *head)

static void f2fs_destroy_inode(struct inode *inode)
{
	percpu_counter_destroy(&F2FS_I(inode)->dirty_pages);
	call_rcu(&inode->i_rcu, f2fs_i_callback);
}