All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Ming Lei <ming.lei@redhat.com>
Cc: Jens Axboe <axboe@fb.com>, Christoph Hellwig <hch@infradead.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Kent Overstreet <kent.overstreet@gmail.com>,
	David Sterba <dsterba@suse.cz>, Huang Ying <ying.huang@intel.com>,
	linux-kernel@vger.kernel.org, linux-block@vger.kernel.org,
	linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
	Theodore Ts'o <tytso@mit.edu>,
	"Darrick J . Wong" <darrick.wong@oracle.com>,
	Coly Li <colyli@suse.de>, Filipe Manana <fdmanana@gmail.com>,
	Randy Dunlap <rdunlap@infradead.org>
Subject: Re: [PATCH V6 15/30] block: introduce bio_clone_chunk_bioset()
Date: Wed, 13 Jun 2018 07:56:54 -0700	[thread overview]
Message-ID: <20180613145654.GE4693@infradead.org> (raw)
In-Reply-To: <20180609123014.8861-16-ming.lei@redhat.com>

On Sat, Jun 09, 2018 at 08:29:59PM +0800, Ming Lei wrote:
> There is one use case(DM) which requires to clone bio chunk by
> chunk, so introduce this API.

I don't think DM is the special case here.  The special case is the
bounce code that only wants single page bios.  Between that, and the
fact that we only have two callers and one of them is inside the
block layer I would suggest to fold in the following patch to make
bio_clone_bioset clone in multi-page bvecs and make the bounce code
use the low-level interface directly:

diff --git a/block/bio.c b/block/bio.c
index 284085ab97e7..cef45c8d0a19 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -644,13 +644,14 @@ struct bio *bio_clone_fast(struct bio *bio, gfp_t gfp_mask, struct bio_set *bs)
 }
 EXPORT_SYMBOL(bio_clone_fast);
 
-static struct bio *__bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
-				      struct bio_set *bs, bool seg)
+struct bio *__bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
+		struct bio_set *bs, bool single_page_only)
 {
 	struct bvec_iter iter;
 	struct bio_vec bv;
 	struct bio *bio;
-	int nr_vecs = seg ? bio_segments(bio_src) : bio_chunks(bio_src);
+	int nr_vecs = single_page_only ?
+		bio_segments(bio_src) : bio_chunks(bio_src);
 
 	/*
 	 * Pre immutable biovecs, __bio_clone() used to just do a memcpy from
@@ -692,7 +693,7 @@ static struct bio *__bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
 		bio->bi_io_vec[bio->bi_vcnt++] = bio_src->bi_io_vec[0];
 		break;
 	default:
-		if (seg) {
+		if (single_page_only) {
 			bio_for_each_segment(bv, bio_src, iter)
 				bio->bi_io_vec[bio->bi_vcnt++] = bv;
 		} else {
@@ -728,26 +729,10 @@ static struct bio *__bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
  */
 struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
 			     struct bio_set *bs)
-{
-	return __bio_clone_bioset(bio_src, gfp_mask, bs, true);
-}
-EXPORT_SYMBOL(bio_clone_bioset);
-
-/**
- * 	bio_clone_seg_bioset - clone a bio segment by segment
- * 	@bio_src: bio to clone
- *	@gfp_mask: allocation priority
- *	@bs: bio_set to allocate from
- *
- *	Clone bio. Caller will own the returned bio, but not the actual data it
- *	points to. Reference count of returned bio will be one.
- */
-struct bio *bio_clone_chunk_bioset(struct bio *bio_src, gfp_t gfp_mask,
-				   struct bio_set *bs)
 {
 	return __bio_clone_bioset(bio_src, gfp_mask, bs, false);
 }
