Commit 9a481a1c authored by Daeho Jeong's avatar Daeho Jeong Committed by Jaegeuk Kim
Browse files

f2fs: create gc_no_zoned_gc_percent and gc_boost_zoned_gc_percent



Added control knobs for gc_no_zoned_gc_percent and
gc_boost_zoned_gc_percent.

Signed-off-by: default avatarDaeho Jeong <daehojeong@google.com>
Reviewed-by: default avatarChao Yu <chao@kernel.org>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 9748c2dd
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -797,3 +797,17 @@ Date: September 2024
Contact:	"Daeho Jeong" <daehojeong@google.com>
Description:	In order to fine tune GC behavior, we can control the number of
		reserved segments.

What:		/sys/fs/f2fs/<disk>/gc_no_zoned_gc_percent
Date:		September 2024
Contact:	"Daeho Jeong" <daehojeong@google.com>
Description:	If the percentage of free sections over total sections is above this
		number, F2FS do not garbage collection for zoned devices through the
		background GC thread. the default number is "60".

What:		/sys/fs/f2fs/<disk>/gc_boost_zoned_gc_percent
Date:		September 2024
Contact:	"Daeho Jeong" <daehojeong@google.com>
Description:	If the percentage of free sections over total sections is under this
		number, F2FS boosts garbage collection for zoned devices through the
		background GC thread. the default number is "25".
+9 −3
Original line number Diff line number Diff line
@@ -119,7 +119,8 @@ static int gc_thread_func(void *data)
		}

		if (f2fs_sb_has_blkzoned(sbi)) {
			if (has_enough_free_blocks(sbi, LIMIT_NO_ZONED_GC)) {
			if (has_enough_free_blocks(sbi,
				gc_th->no_zoned_gc_percent)) {
				wait_ms = gc_th->no_gc_sleep_time;
				f2fs_up_write(&sbi->gc_lock);
				goto next;
@@ -200,10 +201,14 @@ int f2fs_start_gc_thread(struct f2fs_sb_info *sbi)
		gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME_ZONED;
		gc_th->max_sleep_time = DEF_GC_THREAD_MAX_SLEEP_TIME_ZONED;
		gc_th->no_gc_sleep_time = DEF_GC_THREAD_NOGC_SLEEP_TIME_ZONED;
		gc_th->no_zoned_gc_percent = LIMIT_NO_ZONED_GC;
		gc_th->boost_zoned_gc_percent = LIMIT_BOOST_ZONED_GC;
	} else {
		gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME;
		gc_th->max_sleep_time = DEF_GC_THREAD_MAX_SLEEP_TIME;
		gc_th->no_gc_sleep_time = DEF_GC_THREAD_NOGC_SLEEP_TIME;
		gc_th->no_zoned_gc_percent = 0;
		gc_th->boost_zoned_gc_percent = 0;
	}

	gc_th->gc_wake = false;
@@ -1740,8 +1745,9 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,

			if (f2fs_sb_has_blkzoned(sbi) &&
					!has_enough_free_blocks(sbi,
					LIMIT_BOOST_ZONED_GC))
				window_granularity *= BOOST_GC_MULTIPLE;
					sbi->gc_thread->boost_zoned_gc_percent))
				window_granularity *=
					BOOST_GC_MULTIPLE;

			end_segno = start_segno + window_granularity;
		}
+4 −0
Original line number Diff line number Diff line
@@ -61,6 +61,10 @@ struct f2fs_gc_kthread {
						 * caller of f2fs_balance_fs()
						 * will wait on this wait queue.
						 */

	/* for gc control for zoned devices */
	unsigned int no_zoned_gc_percent;
	unsigned int boost_zoned_gc_percent;
};

struct gc_inode_list {
+4 −0
Original line number Diff line number Diff line
@@ -977,6 +977,8 @@ GC_THREAD_RW_ATTR(gc_urgent_sleep_time, urgent_sleep_time);
GC_THREAD_RW_ATTR(gc_min_sleep_time, min_sleep_time);
GC_THREAD_RW_ATTR(gc_max_sleep_time, max_sleep_time);
GC_THREAD_RW_ATTR(gc_no_gc_sleep_time, no_gc_sleep_time);
GC_THREAD_RW_ATTR(gc_no_zoned_gc_percent, no_zoned_gc_percent);
GC_THREAD_RW_ATTR(gc_boost_zoned_gc_percent, boost_zoned_gc_percent);

/* SM_INFO ATTR */
SM_INFO_RW_ATTR(reclaim_segments, rec_prefree_segments);
@@ -1137,6 +1139,8 @@ static struct attribute *f2fs_attrs[] = {
	ATTR_LIST(gc_min_sleep_time),
	ATTR_LIST(gc_max_sleep_time),
	ATTR_LIST(gc_no_gc_sleep_time),
	ATTR_LIST(gc_no_zoned_gc_percent),
	ATTR_LIST(gc_boost_zoned_gc_percent),
	ATTR_LIST(gc_idle),
	ATTR_LIST(gc_urgent),
	ATTR_LIST(reclaim_segments),