* [f2fs-dev] [PATCH 0/2] f2fs: Fix DIO flags and add ioprio hint @ 2025-06-11 23:37 Daniel Lee via Linux-f2fs-devel 2025-06-11 23:37 ` [f2fs-dev] [PATCH 1/2] f2fs: Apply bio flags to direct I/O Daniel Lee via Linux-f2fs-devel 2025-06-11 23:37 ` [f2fs-dev] [PATCH 2/2] f2fs: use ioprio hint for hot and pinned files Daniel Lee via Linux-f2fs-devel 0 siblings, 2 replies; 5+ messages in thread From: Daniel Lee via Linux-f2fs-devel @ 2025-06-11 23:37 UTC (permalink / raw) To: Jaegeuk Kim, Chao Yu; +Cc: linux-kernel, linux-f2fs-devel The first patch corrects an issue where Direct I/O (DIO) writes ignore bio flag hints (e.g., F2FS_IOPRIO_WRITE for REQ_PRIO), making them inconsistent with buffered I/O. The second patch is to set an I/O priority hint for hot files on creation and pinned files by default. Daniel Lee (2): f2fs: Apply bio flags to direct I/O f2fs: use ioprio hint for hot and pinned files fs/f2fs/data.c | 8 ++++---- fs/f2fs/f2fs.h | 23 +++++++++++++++++++++++ fs/f2fs/file.c | 15 +++++++++++++++ fs/f2fs/namei.c | 11 +++++++---- 4 files changed, 49 insertions(+), 8 deletions(-) -- 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [f2fs-dev] [PATCH 1/2] f2fs: Apply bio flags to direct I/O 2025-06-11 23:37 [f2fs-dev] [PATCH 0/2] f2fs: Fix DIO flags and add ioprio hint Daniel Lee via Linux-f2fs-devel @ 2025-06-11 23:37 ` Daniel Lee via Linux-f2fs-devel 2025-06-13 0:41 ` Chao Yu via Linux-f2fs-devel 2025-06-11 23:37 ` [f2fs-dev] [PATCH 2/2] f2fs: use ioprio hint for hot and pinned files Daniel Lee via Linux-f2fs-devel 1 sibling, 1 reply; 5+ messages in thread From: Daniel Lee via Linux-f2fs-devel @ 2025-06-11 23:37 UTC (permalink / raw) To: Jaegeuk Kim, Chao Yu; +Cc: linux-kernel, linux-f2fs-devel Bio flags like REQ_PRIO, REQ_META, and REQ_FUA, determined by f2fs_io_flags(), were not being applied to direct I/O (DIO) writes. This meant that DIO writes would not respect filesystem-level hints (for REQ_META/FUA) or inode-level hints (like F2FS_IOPRIO_WRITE). This patch refactors f2fs_io_flags() to use a direct inode pointer instead of deriving it from a page. The function is then called from the DIO write path, ensuring that bio flags are handled consistently for both buffered and DIO writes. Signed-off-by: Daniel Lee <chullee@google.com> --- fs/f2fs/data.c | 8 ++++---- fs/f2fs/f2fs.h | 2 ++ fs/f2fs/file.c | 12 ++++++++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 31e892842625..966cea75874c 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -416,10 +416,9 @@ int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr) return 0; } -static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) +blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) { unsigned int temp_mask = GENMASK(NR_TEMP_TYPE - 1, 0); - struct folio *fio_folio = page_folio(fio->page); unsigned int fua_flag, meta_flag, io_flag; blk_opf_t op_flags = 0; @@ -446,8 +445,8 @@ static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) if (BIT(fio->temp) & fua_flag) op_flags |= REQ_FUA; - if (fio->type == DATA && - F2FS_I(fio_folio->mapping->host)->ioprio_hint == F2FS_IOPRIO_WRITE) + if (fio->inode && fio->type == DATA && + F2FS_I(fio->inode)->ioprio_hint == F2FS_IOPRIO_WRITE) op_flags |= REQ_PRIO; return op_flags; @@ -2783,6 +2782,7 @@ int f2fs_write_single_data_page(struct folio *folio, int *submitted, int err = 0; struct f2fs_io_info fio = { .sbi = sbi, + .inode = inode, .ino = inode->i_ino, .type = DATA, .op = REQ_OP_WRITE, diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 9333a22b9a01..162d79a3c1a5 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1233,6 +1233,7 @@ enum iostat_type { struct f2fs_io_info { struct f2fs_sb_info *sbi; /* f2fs_sb_info pointer */ + struct inode *inode; nid_t ino; /* inode number */ enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ enum temp_type temp; /* contains HOT/WARM/COLD */ @@ -3972,6 +3973,7 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio); struct block_device *f2fs_target_device(struct f2fs_sb_info *sbi, block_t blk_addr, sector_t *sector); int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr); +blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio); void f2fs_set_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr); void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr); int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count); diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 696131e655ed..4fd45e94661a 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -5015,6 +5015,18 @@ static void f2fs_dio_write_submit_io(const struct iomap_iter *iter, enum log_type type = f2fs_rw_hint_to_seg_type(sbi, inode->i_write_hint); enum temp_type temp = f2fs_get_segment_temp(sbi, type); + /* if fadvise set to hot, override the temperature */ + struct f2fs_io_info fio = { + .sbi = sbi, + .inode = inode, + .type = DATA, + .op = REQ_OP_WRITE, + .temp = file_is_hot(inode) ? HOT : temp, + .op_flags = bio->bi_opf, + .page = NULL, + }; + bio->bi_opf |= f2fs_io_flags(&fio); + bio->bi_write_hint = f2fs_io_type_to_rw_hint(sbi, DATA, temp); submit_bio(bio); } -- 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 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [f2fs-dev] [PATCH 1/2] f2fs: Apply bio flags to direct I/O 2025-06-11 23:37 ` [f2fs-dev] [PATCH 1/2] f2fs: Apply bio flags to direct I/O Daniel Lee via Linux-f2fs-devel @ 2025-06-13 0:41 ` Chao Yu via Linux-f2fs-devel 0 siblings, 0 replies; 5+ messages in thread From: Chao Yu via Linux-f2fs-devel @ 2025-06-13 0:41 UTC (permalink / raw) To: Daniel Lee, Jaegeuk Kim; +Cc: linux-kernel, linux-f2fs-devel On 2025/6/12 7:37, Daniel Lee wrote: > Bio flags like REQ_PRIO, REQ_META, and REQ_FUA, determined by > f2fs_io_flags(), were not being applied to direct I/O (DIO) writes. > This meant that DIO writes would not respect filesystem-level hints > (for REQ_META/FUA) or inode-level hints (like F2FS_IOPRIO_WRITE). > > This patch refactors f2fs_io_flags() to use a direct inode pointer > instead of deriving it from a page. The function is then called from > the DIO write path, ensuring that bio flags are handled consistently > for both buffered and DIO writes. > > Signed-off-by: Daniel Lee <chullee@google.com> > --- > fs/f2fs/data.c | 8 ++++---- > fs/f2fs/f2fs.h | 2 ++ > fs/f2fs/file.c | 12 ++++++++++++ > 3 files changed, 18 insertions(+), 4 deletions(-) > > diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c > index 31e892842625..966cea75874c 100644 > --- a/fs/f2fs/data.c > +++ b/fs/f2fs/data.c > @@ -416,10 +416,9 @@ int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr) > return 0; > } > > -static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) > +blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) > { > unsigned int temp_mask = GENMASK(NR_TEMP_TYPE - 1, 0); > - struct folio *fio_folio = page_folio(fio->page); > unsigned int fua_flag, meta_flag, io_flag; > blk_opf_t op_flags = 0; > > @@ -446,8 +445,8 @@ static blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio) > if (BIT(fio->temp) & fua_flag) > op_flags |= REQ_FUA; > > - if (fio->type == DATA && > - F2FS_I(fio_folio->mapping->host)->ioprio_hint == F2FS_IOPRIO_WRITE) > + if (fio->inode && fio->type == DATA && It seems that it changes the logic, if fio->inode is NULL we will not tag op_flags w/ REQ_PRIO, path like GC? do we need to assign fio.inode for all paths? Thanks, > + F2FS_I(fio->inode)->ioprio_hint == F2FS_IOPRIO_WRITE) > op_flags |= REQ_PRIO; > > return op_flags; > @@ -2783,6 +2782,7 @@ int f2fs_write_single_data_page(struct folio *folio, int *submitted, > int err = 0; > struct f2fs_io_info fio = { > .sbi = sbi, > + .inode = inode, > .ino = inode->i_ino, > .type = DATA, > .op = REQ_OP_WRITE, > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > index 9333a22b9a01..162d79a3c1a5 100644 > --- a/fs/f2fs/f2fs.h > +++ b/fs/f2fs/f2fs.h > @@ -1233,6 +1233,7 @@ enum iostat_type { > > struct f2fs_io_info { > struct f2fs_sb_info *sbi; /* f2fs_sb_info pointer */ > + struct inode *inode; > nid_t ino; /* inode number */ > enum page_type type; /* contains DATA/NODE/META/META_FLUSH */ > enum temp_type temp; /* contains HOT/WARM/COLD */ > @@ -3972,6 +3973,7 @@ void f2fs_submit_page_write(struct f2fs_io_info *fio); > struct block_device *f2fs_target_device(struct f2fs_sb_info *sbi, > block_t blk_addr, sector_t *sector); > int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr); > +blk_opf_t f2fs_io_flags(struct f2fs_io_info *fio); > void f2fs_set_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr); > void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr); > int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count); > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > index 696131e655ed..4fd45e94661a 100644 > --- a/fs/f2fs/file.c > +++ b/fs/f2fs/file.c > @@ -5015,6 +5015,18 @@ static void f2fs_dio_write_submit_io(const struct iomap_iter *iter, > enum log_type type = f2fs_rw_hint_to_seg_type(sbi, inode->i_write_hint); > enum temp_type temp = f2fs_get_segment_temp(sbi, type); > > + /* if fadvise set to hot, override the temperature */ > + struct f2fs_io_info fio = { > + .sbi = sbi, > + .inode = inode, > + .type = DATA, > + .op = REQ_OP_WRITE, > + .temp = file_is_hot(inode) ? HOT : temp, > + .op_flags = bio->bi_opf, > + .page = NULL, > + }; > + bio->bi_opf |= f2fs_io_flags(&fio); > + > bio->bi_write_hint = f2fs_io_type_to_rw_hint(sbi, DATA, temp); > submit_bio(bio); > } _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [f2fs-dev] [PATCH 2/2] f2fs: use ioprio hint for hot and pinned files 2025-06-11 23:37 [f2fs-dev] [PATCH 0/2] f2fs: Fix DIO flags and add ioprio hint Daniel Lee via Linux-f2fs-devel 2025-06-11 23:37 ` [f2fs-dev] [PATCH 1/2] f2fs: Apply bio flags to direct I/O Daniel Lee via Linux-f2fs-devel @ 2025-06-11 23:37 ` Daniel Lee via Linux-f2fs-devel 2025-06-13 0:47 ` Chao Yu via Linux-f2fs-devel 1 sibling, 1 reply; 5+ messages in thread From: Daniel Lee via Linux-f2fs-devel @ 2025-06-11 23:37 UTC (permalink / raw) To: Jaegeuk Kim, Chao Yu; +Cc: linux-kernel, linux-f2fs-devel 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 <chullee@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 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [f2fs-dev] [PATCH 2/2] f2fs: use ioprio hint for hot and pinned files 2025-06-11 23:37 ` [f2fs-dev] [PATCH 2/2] f2fs: use ioprio hint for hot and pinned files Daniel Lee via Linux-f2fs-devel @ 2025-06-13 0:47 ` Chao Yu via Linux-f2fs-devel 0 siblings, 0 replies; 5+ messages in thread From: Chao Yu via Linux-f2fs-devel @ 2025-06-13 0:47 UTC (permalink / raw) To: Daniel Lee, Jaegeuk Kim; +Cc: linux-kernel, linux-f2fs-devel On 2025/6/12 7:37, 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 <chullee@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); We don't need to mark inode dirty? IIRC, .ioprio_hint is just in-memory variable? > +} > + > +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); Ditto, > +} > + > 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); _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-06-13 0:47 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-06-11 23:37 [f2fs-dev] [PATCH 0/2] f2fs: Fix DIO flags and add ioprio hint Daniel Lee via Linux-f2fs-devel 2025-06-11 23:37 ` [f2fs-dev] [PATCH 1/2] f2fs: Apply bio flags to direct I/O Daniel Lee via Linux-f2fs-devel 2025-06-13 0:41 ` Chao Yu via Linux-f2fs-devel 2025-06-11 23:37 ` [f2fs-dev] [PATCH 2/2] f2fs: use ioprio hint for hot and pinned files Daniel Lee via Linux-f2fs-devel 2025-06-13 0:47 ` Chao Yu via Linux-f2fs-devel
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).