-EXPORT_SYMBOL(bio_clone_chunk_bioset);
+EXPORT_SYMBOL(bio_clone_bioset);
 
 /**
  *	bio_add_pc_page	-	attempt to add page to bio
diff --git a/block/bounce.c b/block/bounce.c
index c6af0bd29ec9..62dab528dc1b 100644
--- a/block/bounce.c
+++ b/block/bounce.c
@@ -224,8 +224,8 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
 		generic_make_request(*bio_orig);
 		*bio_orig = bio;
 	}
-	bio = bio_clone_bioset(*bio_orig, GFP_NOIO, passthrough ? NULL :
-			&bounce_bio_set);
+	bio = __bio_clone_bioset(*bio_orig, GFP_NOIO, passthrough ? NULL :
+			&bounce_bio_set, true);
 
 	bio_for_each_chunk_segment_all(to, bio, i, citer) {
 		struct page *page = to->bv_page;
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 13ca3574d972..98dff36b89a3 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1582,8 +1582,8 @@ static blk_qc_t __split_and_process_bio(struct mapped_device *md,
 				 * the usage of io->orig_bio in dm_remap_zone_report()
 				 * won't be affected by this reassignment.
 				 */
-				struct bio *b = bio_clone_chunk_bioset(bio, GFP_NOIO,
-								       &md->queue->bio_split);
+				struct bio *b = bio_clone_bioset(bio, GFP_NOIO,
+								 &md->queue->bio_split);
 				ci.io->orig_bio = b;
 				bio_advance(bio, (bio_sectors(bio) - ci.sector_count) << 9);
 				bio_chain(b, bio);
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 58838dc12d69..5ccafeadbe95 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -486,7 +486,8 @@ extern void bio_put(struct bio *);
 extern void __bio_clone_fast(struct bio *, struct bio *);
 extern struct bio *bio_clone_fast(struct bio *, gfp_t, struct bio_set *);
 extern struct bio *bio_clone_bioset(struct bio *, gfp_t, struct bio_set *bs);
