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

Commit 41382ec4 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: use percpu_counter for alloc_valid_block_count



This patch uses percpu_count for sbi->alloc_valid_block_count.

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 1beba1b3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1079,7 +1079,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)

	/* update user_block_counts */
	sbi->last_valid_block_count = sbi->total_valid_block_count;
	sbi->alloc_valid_block_count = 0;
	percpu_counter_set(&sbi->alloc_valid_block_count, 0);

	/* Here, we only have one bio having CP pack */
	sync_meta_pages(sbi, META_FLUSH, LONG_MAX);
+5 −3
Original line number Diff line number Diff line
@@ -808,7 +808,6 @@ struct f2fs_sb_info {

	block_t user_block_count;		/* # of user blocks */
	block_t total_valid_block_count;	/* # of valid blocks */
	block_t alloc_valid_block_count;	/* # of allocated blocks */
	block_t discard_blks;			/* discard command candidats */
	block_t last_valid_block_count;		/* for recovery */
	u32 s_next_generation;			/* for NFS support */
@@ -816,6 +815,8 @@ struct f2fs_sb_info {

	/* # of pages, see count_type */
	struct percpu_counter nr_pages[NR_COUNT_TYPE];
	/* # of allocated blocks */
	struct percpu_counter alloc_valid_block_count;

	struct f2fs_mount_info mount_opt;	/* mount options */

@@ -1141,8 +1142,9 @@ static inline bool inc_valid_block_count(struct f2fs_sb_info *sbi,
	inode->i_blocks += *count;
	sbi->total_valid_block_count =
		sbi->total_valid_block_count + (block_t)(*count);
	sbi->alloc_valid_block_count += (block_t)(*count);
	spin_unlock(&sbi->stat_lock);

	percpu_counter_add(&sbi->alloc_valid_block_count, (*count));
	return true;
}

@@ -1292,11 +1294,11 @@ static inline bool inc_valid_node_count(struct f2fs_sb_info *sbi,
	if (inode)
		inode->i_blocks++;

	sbi->alloc_valid_block_count++;
	sbi->total_valid_node_count++;
	sbi->total_valid_block_count++;
	spin_unlock(&sbi->stat_lock);

	percpu_counter_inc(&sbi->alloc_valid_block_count);
	return true;
}

+3 −2
Original line number Diff line number Diff line
@@ -49,8 +49,9 @@ static struct kmem_cache *fsync_entry_slab;

bool space_for_roll_forward(struct f2fs_sb_info *sbi)
{
	if (sbi->last_valid_block_count + sbi->alloc_valid_block_count
			> sbi->user_block_count)
	s64 nalloc = percpu_counter_sum_positive(&sbi->alloc_valid_block_count);

	if (sbi->last_valid_block_count + nalloc > sbi->user_block_count)
		return false;
	return true;
}
+5 −2
Original line number Diff line number Diff line
@@ -617,6 +617,7 @@ static void destroy_percpu_info(struct f2fs_sb_info *sbi)

	for (i = 0; i < NR_COUNT_TYPE; i++)
		percpu_counter_destroy(&sbi->nr_pages[i]);
	percpu_counter_destroy(&sbi->alloc_valid_block_count);
}

static void f2fs_put_super(struct super_block *sb)
@@ -1382,7 +1383,9 @@ static int init_percpu_info(struct f2fs_sb_info *sbi)
		if (err)
			return err;
	}
	return 0;

	return percpu_counter_init(&sbi->alloc_valid_block_count, 0,
								GFP_KERNEL);
}

/*
@@ -1601,7 +1604,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
	sbi->total_valid_block_count =
				le64_to_cpu(sbi->ckpt->valid_block_count);
	sbi->last_valid_block_count = sbi->total_valid_block_count;
	sbi->alloc_valid_block_count = 0;

	for (i = 0; i < NR_INODE_TYPE; i++) {
		INIT_LIST_HEAD(&sbi->inode_list[i]);
		spin_lock_init(&sbi->inode_lock[i]);