All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chao Yu <chao@kernel.org>
To: Yohan Joung <jyh429@gmail.com>, jaegeuk@kernel.org, daeho43@gmail.com
Cc: chao@kernel.org, linux-f2fs-devel@lists.sourceforge.net,
	linux-kernel@vger.kernel.org, Yohan Joung <yohan.joung@sk.com>
Subject: Re: [PATCH] f2fs: optimize f2fs DIO overwrites
Date: Tue, 11 Mar 2025 20:00:28 +0800	[thread overview]
Message-ID: <936351d5-e99c-4c5b-bd8b-8d541122f709@kernel.org> (raw)
In-Reply-To: <20250307145650.568-1-yohan.joung@sk.com>

On 3/7/25 22:56, Yohan Joung wrote:
> this is unnecessary when we know we are overwriting already allocated
> blocks and the overhead of starting a transaction can be significant
> especially for multithreaded workloads doing small writes.

Hi Yohan,

So you're trying to avoid f2fs_map_lock() in dio write path, right?

Thanks,

> 
> Signed-off-by: Yohan Joung <yohan.joung@sk.com>
> ---
>  fs/f2fs/data.c | 20 ++++++++++++++++++++
>  fs/f2fs/f2fs.h |  1 +
>  fs/f2fs/file.c |  5 ++++-
>  3 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 09437dbd1b42..728630037b74 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -4267,6 +4267,26 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
>  	return 0;
>  }
>  
> +static int f2fs_iomap_overwrite_begin(struct inode *inode, loff_t offset,
> +		loff_t length, unsigned flags, struct iomap *iomap,
> +		struct iomap *srcmap)
> +{
> +	int ret;
> +
> +	/*
> +	 * Even for writes we don't need to allocate blocks, so just pretend
> +	 * we are reading to save overhead of starting a transaction.
> +	 */
> +	flags &= ~IOMAP_WRITE;
> +	ret = f2fs_iomap_begin(inode, offset, length, flags, iomap, srcmap);
> +	WARN_ON_ONCE(!ret && iomap->type != IOMAP_MAPPED);
> +	return ret;
> +}
> +
>  const struct iomap_ops f2fs_iomap_ops = {
>  	.iomap_begin	= f2fs_iomap_begin,
>  };
> +
> +const struct iomap_ops f2fs_iomap_overwrite_ops = {
> +	.iomap_begin	= f2fs_iomap_overwrite_begin,
> +};
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index c6cc2694f9ac..0511ab5ed42a 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -3936,6 +3936,7 @@ void f2fs_destroy_post_read_processing(void);
>  int f2fs_init_post_read_wq(struct f2fs_sb_info *sbi);
>  void f2fs_destroy_post_read_wq(struct f2fs_sb_info *sbi);
>  extern const struct iomap_ops f2fs_iomap_ops;
> +extern const struct iomap_ops f2fs_iomap_overwrite_ops;
>  
>  static inline struct page *f2fs_find_data_page(struct inode *inode,
>  		pgoff_t index, pgoff_t *next_pgofs)
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index 82b21baf5628..bb2fe6dac9b6 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -4985,6 +4985,7 @@ static ssize_t f2fs_dio_write_iter(struct kiocb *iocb, struct iov_iter *from,
>  	const ssize_t count = iov_iter_count(from);
>  	unsigned int dio_flags;
>  	struct iomap_dio *dio;
> +	const struct iomap_ops *iomap_ops = &f2fs_iomap_ops;
>  	ssize_t ret;
>  
>  	trace_f2fs_direct_IO_enter(inode, iocb, count, WRITE);
> @@ -5025,7 +5026,9 @@ static ssize_t f2fs_dio_write_iter(struct kiocb *iocb, struct iov_iter *from,
>  	dio_flags = 0;
>  	if (pos + count > inode->i_size)
>  		dio_flags |= IOMAP_DIO_FORCE_WAIT;
> -	dio = __iomap_dio_rw(iocb, from, &f2fs_iomap_ops,
> +	else if (f2fs_overwrite_io(inode, pos, count))
> +		iomap_ops = &f2fs_iomap_overwrite_ops;
> +	dio = __iomap_dio_rw(iocb, from, iomap_ops,
>  			     &f2fs_iomap_dio_write_ops, dio_flags, NULL, 0);
>  	if (IS_ERR_OR_NULL(dio)) {
>  		ret = PTR_ERR_OR_ZERO(dio);


WARNING: multiple messages have this Message-ID (diff)
From: Chao Yu via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net>
To: Yohan Joung <jyh429@gmail.com>, jaegeuk@kernel.org, daeho43@gmail.com
Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH] f2fs: optimize f2fs DIO overwrites
Date: Tue, 11 Mar 2025 20:00:28 +0800	[thread overview]
Message-ID: <936351d5-e99c-4c5b-bd8b-8d541122f709@kernel.org> (raw)
In-Reply-To: <20250307145650.568-1-yohan.joung@sk.com>

On 3/7/25 22:56, Yohan Joung wrote:
> this is unnecessary when we know we are overwriting already allocated
> blocks and the overhead of starting a transaction can be significant
> especially for multithreaded workloads doing small writes.

Hi Yohan,

So you're trying to avoid f2fs_map_lock() in dio write path, right?

Thanks,

> 
> Signed-off-by: Yohan Joung <yohan.joung@sk.com>
> ---
>  fs/f2fs/data.c | 20 ++++++++++++++++++++
>  fs/f2fs/f2fs.h |  1 +
>  fs/f2fs/file.c |  5 ++++-
>  3 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 09437dbd1b42..728630037b74 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -4267,6 +4267,26 @@ static int f2fs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,
>  	return 0;
>  }
>  
> +static int f2fs_iomap_overwrite_begin(struct inode *inode, loff_t offset,
> +		loff_t length, unsigned flags, struct iomap *iomap,
> +		struct iomap *srcmap)
> +{
> +	int ret;
> +
> +	/*
> +	 * Even for writes we don't need to allocate blocks, so just pretend
> +	 * we are reading to save overhead of starting a transaction.
> +	 */
> +	flags &= ~IOMAP_WRITE;
> +	ret = f2fs_iomap_begin(inode, offset, length, flags, iomap, srcmap);
> +	WARN_ON_ONCE(!ret && iomap->type != IOMAP_MAPPED);
> +	return ret;
> +}
> +
>  const struct iomap_ops f2fs_iomap_ops = {
>  	.iomap_begin	= f2fs_iomap_begin,
>  };
> +
> +const struct iomap_ops f2fs_iomap_overwrite_ops = {
> +	.iomap_begin	= f2fs_iomap_overwrite_begin,
> +};
> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
> index c6cc2694f9ac..0511ab5ed42a 100644
> --- a/fs/f2fs/f2fs.h
> +++ b/fs/f2fs/f2fs.h
> @@ -3936,6 +3936,7 @@ void f2fs_destroy_post_read_processing(void);
>  int f2fs_init_post_read_wq(struct f2fs_sb_info *sbi);
>  void f2fs_destroy_post_read_wq(struct f2fs_sb_info *sbi);
>  extern const struct iomap_ops f2fs_iomap_ops;
> +extern const struct iomap_ops f2fs_iomap_overwrite_ops;
>  
>  static inline struct page *f2fs_find_data_page(struct inode *inode,
>  		pgoff_t index, pgoff_t *next_pgofs)
> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
> index 82b21baf5628..bb2fe6dac9b6 100644
> --- a/fs/f2fs/file.c
> +++ b/fs/f2fs/file.c
> @@ -4985,6 +4985,7 @@ static ssize_t f2fs_dio_write_iter(struct kiocb *iocb, struct iov_iter *from,
>  	const ssize_t count = iov_iter_count(from);
>  	unsigned int dio_flags;
>  	struct iomap_dio *dio;
> +	const struct iomap_ops *iomap_ops = &f2fs_iomap_ops;
>  	ssize_t ret;
>  
>  	trace_f2fs_direct_IO_enter(inode, iocb, count, WRITE);
> @@ -5025,7 +5026,9 @@ static ssize_t f2fs_dio_write_iter(struct kiocb *iocb, struct iov_iter *from,
>  	dio_flags = 0;
>  	if (pos + count > inode->i_size)
>  		dio_flags |= IOMAP_DIO_FORCE_WAIT;
> -	dio = __iomap_dio_rw(iocb, from, &f2fs_iomap_ops,
> +	else if (f2fs_overwrite_io(inode, pos, count))
> +		iomap_ops = &f2fs_iomap_overwrite_ops;
> +	dio = __iomap_dio_rw(iocb, from, iomap_ops,
>  			     &f2fs_iomap_dio_write_ops, dio_flags, NULL, 0);
>  	if (IS_ERR_OR_NULL(dio)) {
>  		ret = PTR_ERR_OR_ZERO(dio);



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

  reply	other threads:[~2025-03-11 12:00 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-07 14:56 [PATCH] f2fs: optimize f2fs DIO overwrites Yohan Joung
2025-03-07 14:56 ` [f2fs-dev] " Yohan Joung
2025-03-11 12:00 ` Chao Yu [this message]
2025-03-11 12:00   ` Chao Yu via Linux-f2fs-devel
2025-03-11 21:14   ` Daeho Jeong
2025-03-11 21:14     ` [f2fs-dev] " Daeho Jeong
2025-03-11 23:23     ` [External Mail] " 정요한(JOUNG YOHAN) Mobile AE
2025-03-11 23:23       ` [f2fs-dev] " yohan.joung

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=936351d5-e99c-4c5b-bd8b-8d541122f709@kernel.org \
    --to=chao@kernel.org \
    --cc=daeho43@gmail.com \
    --cc=jaegeuk@kernel.org \
    --cc=jyh429@gmail.com \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=yohan.joung@sk.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.