Commit d27c3d89 authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim

f2fs: select target segment with closer temperature in SSR mode

In SSR mode, we can allocate target segment which has different
temperature type from the type of current block, in order to avoid
mixing coldest and hottest data/node as much as possible, change
SSR allocation policy to select closer temperature for current
block prior.
Signed-off-by: default avatarYunlong Song <yunlong.song@huawei.com>
Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 55523519
...@@ -1541,7 +1541,8 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type) ...@@ -1541,7 +1541,8 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
{ {
struct curseg_info *curseg = CURSEG_I(sbi, type); struct curseg_info *curseg = CURSEG_I(sbi, type);
const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops; const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops;
int i, n; int i, cnt;
bool reversed = false;
/* need_SSR() already forces to do this */ /* need_SSR() already forces to do this */
if (v_ops->get_victim(sbi, &(curseg)->next_segno, BG_GC, type, SSR)) if (v_ops->get_victim(sbi, &(curseg)->next_segno, BG_GC, type, SSR))
...@@ -1549,14 +1550,24 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type) ...@@ -1549,14 +1550,24 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
/* For node segments, let's do SSR more intensively */ /* For node segments, let's do SSR more intensively */
if (IS_NODESEG(type)) { if (IS_NODESEG(type)) {
i = CURSEG_HOT_NODE; if (type >= CURSEG_WARM_NODE) {
n = CURSEG_COLD_NODE; reversed = true;
i = CURSEG_COLD_NODE;
} else {
i = CURSEG_HOT_NODE;
}
cnt = NR_CURSEG_NODE_TYPE;
} else { } else {
i = CURSEG_HOT_DATA; if (type >= CURSEG_WARM_DATA) {
n = CURSEG_COLD_DATA; reversed = true;
i = CURSEG_COLD_DATA;
} else {
i = CURSEG_HOT_DATA;
}
cnt = NR_CURSEG_DATA_TYPE;
} }
for (; i <= n; i++) { for (; cnt-- > 0; reversed ? i-- : i++) {
if (i == type) if (i == type)
continue; continue;
if (v_ops->get_victim(sbi, &(curseg)->next_segno, if (v_ops->get_victim(sbi, &(curseg)->next_segno,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment