All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-block@vger.kernel.org,
	Jens Axboe <axboe@kernel.dk>,
	Christoph Hellwig <hch@infradead.org>
Subject: Re: [PATCH 15/21] iomap: Convert iomap_write_begin and iomap_write_end to folios
Date: Tue, 2 Nov 2021 16:22:15 -0700	[thread overview]
Message-ID: <20211102232215.GG2237511@magnolia> (raw)
In-Reply-To: <20211101203929.954622-16-willy@infradead.org>

On Mon, Nov 01, 2021 at 08:39:23PM +0000, Matthew Wilcox (Oracle) wrote:
> These functions still only work in PAGE_SIZE chunks, but there are
> fewer conversions from tail to head pages as a result of this patch.
> 
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
> ---
>  fs/iomap/buffered-io.c | 67 ++++++++++++++++++++++--------------------
>  1 file changed, 35 insertions(+), 32 deletions(-)
> 
> diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
> index b55d947867b1..6df8fdbb1951 100644
> --- a/fs/iomap/buffered-io.c
> +++ b/fs/iomap/buffered-io.c
> @@ -539,9 +539,8 @@ static int iomap_read_folio_sync(loff_t block_start, struct folio *folio,
>  }
>  
>  static int __iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
> -		unsigned len, struct page *page)
> +		size_t len, struct folio *folio)
>  {
> -	struct folio *folio = page_folio(page);
>  	const struct iomap *srcmap = iomap_iter_srcmap(iter);
>  	struct iomap_page *iop = iomap_page_create(iter->inode, folio);
>  	loff_t block_size = i_blocksize(iter->inode);
> @@ -583,9 +582,8 @@ static int __iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
>  }
>  
>  static int iomap_write_begin_inline(const struct iomap_iter *iter,
> -		struct page *page)
> +		struct folio *folio)
>  {
> -	struct folio *folio = page_folio(page);
>  	int ret;
>  
>  	/* needs more work for the tailpacking case; disable for now */
> @@ -598,11 +596,13 @@ static int iomap_write_begin_inline(const struct iomap_iter *iter,
>  }
>  
>  static int iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
> -		unsigned len, struct page **pagep)
> +		size_t len, struct folio **foliop)
>  {
>  	const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
>  	const struct iomap *srcmap = iomap_iter_srcmap(iter);
> +	struct folio *folio;
>  	struct page *page;
> +	unsigned fgp = FGP_LOCK | FGP_WRITE | FGP_CREAT | FGP_STABLE | FGP_NOFS;
>  	int status = 0;
>  
>  	BUG_ON(pos + len > iter->iomap.offset + iter->iomap.length);
> @@ -618,29 +618,30 @@ static int iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
>  			return status;
>  	}
>  
> -	page = grab_cache_page_write_begin(iter->inode->i_mapping,
> -				pos >> PAGE_SHIFT, AOP_FLAG_NOFS);
> -	if (!page) {
> +	folio = __filemap_get_folio(iter->inode->i_mapping, pos >> PAGE_SHIFT,
> +			fgp, mapping_gfp_mask(iter->inode->i_mapping));
> +	if (!folio) {
>  		status = -ENOMEM;
>  		goto out_no_page;
>  	}
>  
> +	page = folio_file_page(folio, pos >> PAGE_SHIFT);

Isn't this only needed in the BUFFER_HEAD case?

--D

>  	if (srcmap->type == IOMAP_INLINE)
> -		status = iomap_write_begin_inline(iter, page);
> +		status = iomap_write_begin_inline(iter, folio);
>  	else if (srcmap->flags & IOMAP_F_BUFFER_HEAD)
>  		status = __block_write_begin_int(page, pos, len, NULL, srcmap);
>  	else
> -		status = __iomap_write_begin(iter, pos, len, page);
> +		status = __iomap_write_begin(iter, pos, len, folio);
>  
>  	if (unlikely(status))
>  		goto out_unlock;
>  
> -	*pagep = page;
> +	*foliop = folio;
>  	return 0;
>  
>  out_unlock:
> -	unlock_page(page);
> -	put_page(page);
> +	folio_unlock(folio);
> +	folio_put(folio);
>  	iomap_write_failed(iter->inode, pos, len);
>  
>  out_no_page:
> @@ -650,11 +651,10 @@ static int iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
>  }
>  
>  static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
> -		size_t copied, struct page *page)
> +		size_t copied, struct folio *folio)
>  {
> -	struct folio *folio = page_folio(page);
>  	struct iomap_page *iop = to_iomap_page(folio);
> -	flush_dcache_page(page);
> +	flush_dcache_folio(folio);
>  
>  	/*
>  	 * The blocks that were entirely written will now be uptodate, so we
> @@ -667,10 +667,10 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
>  	 * non-uptodate page as a zero-length write, and force the caller to
>  	 * redo the whole thing.
>  	 */
> -	if (unlikely(copied < len && !PageUptodate(page)))
> +	if (unlikely(copied < len && !folio_test_uptodate(folio)))
>  		return 0;
>  	iomap_set_range_uptodate(folio, iop, offset_in_folio(folio, pos), len);
> -	__set_page_dirty_nobuffers(page);
> +	filemap_dirty_folio(inode->i_mapping, folio);
>  	return copied;
>  }
>  
> @@ -694,8 +694,9 @@ static size_t iomap_write_end_inline(const struct iomap_iter *iter,
>  
>  /* Returns the number of bytes copied.  May be 0.  Cannot be an errno. */
>  static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len,
> -		size_t copied, struct page *page)
> +		size_t copied, struct folio *folio)
>  {
> +	struct page *page = folio_file_page(folio, pos >> PAGE_SHIFT);
>  	const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
>  	const struct iomap *srcmap = iomap_iter_srcmap(iter);
>  	loff_t old_size = iter->inode->i_size;
> @@ -707,7 +708,7 @@ static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len,
>  		ret = block_write_end(NULL, iter->inode->i_mapping, pos, len,
>  				copied, page, NULL);
>  	} else {
> -		ret = __iomap_write_end(iter->inode, pos, len, copied, page);
> +		ret = __iomap_write_end(iter->inode, pos, len, copied, folio);
>  	}
>  
>  	/*
> @@ -719,13 +720,13 @@ static size_t iomap_write_end(struct iomap_iter *iter, loff_t pos, size_t len,
>  		i_size_write(iter->inode, pos + ret);
>  		iter->iomap.flags |= IOMAP_F_SIZE_CHANGED;
>  	}
> -	unlock_page(page);
> +	folio_unlock(folio);
>  
>  	if (old_size < pos)
>  		pagecache_isize_extended(iter->inode, old_size, pos);
>  	if (page_ops && page_ops->page_done)
>  		page_ops->page_done(iter->inode, pos, ret, page);
> -	put_page(page);
> +	folio_put(folio);
>  
>  	if (ret < len)
>  		iomap_write_failed(iter->inode, pos, len);
> @@ -740,6 +741,7 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
>  	long status = 0;
>  
>  	do {
> +		struct folio *folio;
>  		struct page *page;
>  		unsigned long offset;	/* Offset into pagecache page */
>  		unsigned long bytes;	/* Bytes to write to page */
> @@ -763,16 +765,17 @@ static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i)
>  			break;
>  		}
>  
> -		status = iomap_write_begin(iter, pos, bytes, &page);
> +		status = iomap_write_begin(iter, pos, bytes, &folio);
>  		if (unlikely(status))
>  			break;
>  
> +		page = folio_file_page(folio, pos >> PAGE_SHIFT);
>  		if (mapping_writably_mapped(iter->inode->i_mapping))
>  			flush_dcache_page(page);
>  
>  		copied = copy_page_from_iter_atomic(page, offset, bytes, i);
>  
> -		status = iomap_write_end(iter, pos, bytes, copied, page);
> +		status = iomap_write_end(iter, pos, bytes, copied, folio);
>  
>  		if (unlikely(copied != status))
>  			iov_iter_revert(i, copied - status);
> @@ -838,13 +841,13 @@ static loff_t iomap_unshare_iter(struct iomap_iter *iter)
>  	do {
>  		unsigned long offset = offset_in_page(pos);
>  		unsigned long bytes = min_t(loff_t, PAGE_SIZE - offset, length);
> -		struct page *page;
> +		struct folio *folio;
>  
> -		status = iomap_write_begin(iter, pos, bytes, &page);
> +		status = iomap_write_begin(iter, pos, bytes, &folio);
>  		if (unlikely(status))
>  			return status;
>  
> -		status = iomap_write_end(iter, pos, bytes, bytes, page);
> +		status = iomap_write_end(iter, pos, bytes, bytes, folio);
>  		if (WARN_ON_ONCE(status == 0))
>  			return -EIO;
>  
> @@ -880,19 +883,19 @@ EXPORT_SYMBOL_GPL(iomap_file_unshare);
>  
>  static s64 __iomap_zero_iter(struct iomap_iter *iter, loff_t pos, u64 length)
>  {
> -	struct page *page;
> +	struct folio *folio;
>  	int status;
>  	unsigned offset = offset_in_page(pos);
>  	unsigned bytes = min_t(u64, PAGE_SIZE - offset, length);
>  
> -	status = iomap_write_begin(iter, pos, bytes, &page);
> +	status = iomap_write_begin(iter, pos, bytes, &folio);
>  	if (status)
>  		return status;
>  
> -	zero_user(page, offset, bytes);
> -	mark_page_accessed(page);
> +	zero_user(folio_file_page(folio, pos >> PAGE_SHIFT), offset, bytes);
> +	folio_mark_accessed(folio);
>  
> -	return iomap_write_end(iter, pos, bytes, bytes, page);
> +	return iomap_write_end(iter, pos, bytes, bytes, folio);
>  }
>  
>  static loff_t iomap_zero_iter(struct iomap_iter *iter, bool *did_zero)
> -- 
> 2.33.0
> 

  parent reply	other threads:[~2021-11-02 23:22 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-01 20:39 [PATCH 00/21] iomap/xfs folio patches Matthew Wilcox (Oracle)
2021-11-01 20:39 ` [PATCH 01/21] fs: Remove FS_THP_SUPPORT Matthew Wilcox (Oracle)
2021-11-02  7:12   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 02/21] block: Add bio_add_folio() Matthew Wilcox (Oracle)
2021-11-01 20:51   ` Jens Axboe
2021-11-02 14:15     ` Matthew Wilcox
2021-11-02  7:12   ` Christoph Hellwig
2021-11-03  1:25   ` wangjianjian (C)
2021-11-03  2:22     ` Matthew Wilcox
2021-11-01 20:39 ` [PATCH 03/21] block: Add bio_for_each_folio_all() Matthew Wilcox (Oracle)
2021-11-01 20:51   ` Jens Axboe
2021-11-02  7:13   ` Christoph Hellwig
2021-11-02 20:24     ` Matthew Wilcox
2021-11-02 22:24       ` Darrick J. Wong
2021-11-02 22:33         ` Jens Axboe
2021-11-02 22:37           ` Darrick J. Wong
2021-11-01 20:39 ` [PATCH 04/21] iomap: Convert to_iomap_page to take a folio Matthew Wilcox (Oracle)
2021-11-02  7:13   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 05/21] iomap: Convert iomap_page_create " Matthew Wilcox (Oracle)
2021-11-02  7:14   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 06/21] iomap: Convert iomap_page_release " Matthew Wilcox (Oracle)
2021-11-01 20:39 ` [PATCH 07/21] iomap: Convert iomap_releasepage to use " Matthew Wilcox (Oracle)
2021-11-02  7:14   ` Christoph Hellwig
2021-11-02 22:39     ` Darrick J. Wong
2021-11-01 20:39 ` [PATCH 08/21] iomap: Add iomap_invalidate_folio Matthew Wilcox (Oracle)
2021-11-02  7:15   ` Christoph Hellwig
2021-11-02 22:36   ` Darrick J. Wong
2021-11-01 20:39 ` [PATCH 09/21] iomap: Pass the iomap_page into iomap_set_range_uptodate Matthew Wilcox (Oracle)
2021-11-02  7:16   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 10/21] iomap: Convert bio completions to use folios Matthew Wilcox (Oracle)
2021-11-02  7:17   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 11/21] iomap: Use folio offsets instead of page offsets Matthew Wilcox (Oracle)
2021-11-02  7:18   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 12/21] iomap: Convert iomap_read_inline_data to take a folio Matthew Wilcox (Oracle)
2021-11-02  7:18   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 13/21] iomap: Convert readahead and readpage to use " Matthew Wilcox (Oracle)
2021-11-02  7:20   ` Christoph Hellwig
2021-11-02 12:28     ` Matthew Wilcox
2021-11-01 20:39 ` [PATCH 14/21] iomap: Convert iomap_page_mkwrite " Matthew Wilcox (Oracle)
2021-11-02  7:21   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 15/21] iomap: Convert iomap_write_begin and iomap_write_end to folios Matthew Wilcox (Oracle)
2021-11-02  0:25   ` kernel test robot
2021-11-02  0:25     ` kernel test robot
2021-11-02  7:22   ` Christoph Hellwig
2021-11-02 23:22   ` Darrick J. Wong [this message]
2021-11-03  3:15     ` Matthew Wilcox
2021-11-03 12:47       ` Matthew Wilcox
2021-11-01 20:39 ` [PATCH 16/21] iomap: Convert iomap_write_end_inline to take a folio Matthew Wilcox (Oracle)
2021-11-02  7:22   ` Christoph Hellwig
2021-11-01 20:39 ` [PATCH 17/21] iomap,xfs: Convert ->discard_page to ->discard_folio Matthew Wilcox (Oracle)
2021-11-02  7:23   ` Christoph Hellwig
2021-11-03 15:43   ` Darrick J. Wong
2021-11-01 20:39 ` [PATCH 18/21] iomap: Convert iomap_add_to_ioend to take a folio Matthew Wilcox (Oracle)
2021-11-02  7:26   ` Christoph Hellwig
2021-11-02 20:28     ` Matthew Wilcox
2021-11-03 15:54       ` Christoph Hellwig
2021-11-04  3:33         ` Matthew Wilcox
2021-11-04  8:38           ` Christoph Hellwig
2021-11-04  8:40             ` Christoph Hellwig
2021-11-03 16:00       ` Darrick J. Wong
2021-11-04  3:42         ` Matthew Wilcox
2021-11-01 20:39 ` [PATCH 19/21] iomap: Convert iomap_migrate_page to use folios Matthew Wilcox (Oracle)
2021-11-02  7:27   ` Christoph Hellwig
2021-11-03 16:02   ` Darrick J. Wong
2021-11-06  3:44   ` Matthew Wilcox
2021-11-01 20:39 ` [PATCH 20/21] iomap: Support multi-page folios in invalidatepage Matthew Wilcox (Oracle)
2021-11-02  7:27   ` Christoph Hellwig
2021-11-03 16:03   ` Darrick J. Wong
2021-11-01 20:39 ` [PATCH 21/21] xfs: Support multi-page folios Matthew Wilcox (Oracle)
2021-11-02  7:27   ` Christoph Hellwig
2021-11-03 16:07   ` Darrick J. Wong

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=20211102232215.GG2237511@magnolia \
    --to=djwong@kernel.org \
    --cc=axboe@kernel.dk \
    --cc=hch@infradead.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=willy@infradead.org \
    /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.