mirror of https://github.com/OpenIPC/firmware.git
77 lines
2.2 KiB
Diff
77 lines
2.2 KiB
Diff
diff -drupN a/fs/f2fs/gc.h b/fs/f2fs/gc.h
|
|
--- a/fs/f2fs/gc.h 2018-08-06 17:23:04.000000000 +0300
|
|
+++ b/fs/f2fs/gc.h 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -13,12 +13,15 @@
|
|
* whether IO subsystem is idle
|
|
* or not
|
|
*/
|
|
+#define DEF_GC_THREAD_URGENT_SLEEP_TIME 500 /* 500 ms */
|
|
#define DEF_GC_THREAD_MIN_SLEEP_TIME 30000 /* milliseconds */
|
|
#define DEF_GC_THREAD_MAX_SLEEP_TIME 60000
|
|
#define DEF_GC_THREAD_NOGC_SLEEP_TIME 300000 /* wait 5 min */
|
|
#define LIMIT_INVALID_BLOCK 40 /* percentage over total user space */
|
|
#define LIMIT_FREE_BLOCK 40 /* percentage over invalid + free space */
|
|
|
|
+#define DEF_GC_FAILED_PINNED_FILES 2048
|
|
+
|
|
/* Search max. number of dirty segments to select a victim segment */
|
|
#define DEF_MAX_VICTIM_SEARCH 4096 /* covers 8GB */
|
|
|
|
@@ -27,12 +30,15 @@ struct f2fs_gc_kthread {
|
|
wait_queue_head_t gc_wait_queue_head;
|
|
|
|
/* for gc sleep time */
|
|
+ unsigned int urgent_sleep_time;
|
|
unsigned int min_sleep_time;
|
|
unsigned int max_sleep_time;
|
|
unsigned int no_gc_sleep_time;
|
|
|
|
/* for changing gc mode */
|
|
unsigned int gc_idle;
|
|
+ unsigned int gc_urgent;
|
|
+ unsigned int gc_wake;
|
|
};
|
|
|
|
struct gc_inode_list {
|
|
@@ -65,25 +71,32 @@ static inline block_t limit_free_user_bl
|
|
}
|
|
|
|
static inline void increase_sleep_time(struct f2fs_gc_kthread *gc_th,
|
|
- long *wait)
|
|
+ unsigned int *wait)
|
|
{
|
|
+ unsigned int min_time = gc_th->min_sleep_time;
|
|
+ unsigned int max_time = gc_th->max_sleep_time;
|
|
+
|
|
if (*wait == gc_th->no_gc_sleep_time)
|
|
return;
|
|
|
|
- *wait += gc_th->min_sleep_time;
|
|
- if (*wait > gc_th->max_sleep_time)
|
|
- *wait = gc_th->max_sleep_time;
|
|
+ if ((long long)*wait + (long long)min_time > (long long)max_time)
|
|
+ *wait = max_time;
|
|
+ else
|
|
+ *wait += min_time;
|
|
}
|
|
|
|
static inline void decrease_sleep_time(struct f2fs_gc_kthread *gc_th,
|
|
- long *wait)
|
|
+ unsigned int *wait)
|
|
{
|
|
+ unsigned int min_time = gc_th->min_sleep_time;
|
|
+
|
|
if (*wait == gc_th->no_gc_sleep_time)
|
|
*wait = gc_th->max_sleep_time;
|
|
|
|
- *wait -= gc_th->min_sleep_time;
|
|
- if (*wait <= gc_th->min_sleep_time)
|
|
- *wait = gc_th->min_sleep_time;
|
|
+ if ((long long)*wait - (long long)min_time < (long long)min_time)
|
|
+ *wait = min_time;
|
|
+ else
|
|
+ *wait -= min_time;
|
|
}
|
|
|
|
static inline bool has_enough_invalid_blocks(struct f2fs_sb_info *sbi)
|