Commit 8c890c4c authored by Daeho Jeong's avatar Daeho Jeong Committed by Jaegeuk Kim
Browse files

f2fs: introduce migration_window_granularity



We can control the scanning window granularity for GC migration. For
more frequent scanning and GC on zoned devices, we need a fine grained
control knob for it.

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 5062b5be
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -783,3 +783,11 @@ Description: The zone UFS we are currently using consists of two parts:
		blkzone_alloc_policy = 1  Only allow writing to sequential zones
		blkzone_alloc_policy = 2  Prioritize writing to conventional zones
		========================  =========================================

What:		/sys/fs/f2fs/<disk>/migration_window_granularity
Date:		September 2024
Contact:	"Daeho Jeong" <daehojeong@google.com>
Description:	Controls migration window granularity of garbage collection on large
		section. it can control the scanning window granularity for GC migration
		in a unit of segment, while migration_granularity controls the number
		of segments which can be migrated at the same turn.
+2 −0
Original line number Diff line number Diff line
@@ -1696,6 +1696,8 @@ struct f2fs_sb_info {
	unsigned int max_victim_search;
	/* migration granularity of garbage collection, unit: segment */
	unsigned int migration_granularity;
	/* migration window granularity of garbage collection, unit: segment */
	unsigned int migration_window_granularity;

	/*
	 * for stat information.
+21 −10
Original line number Diff line number Diff line
@@ -1708,24 +1708,34 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,
	struct blk_plug plug;
	unsigned int segno = start_segno;
	unsigned int end_segno = start_segno + SEGS_PER_SEC(sbi);
	unsigned int sec_end_segno;
	int seg_freed = 0, migrated = 0;
	unsigned char type = IS_DATASEG(get_seg_entry(sbi, segno)->type) ?
						SUM_TYPE_DATA : SUM_TYPE_NODE;
	unsigned char data_type = (type == SUM_TYPE_DATA) ? DATA : NODE;
	int submitted = 0;

	if (__is_large_section(sbi))
		end_segno = rounddown(end_segno, SEGS_PER_SEC(sbi));
	if (__is_large_section(sbi)) {
		sec_end_segno = rounddown(end_segno, SEGS_PER_SEC(sbi));

		/*
		 * zone-capacity can be less than zone-size in zoned devices,
		 * resulting in less than expected usable segments in the zone,
	 * calculate the end segno in the zone which can be garbage collected
		 * calculate the end segno in the zone which can be garbage
		 * collected
		 */
		if (f2fs_sb_has_blkzoned(sbi))
		end_segno -= SEGS_PER_SEC(sbi) -
			sec_end_segno -= SEGS_PER_SEC(sbi) -
					f2fs_usable_segs_in_sec(sbi, segno);

		if (gc_type == BG_GC)
			end_segno = start_segno +
				sbi->migration_window_granularity;

		if (end_segno > sec_end_segno)
			end_segno = sec_end_segno;
	}

	sanity_check_seg_type(sbi, get_seg_entry(sbi, segno)->type);

	/* readahead multi ssa blocks those have contiguous address */
@@ -1803,7 +1813,8 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,

		if (__is_large_section(sbi))
			sbi->next_victim_seg[gc_type] =
				(segno + 1 < end_segno) ? segno + 1 : NULL_SEGNO;
				(segno + 1 < sec_end_segno) ?
					segno + 1 : NULL_SEGNO;
skip:
		f2fs_put_page(sum_page, 0);
	}
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@

#define LIMIT_NO_ZONED_GC	60 /* percentage over total user space of no gc for zoned devices */
#define LIMIT_BOOST_ZONED_GC	25 /* percentage over total user space of boosted gc for zoned devices */
#define DEF_MIGRATION_WINDOW_GRANULARITY_ZONED	3

#define DEF_GC_FAILED_PINNED_FILES	2048
#define MAX_GC_FAILED_PINNED_FILES	USHRT_MAX
+2 −0
Original line number Diff line number Diff line
@@ -3807,6 +3807,8 @@ static void init_sb_info(struct f2fs_sb_info *sbi)
	sbi->next_victim_seg[FG_GC] = NULL_SEGNO;
	sbi->max_victim_search = DEF_MAX_VICTIM_SEARCH;
	sbi->migration_granularity = SEGS_PER_SEC(sbi);
	sbi->migration_window_granularity = f2fs_sb_has_blkzoned(sbi) ?
		DEF_MIGRATION_WINDOW_GRANULARITY_ZONED : SEGS_PER_SEC(sbi);
	sbi->seq_file_ra_mul = MIN_RA_MUL;
	sbi->max_fragment_chunk = DEF_FRAGMENT_SIZE;
	sbi->max_fragment_hole = DEF_FRAGMENT_SIZE;
Loading