@@ -3364,6 +3364,65 @@ int f2fs_rw_hint_to_seg_type(enum rw_hint hint)
33643364 }
33653365}
33663366
3367+ /*
3368+ * This returns write hints for each segment type. This hints will be
3369+ * passed down to block layer as below by default.
3370+ *
3371+ * User F2FS Block
3372+ * ---- ---- -----
3373+ * META WRITE_LIFE_NONE|REQ_META
3374+ * HOT_NODE WRITE_LIFE_NONE
3375+ * WARM_NODE WRITE_LIFE_MEDIUM
3376+ * COLD_NODE WRITE_LIFE_LONG
3377+ * ioctl(COLD) COLD_DATA WRITE_LIFE_EXTREME
3378+ * extension list " "
3379+ *
3380+ * -- buffered io
3381+ * COLD_DATA WRITE_LIFE_EXTREME
3382+ * HOT_DATA WRITE_LIFE_SHORT
3383+ * WARM_DATA WRITE_LIFE_NOT_SET
3384+ *
3385+ * -- direct io
3386+ * WRITE_LIFE_EXTREME COLD_DATA WRITE_LIFE_EXTREME
3387+ * WRITE_LIFE_SHORT HOT_DATA WRITE_LIFE_SHORT
3388+ * WRITE_LIFE_NOT_SET WARM_DATA WRITE_LIFE_NOT_SET
3389+ * WRITE_LIFE_NONE " WRITE_LIFE_NONE
3390+ * WRITE_LIFE_MEDIUM " WRITE_LIFE_MEDIUM
3391+ * WRITE_LIFE_LONG " WRITE_LIFE_LONG
3392+ */
3393+ enum rw_hint f2fs_io_type_to_rw_hint (struct f2fs_sb_info * sbi ,
3394+ enum page_type type , enum temp_type temp )
3395+ {
3396+ switch (type ) {
3397+ case DATA :
3398+ switch (temp ) {
3399+ case WARM :
3400+ return WRITE_LIFE_NOT_SET ;
3401+ case HOT :
3402+ return WRITE_LIFE_SHORT ;
3403+ case COLD :
3404+ return WRITE_LIFE_EXTREME ;
3405+ default :
3406+ return WRITE_LIFE_NONE ;
3407+ }
3408+ case NODE :
3409+ switch (temp ) {
3410+ case WARM :
3411+ return WRITE_LIFE_MEDIUM ;
3412+ case HOT :
3413+ return WRITE_LIFE_NONE ;
3414+ case COLD :
3415+ return WRITE_LIFE_LONG ;
3416+ default :
3417+ return WRITE_LIFE_NONE ;
3418+ }
3419+ case META :
3420+ return WRITE_LIFE_NONE ;
3421+ default :
3422+ return WRITE_LIFE_NONE ;
3423+ }
3424+ }
3425+
33673426static int __get_segment_type_2 (struct f2fs_io_info * fio )
33683427{
33693428 if (fio -> type == DATA )
@@ -3443,6 +3502,15 @@ static int __get_segment_type_6(struct f2fs_io_info *fio)
34433502 }
34443503}
34453504
3505+ int f2fs_get_segment_temp (int seg_type )
3506+ {
3507+ if (IS_HOT (seg_type ))
3508+ return HOT ;
3509+ else if (IS_WARM (seg_type ))
3510+ return WARM ;
3511+ return COLD ;
3512+ }
3513+
34463514static int __get_segment_type (struct f2fs_io_info * fio )
34473515{
34483516 int type = 0 ;
@@ -3461,12 +3529,8 @@ static int __get_segment_type(struct f2fs_io_info *fio)
34613529 f2fs_bug_on (fio -> sbi , true);
34623530 }
34633531
3464- if (IS_HOT (type ))
3465- fio -> temp = HOT ;
3466- else if (IS_WARM (type ))
3467- fio -> temp = WARM ;
3468- else
3469- fio -> temp = COLD ;
3532+ fio -> temp = f2fs_get_segment_temp (type );
3533+
34703534 return type ;
34713535}
34723536
0 commit comments