Apply the `ioprio_hint` to set `F2FS_IOPRIO_WRITE` priority on files identified as "hot" at creation and on files that are pinned via ioctl.
Signed-off-by: Daniel Lee <chul...@google.com> --- fs/f2fs/f2fs.h | 21 +++++++++++++++++++++ fs/f2fs/file.c | 3 +++ fs/f2fs/namei.c | 11 +++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 162d79a3c1a5..0b05b3b6386b 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -3441,6 +3441,27 @@ static inline void set_file(struct inode *inode, int type) f2fs_mark_inode_dirty_sync(inode, true); } +static inline int get_ioprio(struct inode *inode) +{ + return F2FS_I(inode)->ioprio_hint; +} + +static inline void set_ioprio(struct inode *inode, int level) +{ + if (get_ioprio(inode) == level) + return; + F2FS_I(inode)->ioprio_hint = level; + f2fs_mark_inode_dirty_sync(inode, true); +} + +static inline void clear_ioprio(struct inode *inode) +{ + if (get_ioprio(inode) == 0) + return; + F2FS_I(inode)->ioprio_hint = 0; + f2fs_mark_inode_dirty_sync(inode, true); +} + static inline void clear_file(struct inode *inode, int type) { if (!is_file(inode, type)) diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 4fd45e94661a..95a3b4b59dd1 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -3496,6 +3496,7 @@ static int f2fs_ioc_set_pin_file(struct file *filp, unsigned long arg) if (!pin) { clear_inode_flag(inode, FI_PIN_FILE); + clear_ioprio(inode); f2fs_i_gc_failures_write(inode, 0); goto done; } else if (f2fs_is_pinned_file(inode)) { @@ -3529,6 +3530,8 @@ static int f2fs_ioc_set_pin_file(struct file *filp, unsigned long arg) } set_inode_flag(inode, FI_PIN_FILE); + file_set_hot(inode); + set_ioprio(inode, F2FS_IOPRIO_WRITE); ret = F2FS_I(inode)->i_gc_failures; done: f2fs_update_time(sbi, REQ_TIME); diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 07e333ee21b7..0f96a0b86c40 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c @@ -191,9 +191,10 @@ static void set_compress_new_inode(struct f2fs_sb_info *sbi, struct inode *dir, } /* - * Set file's temperature for hot/cold data separation + * Set file's temperature (for hot/cold data separation) and + * I/O priority, based on filename extension */ -static void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode, +static void set_file_temp_prio(struct f2fs_sb_info *sbi, struct inode *inode, const unsigned char *name) { __u8 (*extlist)[F2FS_EXTENSION_LEN] = sbi->raw_super->extension_list; @@ -212,8 +213,10 @@ static void set_file_temperature(struct f2fs_sb_info *sbi, struct inode *inode, if (i < cold_count) file_set_cold(inode); - else + else { file_set_hot(inode); + set_ioprio(inode, F2FS_IOPRIO_WRITE); + } } static struct inode *f2fs_new_inode(struct mnt_idmap *idmap, @@ -317,7 +320,7 @@ static struct inode *f2fs_new_inode(struct mnt_idmap *idmap, set_inode_flag(inode, FI_INLINE_DATA); if (name && !test_opt(sbi, DISABLE_EXT_IDENTIFY)) - set_file_temperature(sbi, inode, name); + set_file_temp_prio(sbi, inode, name); stat_inc_inline_xattr(inode); stat_inc_inline_inode(inode); -- 2.50.0.rc1.591.g9c95f17f64-goog _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel