@@ -1728,8 +1728,17 @@ static int do_garbage_collect(struct f2fs_sb_info *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_granularity;
+ if (gc_type == BG_GC) {
+ unsigned int migration_granularity =
+ sbi->migration_granularity;
+
+ if (f2fs_sb_has_blkzoned(sbi) &&
+ !has_enough_free_blocks(sbi,
+ LIMIT_BOOST_ZONED_GC))
+ migration_granularity *= BOOST_GC_MULTIPLE;
+
+ end_segno = start_segno + migration_granularity;
+ }
if (end_segno > sec_end_segno)
end_segno = sec_end_segno;
@@ -33,6 +33,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_GRANULARITY_ZONED 3
+#define BOOST_GC_MULTIPLE 5
#define DEF_GC_FAILED_PINNED_FILES 2048
#define MAX_GC_FAILED_PINNED_FILES USHRT_MAX