OSDN Git Service

f2fs: Optimize invalid block calculation
authorJulian Liu <wlootlxt123@gmail.com>
Sat, 28 Sep 2019 19:53:24 +0000 (03:53 +0800)
committer0ranko0P <ranko0p@outlook.com>
Tue, 24 Dec 2019 20:42:21 +0000 (04:42 +0800)
fs/f2fs/gc.c

index c2995b9..43a32fb 100644 (file)
@@ -232,31 +232,27 @@ void f2fs_stop_gc_thread(struct f2fs_sb_info *sbi)
        sbi->gc_thread = NULL;
 }
 
-/* Trigger rapid GC when invalid block is higher than 10% */
-#define RAPID_GC_LIMIT_INVALID_BLOCK (10 / (isCharging ? 2 : 1))
+/* Trigger rapid GC when valid block is less than the percentage */
+#define RAPID_GC_LIMIT_VALID_BLOCK (isCharging ? 95 : 90)
 static void f2fs_start_rapid_gc(void)
 {
        struct f2fs_sb_info *sbi;
-       block_t invalid_blocks;
+       block_t remaining_blocks;
 
        mutex_lock(&gc_sbi_mutex);
        list_for_each_entry(sbi, &gc_sbi_list, list) {
-               invalid_blocks = sbi->user_block_count -
-                                       written_block_count(sbi) -
-                                       free_user_blocks(sbi);
-               if (invalid_blocks >
-                   ((long)((sbi->user_block_count - written_block_count(sbi)) *
-                       RAPID_GC_LIMIT_INVALID_BLOCK) / 100)) {
+               remaining_blocks = sbi->user_block_count - written_block_count(sbi);
+               if (free_user_blocks(sbi) <
+                   remaining_blocks * RAPID_GC_LIMIT_VALID_BLOCK / 100) {
                        f2fs_start_gc_thread(sbi);
                        wake_up_interruptible_all(&sbi->gc_thread->gc_wait_queue_head);
                        wake_up_discard_thread(sbi, true);
                } else {
-                       f2fs_info(sbi, "Invalid blocks lower than %d%%,"
-                                       "skipping rapid GC (%u / (%u - %u))",
-                                       RAPID_GC_LIMIT_INVALID_BLOCK,
-                                       invalid_blocks,
-                                       sbi->user_block_count,
-                                       written_block_count(sbi));
+                       f2fs_info(sbi, "Valid blocks more than %d%%,"
+                                       "skipping rapid GC (%u > %u)",
+                                       RAPID_GC_LIMIT_VALID_BLOCK,
+                                       free_user_blocks(sbi),
+                                       remaining_blocks * RAPID_GC_LIMIT_VALID_BLOCK / 100);
                }
        }
        mutex_unlock(&gc_sbi_mutex);