-extern struct bio *bio_clone_chunk_bioset(struct bio *, gfp_t, struct bio_set *bs);
+extern struct bio *__bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
+		struct bio_set *bs, bool single_page_only);
 
 extern struct bio_set fs_bio_set;
 

  reply	other threads:[~2018-06-13 14:56 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-09 12:29 [PATCH V6 00/30] block: support multipage bvec Ming Lei
2018-06-09 12:29 ` [PATCH V6 01/30] block: simplify bio_check_pages_dirty Ming Lei
2018-06-09 12:29 ` [PATCH V6 02/30] block: bio_set_pages_dirty can't see NULL bv_page in a valid bio_vec Ming Lei
2018-06-09 12:29 ` [PATCH V6 03/30] block: use bio_add_page in bio_iov_iter_get_pages Ming Lei
2018-06-09 12:29 ` [PATCH V6 04/30] block: introduce multipage page bvec helpers Ming Lei
2018-06-09 12:29 ` [PATCH V6 05/30] block: introduce bio_for_each_chunk() Ming Lei
2018-06-09 12:29 ` [PATCH V6 06/30] block: use bio_for_each_chunk() to compute multipage bvec count Ming Lei
2018-06-09 12:29 ` [PATCH V6 07/30] block: use bio_for_each_chunk() to map sg Ming Lei
2018-06-09 12:29 ` [PATCH V6 08/30] block: introduce chunk_last_segment() Ming Lei
2018-06-11 17:19   ` Christoph Hellwig
2018-06-12  3:24     ` Ming Lei
2018-06-09 12:29 ` [PATCH V6 09/30] fs/buffer.c: use bvec iterator to truncate the bio Ming Lei
2018-06-09 12:29 ` [PATCH V6 10/30] btrfs: use chunk_last_segment to get bio's last page Ming Lei
2018-06-09 12:29 ` [PATCH V6 11/30] block: implement bio_pages_all() via bio_for_each_segment_all() Ming Lei
2018-06-13 14:44   ` Christoph Hellwig
2018-06-14  1:23     ` Ming Lei
2018-06-14  6:20       ` Christoph Hellwig
2018-06-09 12:29 ` [PATCH V6 12/30] block: introduce bio_chunks() Ming Lei
2018-06-13 14:47   ` Christoph Hellwig
2018-06-13 14:57     ` Kent Overstreet
2018-06-09 12:29 ` [PATCH V6 13/30] block: introduce rq_for_each_chunk() Ming Lei
2018-06-13 14:48   ` Christoph Hellwig
2018-06-14  1:52     ` Ming Lei
2018-06-09 12:29 ` [PATCH V6 14/30] block: loop: pass multipage chunks to iov_iter Ming Lei
2018-06-09 12:29 ` [PATCH V6 15/30] block: introduce bio_clone_chunk_bioset() Ming Lei
2018-06-13 14:56   ` Christoph Hellwig [this message]
2018-06-14  2:01     ` Ming Lei
2018-06-14  6:39       ` Christoph Hellwig
2018-06-14  7:28         ` Ming Lei
2018-06-09 12:30 ` [PATCH V6 16/30] dm: clone bio via bio_clone_chunk_bioset Ming Lei
2018-06-09 12:30 ` [PATCH V6 17/30] block: introduce bio_for_each_chunk_all and bio_for_each_chunk_segment_all Ming Lei
2018-06-09 12:30 ` [PATCH V6 18/30] block: convert to bio_for_each_chunk_segment_all() Ming Lei
2018-06-09 12:30 ` [PATCH V6 19/30] md/dm/bcache: conver to bio_for_each_chunk_segment_all and bio_for_each_chunk_all Ming Lei
2018-06-10 12:38   ` Coly Li
2018-06-13 14:57   ` Christoph Hellwig
2018-06-09 12:30 ` [PATCH V6 20/30] fs: conver to bio_for_each_chunk_segment_all() Ming Lei
2018-06-09 12:30 ` [PATCH V6 21/30] btrfs: conver to bio_for_each_chunk_segment_all Ming Lei
2018-06-09 12:30 ` [PATCH V6 22/30] ext4: " Ming Lei
2018-06-09 12:30 ` [PATCH V6 23/30] f2fs: " Ming Lei
2018-06-09 12:30 ` [PATCH V6 24/30] xfs: " Ming Lei
2018-06-09 12:30 ` [PATCH V6 25/30] exofs: " Ming Lei
2018-06-09 12:30 ` [PATCH V6 26/30] gfs2: " Ming Lei
2018-06-09 12:30 ` [PATCH V6 27/30] block: kill bio_for_each_segment_all() Ming Lei
2018-06-09 12:30 ` [PATCH V6 28/30] block: enable multipage bvecs Ming Lei
2018-06-09 12:30 ` [PATCH V6 29/30] block: always define BIO_MAX_PAGES as 256 Ming Lei
2018-06-09 12:30 ` [PATCH V6 30/30] block: document usage of bio iterator helpers Ming Lei
2018-06-15 15:43   ` Gi-Oh Kim
2018-06-15 15:43     ` Gi-Oh Kim
2018-06-11 16:48 ` [PATCH V6 00/30] block: support multipage bvec Christoph Hellwig
2018-06-11 16:48   ` Christoph Hellwig
2018-06-12  3:42   ` Ming Lei
2018-06-12  3:42     ` Ming Lei
2018-06-13 14:42     ` Christoph Hellwig
2018-06-13 14:42       ` Christoph Hellwig
2018-06-14  1:18       ` Ming Lei
2018-06-14  1:18         ` Ming Lei
2018-06-14  6:18         ` Christoph Hellwig
2018-06-13 14:59 ` Kent Overstreet
2018-06-14  1:20   ` Ming Lei
2018-06-15 12:59 ` Gi-Oh Kim
2018-06-15 12:59   ` Gi-Oh Kim
2018-06-21  1:17   ` Ming Lei
2018-06-21  8:40     ` Gi-Oh Kim
2018-06-21  8:40       ` Gi-Oh Kim

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=20180613145654.GE4693@infradead.org \
    --to=hch@infradead.org \
    --cc=axboe@fb.com \
    --cc=colyli@suse.de \
    --cc=darrick.wong@oracle.com \
    --cc=dsterba@suse.cz \
    --cc=fdmanana@gmail.com \
    --cc=kent.overstreet@gmail.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=ming.lei@redhat.com \
    --cc=rdunlap@infradead.org \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    --cc=ying.huang@intel.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.