Re: [f2fs-dev] [PATCH] f2fs: skip direct I/O iostat work when disabled

Wenjie Qi <[email protected]>
Newsgroups net.sourceforge.lists.linux-f2fs-devel,org.kernel.vger.linux-kernel
Message-ID <CAGFpFsSY-++2MruHXgJrchsSiS07cwRMBS+gsVD9aTm0QniR+A@mail.gmail.com>
  Yes, f2fs_update_iostat() already checks sbi->iostat_enable.

  I removed the extra guards around the direct read/write byte accounting in v2.

https://lore.kernel.org/linux-f2fs-devel/[email protected]/T/#u

On Wed, Jun 10, 2026 at 8:33 AM Jaegeuk Kim <[email protected]> wrote:
>
> On 05/27, Wenjie Qi wrote:
> > F2FS iostat is optional and is disabled by default, but the direct
> > I/O submit path still allocates and binds a bio_iostat_ctx, updates
> > the submit timestamp, and replaces bi_end_io for every DIO bio even
> > when sbi->iostat_enable is false.
> >
> > The end_io path also calls f2fs_update_iostat(), which returns
> > immediately when iostat is disabled. This adds avoidable per-bio
> > overhead to the default direct I/O hot path.
> >
> > Skip DIO iostat context setup and the direct read/write byte updates
> > when iostat is disabled. If iostat is enabled through sysfs before
> > submission, the existing context allocation and latency accounting path
> > is still used.
> >
> > QEMU benchmark on a 1GiB F2FS virtio-blk image, with iostat_enable=0,
> > 4KiB O_DIRECT I/O over a 64MiB file, 50000 iterations per run:
> >
> >                          baseline     patched
> >   direct_read median    65264.50 ns  55470.95 ns
> >   direct_read recheck   65553.75 ns  55470.95 ns
> >   direct_write median   68054.62 ns  56309.44 ns
> >   direct_write recheck  66873.51 ns  56309.44 ns
> >
> > Signed-off-by: Wenjie Qi <[email protected]>
> > ---
> >  fs/f2fs/file.c   | 9 +++++++--
> >  fs/f2fs/iostat.h | 6 ++++++
> >  2 files changed, 13 insertions(+), 2 deletions(-)
> >
> > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> > index 6edf0105dbc8..3ad8bd660b33 100644
> > --- a/fs/f2fs/file.c
> > +++ b/fs/f2fs/file.c
> > @@ -4799,6 +4799,9 @@ static void f2fs_dio_iostat_start(struct f2fs_sb_info *sbi, struct bio *bio)
> >  {
> >       void *bi_private = bio->bi_private;
> >
> > +     if (!f2fs_iostat_enabled(sbi))
> > +             return;
> > +
> >       iostat_alloc_and_bind_ctx(sbi, bio, bi_private);
> >       iostat_update_submit_ctx(bio, DATA);
> >       bio->bi_end_io = f2fs_dio_end_bio;
> > @@ -4816,7 +4819,8 @@ static int f2fs_dio_read_end_io(struct kiocb *iocb, ssize_t size, int error,
> >       dec_page_count(sbi, F2FS_DIO_READ);
> >       if (error)
> >               return error;
> > -     f2fs_update_iostat(sbi, NULL, APP_DIRECT_READ_IO, size);
> > +     if (f2fs_iostat_enabled(sbi))
> > +             f2fs_update_iostat(sbi, NULL, APP_DIRECT_READ_IO, size);
>
> f2fs_update_iostat() checks sbi->iostat_enable?
>
> >       return 0;
> >  }
> >
> > @@ -5097,7 +5101,8 @@ static int f2fs_dio_write_end_io(struct kiocb *iocb, ssize_t size, int error,
> >       if (error)
> >               return error;
> >       f2fs_update_time(sbi, REQ_TIME);
> > -     f2fs_update_iostat(sbi, NULL, APP_DIRECT_IO, size);
> > +     if (f2fs_iostat_enabled(sbi))
> > +             f2fs_update_iostat(sbi, NULL, APP_DIRECT_IO, size);
> >       return 0;
> >  }
> >
> > diff --git a/fs/f2fs/iostat.h b/fs/f2fs/iostat.h
> > index 2025225b5bed..d3ef787575be 100644
> > --- a/fs/f2fs/iostat.h
> > +++ b/fs/f2fs/iostat.h
> > @@ -44,6 +44,11 @@ struct bio_iostat_ctx {
> >       struct bio_post_read_ctx *post_read_ctx;
> >  };
> >
> > +static inline bool f2fs_iostat_enabled(struct f2fs_sb_info *sbi)
> > +{
> > +     return sbi->iostat_enable;
> > +}
> > +
> >  static inline void iostat_update_submit_ctx(struct bio *bio,
> >                       enum page_type type)
> >  {
> > @@ -72,6 +77,7 @@ static inline void f2fs_update_iostat(struct f2fs_sb_info *sbi, struct inode *in
> >               enum iostat_type type, unsigned long long io_bytes) {}
> >  static inline void f2fs_update_read_folio_count(struct f2fs_sb_info *sbi,
> >               struct folio *folio) {}
> > +static inline bool f2fs_iostat_enabled(struct f2fs_sb_info *sbi) { return false; }
> >  static inline void iostat_update_and_unbind_ctx(struct bio *bio) {}
> >  static inline void iostat_alloc_and_bind_ctx(struct f2fs_sb_info *sbi,
> >               struct bio *bio, struct bio_post_read_ctx *ctx) {}
> > --
> > 2.43.0
> >


_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.