All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Jens Axboe <axboe@kernel.dk>,
	Christian Brauner <brauner@kernel.org>,
	Carlos Maiolino <cem@kernel.org>,
	Tal Zussman <tz2294@columbia.edu>,
	Anuj Gupta <anuj20.g@samsung.com>,
	linux-block@vger.kernel.org, linux-xfs@vger.kernel.org,
	linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 03/17] block: split bio_iov_iter_bounce_write
Date: Mon, 31 Aug 2026 10:58:36 -0700	[thread overview]
Message-ID: <20260831175836.GH1933798@frogsfrogsfrogs> (raw)
In-Reply-To: <20260831064010.2574896-4-hch@lst.de>

On Mon, Aug 31, 2026 at 09:39:51AM +0300, Christoph Hellwig wrote:
> Factor out a bio_alloc_bounce_folios helper that we'll use for a
> different take on read-side bounce buffering soon.
> 
> For that make it and also bio_free_folios available to callers outside of
> bio.c.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>

This looks like a simple split of one function into two, right?

If so, then I'm ok with this;
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  block/bio.c         | 58 ++++++++++++++++++++++++++-------------------
>  include/linux/bio.h |  2 ++
>  2 files changed, 35 insertions(+), 25 deletions(-)
> 
> diff --git a/block/bio.c b/block/bio.c
> index efd9483b8348..a87c33fe96ac 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -1353,7 +1353,7 @@ static struct folio *folio_alloc_greedy(gfp_t gfp, size_t *size,
>  	return folio_alloc(gfp, get_order(*size));
>  }
>  
> -static void bio_free_folios(struct bio *bio)
> +void bio_free_folios(struct bio *bio)
>  {
>  	struct bio_vec *bv;
>  	int i;
> @@ -1366,11 +1366,8 @@ static void bio_free_folios(struct bio *bio)
>  	}
>  }
>  
> -static int bio_iov_iter_bounce_write(struct bio *bio, struct iov_iter *iter,
> -		size_t maxlen, size_t minsize)
> +int bio_alloc_bounce_folios(struct bio *bio, size_t total_len, size_t minsize)
>  {
> -	size_t total_len = min(maxlen, iov_iter_count(iter));
> -
>  	if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED)))
>  		return -EINVAL;
>  	if (WARN_ON_ONCE(bio->bi_iter.bi_size))
> @@ -1380,7 +1377,6 @@ static int bio_iov_iter_bounce_write(struct bio *bio, struct iov_iter *iter,
>  
>  	do {
>  		size_t this_len = min(total_len, SZ_1M);
> -		size_t copied;
>  		struct folio *folio;
>  
>  		if (this_len > minsize * 2)
> @@ -1393,32 +1389,44 @@ static int bio_iov_iter_bounce_write(struct bio *bio, struct iov_iter *iter,
>  		if (!folio)
>  			break;
>  		bio_add_folio_nofail(bio, folio, this_len, 0);
> +		total_len -= this_len;
> +	} while (total_len && bio->bi_vcnt < bio->bi_max_vecs);
> +
> +	if (!bio->bi_iter.bi_size)
> +		return -ENOMEM;
> +	return 0;
> +}
> +
> +static int bio_iov_iter_bounce_write(struct bio *bio, struct iov_iter *iter,
> +		size_t maxlen, size_t minsize)
> +{
> +	size_t total_len = min(maxlen, iov_iter_count(iter));
> +	size_t total_copied = 0;
> +	struct bio_vec *bv;
> +	int i, error;
> +
> +	error = bio_alloc_bounce_folios(bio, total_len, minsize);
> +	if (error)
> +		return error;
> +
> +	bio_for_each_bvec_all(bv, bio, i) {
> +		struct folio *folio = page_folio(bv->bv_page);
> +		size_t copied;
>  
>  		if (iter->nofault)
> -			copied = copy_folio_from_iter_atomic(folio, 0, this_len,
> -							     iter);
> +			copied = copy_folio_from_iter_atomic(folio, 0,
> +					bv->bv_len, iter);
>  		else
> -			copied = copy_folio_from_iter(folio, 0, this_len, iter);
> -		if (copied < this_len) {
> -			/*
> -			 * Need to revert the iov iter for all bytes we have
> -			 * copied.
> -			 *
> -			 * However the bio size differs from the real copied
> -			 * bytes as @this_len is queued but only advanced
> -			 * less than that.
> -			 * Need to compensate that for the revert.
> -			 */
> -			iov_iter_revert(iter, bio->bi_iter.bi_size - this_len +
> -					copied);
> +			copied = copy_folio_from_iter(folio, 0, bv->bv_len,
> +					iter);
> +		total_copied += copied;
> +		if (copied < bv->bv_len) {
> +			iov_iter_revert(iter, total_copied);
>  			bio_free_folios(bio);
>  			return -EFAULT;
>  		}
> -		total_len -= this_len;
> -	} while (total_len && bio->bi_vcnt < bio->bi_max_vecs);
> +	}
>  
> -	if (!bio->bi_iter.bi_size)
> -		return -ENOMEM;
>  	return bio_iov_iter_align_down(bio, iter,
>  			&bio->bi_io_vec[bio->bi_vcnt - 1], minsize - 1);
>  }
> diff --git a/include/linux/bio.h b/include/linux/bio.h
> index 0070be355181..584b6abf6baf 100644
> --- a/include/linux/bio.h
> +++ b/include/linux/bio.h
> @@ -527,6 +527,8 @@ extern void bio_check_pages_dirty(struct bio *bio);
>  int bio_iov_iter_bounce(struct bio *bio, struct iov_iter *iter, size_t maxlen,
>  		size_t minsize);
>  void bio_iov_iter_unbounce(struct bio *bio, bool is_error, bool mark_dirty);
> +int bio_alloc_bounce_folios(struct bio *bio, size_t total_len, size_t minsize);
> +void bio_free_folios(struct bio *bio);
>  
>  extern void bio_copy_data(struct bio *dst, struct bio *src);
>  extern void bio_free_pages(struct bio *bio);
> -- 
> 2.53.0
> 
> 

  reply	other threads:[~2026-08-31 17:58 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-31  6:39 lazy bounce buffering for checksummed reads V2 Christoph Hellwig
2026-08-31  6:39 ` [PATCH 01/17] block: pass a maxlen argument to bio_iov_iter_get_pages Christoph Hellwig
2026-08-31 18:04   ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 02/17] block: warn on too larger integrity allocations Christoph Hellwig
2026-08-31 18:01   ` Darrick J. Wong
2026-09-01  8:12     ` Christoph Hellwig
2026-08-31  6:39 ` [PATCH 03/17] block: split bio_iov_iter_bounce_write Christoph Hellwig
2026-08-31 17:58   ` Darrick J. Wong [this message]
2026-08-31  6:39 ` [PATCH 04/17] block: export fs_bio_integrity_{alloc,free} Christoph Hellwig
2026-08-31 17:57   ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 05/17] iomap: respect maximum I/O size in iomap_dio_bio_iter_one Christoph Hellwig
2026-08-31 17:55   ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 06/17] iomap: add a iomap_ioend_flags helper Christoph Hellwig
2026-08-31  6:39 ` [PATCH 07/17] iomap: add a IOMAP_IOEND_INTEGRITY flag Christoph Hellwig
2026-08-31  6:39 ` [PATCH 08/17] iomap,xfs: move T10 PI handling for direct I/O into ->submit_io Christoph Hellwig
2026-08-31  6:39 ` [PATCH 09/17] xfs: move PI generation into xfs_submit_zoned_bio Christoph Hellwig
2026-08-31 17:53   ` Darrick J. Wong
2026-09-02 18:22   ` Anuj Gupta
2026-09-07  5:51     ` Christoph Hellwig
2026-08-31  6:39 ` [PATCH 10/17] block,iomap: fix protection information verification with initial bvec offset Christoph Hellwig
2026-08-31 17:52   ` Darrick J. Wong
2026-09-01  8:12     ` Christoph Hellwig
2026-09-01 14:06       ` Darrick J. Wong
2026-08-31  6:39 ` [PATCH 11/17] iomap: better read bounce buffering support Christoph Hellwig
2026-08-31  6:40 ` [PATCH 12/17] xfs: use BIO_COMPLETE_IN_TASK for bounce buffered read I/Os Christoph Hellwig
2026-08-31  6:40 ` [PATCH 13/17] iomap,xfs: move integrity verification to the file system Christoph Hellwig
2026-08-31  6:40 ` [PATCH 14/17] xfs: add support for lazy direct read bounce buffering Christoph Hellwig
2026-08-31 17:47   ` Darrick J. Wong
2026-09-02 18:24   ` Anuj Gupta
2026-08-31  6:40 ` [PATCH 15/17] xfs: add error injection for lazy " Christoph Hellwig
2026-09-02 18:26   ` Anuj Gupta
2026-08-31  6:40 ` [PATCH 16/17] xfs: log a message at mount time when using integrity protection Christoph Hellwig
2026-08-31  6:40 ` [PATCH 17/17] block,iomap: remove the old read side bounce buffering support Christoph Hellwig

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=20260831175836.GH1933798@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=anuj20.g@samsung.com \
    --cc=axboe@kernel.dk \
    --cc=brauner@kernel.org \
    --cc=cem@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=tz2294@columbia.edu \
    /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.