Loading Documentation/ABI/testing/sysfs-fs-f2fs +5 −0 Original line number Diff line number Diff line Loading @@ -717,3 +717,8 @@ Description: Controls background discard granularity of inner discard thread is smaller than granularity. The unit size is one block(4KB), now only support configuring in range of [0, 512]. Default: 512 What: /sys/fs/f2fs/<disk>/last_age_weight Date: January 2023 Contact: "Ping Xiong" <xiongping1@xiaomi.com> Description: When DATA SEPARATION is on, it controls the weight of last data block age. fs/f2fs/extent_cache.c +9 −6 Original line number Diff line number Diff line Loading @@ -871,19 +871,21 @@ void f2fs_update_read_extent_tree_range_compressed(struct inode *inode, } #endif static unsigned long long __calculate_block_age(unsigned long long new, static unsigned long long __calculate_block_age(struct f2fs_sb_info *sbi, unsigned long long new, unsigned long long old) { unsigned int rem_old, rem_new; unsigned long long res; unsigned int weight = sbi->last_age_weight; res = div_u64_rem(new, 100, &rem_new) * (100 - LAST_AGE_WEIGHT) + div_u64_rem(old, 100, &rem_old) * LAST_AGE_WEIGHT; res = div_u64_rem(new, 100, &rem_new) * (100 - weight) + div_u64_rem(old, 100, &rem_old) * weight; if (rem_new) res += rem_new * (100 - LAST_AGE_WEIGHT) / 100; res += rem_new * (100 - weight) / 100; if (rem_old) res += rem_old * LAST_AGE_WEIGHT / 100; res += rem_old * weight / 100; return res; } Loading Loading @@ -917,7 +919,7 @@ static int __get_new_block_age(struct inode *inode, struct extent_info *ei, cur_age = ULLONG_MAX - tei.last_blocks + cur_blocks; if (tei.age) ei->age = __calculate_block_age(cur_age, tei.age); ei->age = __calculate_block_age(sbi, cur_age, tei.age); else ei->age = cur_age; ei->last_blocks = cur_blocks; Loading Loading @@ -1244,6 +1246,7 @@ void f2fs_init_extent_cache_info(struct f2fs_sb_info *sbi) atomic64_set(&sbi->allocated_data_blocks, 0); sbi->hot_data_age_threshold = DEF_HOT_DATA_AGE_THRESHOLD; sbi->warm_data_age_threshold = DEF_WARM_DATA_AGE_THRESHOLD; sbi->last_age_weight = LAST_AGE_WEIGHT; } int __init f2fs_create_extent_cache(void) Loading fs/f2fs/f2fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -1671,6 +1671,7 @@ struct f2fs_sb_info { /* The threshold used for hot and warm data seperation*/ unsigned int hot_data_age_threshold; unsigned int warm_data_age_threshold; unsigned int last_age_weight; /* basic filesystem units */ unsigned int log_sectors_per_block; /* log2 sectors per block */ Loading fs/f2fs/sysfs.c +11 −0 Original line number Diff line number Diff line Loading @@ -697,6 +697,15 @@ static ssize_t __sbi_store(struct f2fs_attr *a, return count; } if (!strcmp(a->attr.name, "last_age_weight")) { if (t > 100) return -EINVAL; if (t == *ui) return count; *ui = (unsigned int)t; return count; } *ui = (unsigned int)t; return count; Loading Loading @@ -956,6 +965,7 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, revoked_atomic_block, revoked_atomic_block) /* For block age extent cache */ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, hot_data_age_threshold, hot_data_age_threshold); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, warm_data_age_threshold, warm_data_age_threshold); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, last_age_weight, last_age_weight); #define ATTR_LIST(name) (&f2fs_attr_##name.attr) static struct attribute *f2fs_attrs[] = { Loading Loading @@ -1055,6 +1065,7 @@ static struct attribute *f2fs_attrs[] = { ATTR_LIST(revoked_atomic_block), ATTR_LIST(hot_data_age_threshold), ATTR_LIST(warm_data_age_threshold), ATTR_LIST(last_age_weight), NULL, }; ATTRIBUTE_GROUPS(f2fs); Loading Loading
Documentation/ABI/testing/sysfs-fs-f2fs +5 −0 Original line number Diff line number Diff line Loading @@ -717,3 +717,8 @@ Description: Controls background discard granularity of inner discard thread is smaller than granularity. The unit size is one block(4KB), now only support configuring in range of [0, 512]. Default: 512 What: /sys/fs/f2fs/<disk>/last_age_weight Date: January 2023 Contact: "Ping Xiong" <xiongping1@xiaomi.com> Description: When DATA SEPARATION is on, it controls the weight of last data block age.
fs/f2fs/extent_cache.c +9 −6 Original line number Diff line number Diff line Loading @@ -871,19 +871,21 @@ void f2fs_update_read_extent_tree_range_compressed(struct inode *inode, } #endif static unsigned long long __calculate_block_age(unsigned long long new, static unsigned long long __calculate_block_age(struct f2fs_sb_info *sbi, unsigned long long new, unsigned long long old) { unsigned int rem_old, rem_new; unsigned long long res; unsigned int weight = sbi->last_age_weight; res = div_u64_rem(new, 100, &rem_new) * (100 - LAST_AGE_WEIGHT) + div_u64_rem(old, 100, &rem_old) * LAST_AGE_WEIGHT; res = div_u64_rem(new, 100, &rem_new) * (100 - weight) + div_u64_rem(old, 100, &rem_old) * weight; if (rem_new) res += rem_new * (100 - LAST_AGE_WEIGHT) / 100; res += rem_new * (100 - weight) / 100; if (rem_old) res += rem_old * LAST_AGE_WEIGHT / 100; res += rem_old * weight / 100; return res; } Loading Loading @@ -917,7 +919,7 @@ static int __get_new_block_age(struct inode *inode, struct extent_info *ei, cur_age = ULLONG_MAX - tei.last_blocks + cur_blocks; if (tei.age) ei->age = __calculate_block_age(cur_age, tei.age); ei->age = __calculate_block_age(sbi, cur_age, tei.age); else ei->age = cur_age; ei->last_blocks = cur_blocks; Loading Loading @@ -1244,6 +1246,7 @@ void f2fs_init_extent_cache_info(struct f2fs_sb_info *sbi) atomic64_set(&sbi->allocated_data_blocks, 0); sbi->hot_data_age_threshold = DEF_HOT_DATA_AGE_THRESHOLD; sbi->warm_data_age_threshold = DEF_WARM_DATA_AGE_THRESHOLD; sbi->last_age_weight = LAST_AGE_WEIGHT; } int __init f2fs_create_extent_cache(void) Loading
fs/f2fs/f2fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -1671,6 +1671,7 @@ struct f2fs_sb_info { /* The threshold used for hot and warm data seperation*/ unsigned int hot_data_age_threshold; unsigned int warm_data_age_threshold; unsigned int last_age_weight; /* basic filesystem units */ unsigned int log_sectors_per_block; /* log2 sectors per block */ Loading
fs/f2fs/sysfs.c +11 −0 Original line number Diff line number Diff line Loading @@ -697,6 +697,15 @@ static ssize_t __sbi_store(struct f2fs_attr *a, return count; } if (!strcmp(a->attr.name, "last_age_weight")) { if (t > 100) return -EINVAL; if (t == *ui) return count; *ui = (unsigned int)t; return count; } *ui = (unsigned int)t; return count; Loading Loading @@ -956,6 +965,7 @@ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, revoked_atomic_block, revoked_atomic_block) /* For block age extent cache */ F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, hot_data_age_threshold, hot_data_age_threshold); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, warm_data_age_threshold, warm_data_age_threshold); F2FS_RW_ATTR(F2FS_SBI, f2fs_sb_info, last_age_weight, last_age_weight); #define ATTR_LIST(name) (&f2fs_attr_##name.attr) static struct attribute *f2fs_attrs[] = { Loading Loading @@ -1055,6 +1065,7 @@ static struct attribute *f2fs_attrs[] = { ATTR_LIST(revoked_atomic_block), ATTR_LIST(hot_data_age_threshold), ATTR_LIST(warm_data_age_threshold), ATTR_LIST(last_age_weight), NULL, }; ATTRIBUTE_GROUPS(f2fs); Loading