|
@@ -248,16 +248,33 @@ out:
|
|
|
if (!strcmp(a->attr.name, "trim_sections"))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ if (!strcmp(a->attr.name, "gc_urgent")) {
|
|
|
+ if (t >= 1) {
|
|
|
+ sbi->gc_mode = GC_URGENT;
|
|
|
+ if (sbi->gc_thread) {
|
|
|
+ wake_up_interruptible_all(
|
|
|
+ &sbi->gc_thread->gc_wait_queue_head);
|
|
|
+ wake_up_discard_thread(sbi, true);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ sbi->gc_mode = GC_NORMAL;
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+ if (!strcmp(a->attr.name, "gc_idle")) {
|
|
|
+ if (t == GC_IDLE_CB)
|
|
|
+ sbi->gc_mode = GC_IDLE_CB;
|
|
|
+ else if (t == GC_IDLE_GREEDY)
|
|
|
+ sbi->gc_mode = GC_IDLE_GREEDY;
|
|
|
+ else
|
|
|
+ sbi->gc_mode = GC_NORMAL;
|
|
|
+ return count;
|
|
|
+ }
|
|
|
+
|
|
|
*ui = t;
|
|
|
|
|
|
if (!strcmp(a->attr.name, "iostat_enable") && *ui == 0)
|
|
|
f2fs_reset_iostat(sbi);
|
|
|
- if (!strcmp(a->attr.name, "gc_urgent") && t == 1 && sbi->gc_thread) {
|
|
|
- sbi->gc_thread->gc_wake = 1;
|
|
|
- wake_up_interruptible_all(&sbi->gc_thread->gc_wait_queue_head);
|
|
|
- wake_up_discard_thread(sbi, true);
|
|
|
- }
|
|
|
-
|
|
|
return count;
|
|
|
}
|
|
|
|
|
@@ -349,8 +366,8 @@ F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_urgent_sleep_time,
|
|
|
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_min_sleep_time, min_sleep_time);
|
|
|
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_max_sleep_time, max_sleep_time);
|
|
|
F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_no_gc_sleep_time, no_gc_sleep_time);
|
|
|
-F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_idle, gc_idle);
|
|
|
-F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_urgent, gc_urgent);
|
|
|
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_idle, gc_mode);
|
|
|
+F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, gc_urgent, gc_mode);
|
|
|
F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments);
|
|
|
F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, max_small_discards, max_discards);
|
|
|
F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, discard_granularity, discard_granularity);
|