|
@@ -156,6 +156,10 @@ static ssize_t f2fs_sbi_store(struct f2fs_attr *a,
|
|
|
|
|
|
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);
|
|
|
+ }
|
|
|
|
|
|
return count;
|
|
|
}
|
|
@@ -235,10 +239,13 @@ static struct f2fs_attr f2fs_attr_##_name = { \
|
|
|
.id = _id, \
|
|
|
}
|
|
|
|
|
|
+F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_urgent_sleep_time,
|
|
|
+ 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(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(RESERVED_BLOCKS, f2fs_sb_info, reserved_blocks, reserved_blocks);
|
|
@@ -275,10 +282,12 @@ F2FS_FEATURE_RO_ATTR(inode_checksum, FEAT_INODE_CHECKSUM);
|
|
|
|
|
|
#define ATTR_LIST(name) (&f2fs_attr_##name.attr)
|
|
|
static struct attribute *f2fs_attrs[] = {
|
|
|
+ ATTR_LIST(gc_urgent_sleep_time),
|
|
|
ATTR_LIST(gc_min_sleep_time),
|
|
|
ATTR_LIST(gc_max_sleep_time),
|
|
|
ATTR_LIST(gc_no_gc_sleep_time),
|
|
|
ATTR_LIST(gc_idle),
|
|
|
+ ATTR_LIST(gc_urgent),
|
|
|
ATTR_LIST(reclaim_segments),
|
|
|
ATTR_LIST(max_small_discards),
|
|
|
ATTR_LIST(batched_trim_sections),
|