On 6/15/25 22:42, Daniel Lee wrote: > 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 | 19 +++++++++++++++++++ > fs/f2fs/file.c | 3 +++ > fs/f2fs/namei.c | 11 +++++++---- > 3 files changed, 29 insertions(+), 4 deletions(-) > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index 3e02687c1b58..0c4f52892ff7 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -3440,6 +3440,25 @@ 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; > +} > + > +static inline void clear_ioprio(struct inode *inode) > +{ > + if (get_ioprio(inode) == 0) > + return; > + F2FS_I(inode)->ioprio_hint = 0; > +} > + > 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 3eb40d7bf602..a18fb7f3d019 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);
I guess there are more places clearing FI_PIN_FILE? we need to cover them all? > 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); Unnecessary file_set_hot() invoking? Or am I missing anything? Thanks, > + 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); _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel