linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ming Lei <tom.leiming@gmail.com>
To: Jens Axboe <axboe@fb.com>, linux-kernel@vger.kernel.org
Cc: linux-block@vger.kernel.org,
	Christoph Hellwig <hch@infradead.org>,
	Ming Lei <tom.leiming@gmail.com>, Jens Axboe <axboe@kernel.dk>,
	Mike Christie <mchristi@redhat.com>,
	Hannes Reinecke <hare@suse.com>,
	Kent Overstreet <kent.overstreet@gmail.com>,
	Chaitanya Kulkarni <chaitanya.kulkarni@hgst.com>
Subject: [PATCH v1 17/54] block: introduce bio_clone_sp()
Date: Tue, 27 Dec 2016 23:56:06 +0800	[thread overview]
Message-ID: <1482854250-13481-18-git-send-email-tom.leiming@gmail.com> (raw)
In-Reply-To: <1482854250-13481-1-git-send-email-tom.leiming@gmail.com>

Firstly bio_clone() and bio_clone_bioset() are changed
to clone mp bvecs because our iterator helpers are capable
of splitting mp bvecs into sp bvecs.

But sometimes we still need cloned bio with singlepage bvecs,
for example, in bio bounce/bcache(bch_data_verify), bvecs of
cloned bio need to be updated.

Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
 block/bio.c         | 27 +++++++++++++++++++++------
 include/linux/bio.h | 42 ++++++++++++++++++++++++++++++++++++++----
 2 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 10398969353b..a76ed8a780de 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -630,16 +630,22 @@ EXPORT_SYMBOL(bio_clone_fast);
  * 	@bio_src: bio to clone
  *	@gfp_mask: allocation priority
  *	@bs: bio_set to allocate from
+ *	@sp_bvecs: if clone to singlepage bvecs.
  *
  *	Clone bio. Caller will own the returned bio, but not the actual data it
  *	points to. Reference count of returned bio will be one.
+ *
+ *	If @sp_bvecs is true, the caller must make sure number of singlepage
+ *	bvecs is less than maximum bvec count.
+ *
  */
-struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
-			     struct bio_set *bs)
+struct bio *__bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
+			       struct bio_set *bs, bool sp_bvecs)
 {
 	struct bvec_iter iter;
 	struct bio_vec bv;
 	struct bio *bio;
+	unsigned segs;
 
 	/*
 	 * Pre immutable biovecs, __bio_clone() used to just do a memcpy from
@@ -663,7 +669,12 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
 	 *    __bio_clone_fast() anyways.
 	 */
 
-	bio = bio_alloc_bioset(gfp_mask, bio_segments(bio_src), bs);
+	if (sp_bvecs)
+		segs = bio_segments(bio_src);
+	else
+		segs = bio_segments_mp(bio_src);
+
+	bio = bio_alloc_bioset(gfp_mask, segs, bs);
 	if (!bio)
 		return NULL;
 	bio->bi_bdev		= bio_src->bi_bdev;
@@ -680,8 +691,12 @@ 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:
-		bio_for_each_segment(bv, bio_src, iter)
-			bio->bi_io_vec[bio->bi_vcnt++] = bv;
+		if (sp_bvecs)
+			bio_for_each_segment(bv, bio_src, iter)
+				bio->bi_io_vec[bio->bi_vcnt++] = bv;
+		else
+			bio_for_each_segment_mp(bv, bio_src, iter)
+				bio->bi_io_vec[bio->bi_vcnt++] = bv;
 		break;
 	}
 
@@ -699,7 +714,7 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
 
 	return bio;
 }
-EXPORT_SYMBOL(bio_clone_bioset);
+EXPORT_SYMBOL(__bio_clone_bioset);
 
 /**
  *	bio_add_pc_page	-	attempt to add page to bio
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 2bd4e6f2087a..0f2859f96468 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -219,7 +219,7 @@ static inline void bio_advance_iter_mp(struct bio *bio, struct bvec_iter *iter,
 
 #define bio_iter_last(bvec, iter) ((iter).bi_size == (bvec).bv_len)
 
-static inline unsigned bio_segments(struct bio *bio)
+static inline unsigned __bio_segments(struct bio *bio, bool mp)
 {
 	unsigned segs = 0;
 	struct bio_vec bv;
@@ -241,12 +241,26 @@ static inline unsigned bio_segments(struct bio *bio)
 		break;
 	}
 
-	bio_for_each_segment(bv, bio, iter)
-		segs++;
+	if (!mp)
+		bio_for_each_segment(bv, bio, iter)
+			segs++;
+	else
+		bio_for_each_segment_mp(bv, bio, iter)
+			segs++;
 
 	return segs;
 }
 
+static inline unsigned bio_segments(struct bio *bio)
+{
+	return __bio_segments(bio, false);
+}
+
+static inline unsigned bio_segments_mp(struct bio *bio)
+{
+	return __bio_segments(bio, true);
+}
+
 /*
  * get a reference to a bio, so it won't disappear. the intended use is
  * something like:
@@ -419,10 +433,24 @@ 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_bioset(struct bio *, gfp_t,
+				      struct bio_set *bs, bool);
 
 extern struct bio_set *fs_bio_set;
 
+/* at default we clone bio with multipage bvecs */
+static inline struct bio *bio_clone_bioset(struct bio *bio, gfp_t gfp,
+					   struct bio_set *bs)
+{
+	return __bio_clone_bioset(bio, gfp, bs, false);
+}
+
+static inline struct bio *bio_clone_bioset_sp(struct bio *bio, gfp_t gfp,
+					      struct bio_set *bs)
+{
+	return __bio_clone_bioset(bio, gfp, bs, true);
+}
+
 static inline struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
 {
 	return bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
@@ -433,6 +461,12 @@ static inline struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
 	return bio_clone_bioset(bio, gfp_mask, fs_bio_set);
 }
 
+/* Sometimes we have to clone one bio with singlepage bvec */
+static inline struct bio *bio_clone_sp(struct bio *bio, gfp_t gfp_mask)
+{
+	return __bio_clone_bioset(bio, gfp_mask, fs_bio_set, true);
+}
+
 static inline struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs)
 {
 	return bio_alloc_bioset(gfp_mask, nr_iovecs, NULL);
-- 
2.7.4

  parent reply	other threads:[~2016-12-27 16:13 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1482854250-13481-1-git-send-email-tom.leiming@gmail.com>
2016-12-27 15:55 ` [PATCH v1 01/54] block: drbd: comment on direct access bvec table Ming Lei
2016-12-27 15:55 ` [PATCH v1 02/54] block: loop: comment on direct access to " Ming Lei
2016-12-27 15:55 ` [PATCH v1 03/54] kernel/power/swap.c: " Ming Lei
2016-12-27 15:55 ` [PATCH v1 04/54] mm: page_io.c: " Ming Lei
2016-12-27 15:55 ` [PATCH v1 05/54] fs/buffer: " Ming Lei
2016-12-27 15:55 ` [PATCH v1 06/54] f2fs: f2fs_read_end_io: " Ming Lei
2016-12-27 15:55 ` [PATCH v1 07/54] bcache: " Ming Lei
2016-12-30 16:56   ` Coly Li
2016-12-27 15:55 ` [PATCH v1 08/54] block: comment on bio_alloc_pages() Ming Lei
2016-12-30 10:40   ` Coly Li
2016-12-30 11:06   ` Coly Li
2016-12-27 15:55 ` [PATCH v1 09/54] block: comment on bio_iov_iter_get_pages() Ming Lei
2016-12-27 15:55 ` [PATCH v1 10/54] block: introduce flag QUEUE_FLAG_NO_MP Ming Lei
2016-12-27 15:56 ` [PATCH v1 11/54] md: set NO_MP for request queue of md Ming Lei
2016-12-27 15:56 ` [PATCH v1 12/54] dm: limit the max bio size as BIO_MAX_PAGES * PAGE_SIZE Ming Lei
2017-01-03 16:43   ` Mike Snitzer
2017-01-06  3:30     ` Ming Lei
2016-12-27 15:56 ` [PATCH v1 13/54] block: comments on bio_for_each_segment[_all] Ming Lei
2016-12-27 15:56 ` [PATCH v1 14/54] block: introduce multipage/single page bvec helpers Ming Lei
2016-12-27 15:56 ` [PATCH v1 15/54] block: implement sp version of bvec iterator helpers Ming Lei
2016-12-27 15:56 ` [PATCH v1 16/54] block: introduce bio_for_each_segment_mp() Ming Lei
2016-12-27 15:56 ` Ming Lei [this message]
2016-12-27 15:56 ` [PATCH v1 18/54] bvec_iter: introduce BVEC_ITER_ALL_INIT Ming Lei
2016-12-27 15:56 ` [PATCH v1 19/54] block: bounce: avoid direct access to bvec table Ming Lei
2016-12-27 15:56 ` [PATCH v1 20/54] block: bounce: don't access bio->bi_io_vec in copy_to_high_bio_irq Ming Lei
2016-12-27 15:56 ` [PATCH v1 21/54] block: introduce bio_can_convert_to_sp() Ming Lei
2016-12-27 15:56 ` [PATCH v1 22/54] block: bounce: convert multipage bvecs into singlepage Ming Lei
2016-12-27 15:56 ` [PATCH v1 23/54] bcache: handle bio_clone() & bvec updating for multipage bvecs Ming Lei
2016-12-30 11:01   ` Coly Li
2016-12-31 10:29     ` Ming Lei
2016-12-27 15:56 ` [PATCH v1 24/54] blk-merge: compute bio->bi_seg_front_size efficiently Ming Lei
2016-12-27 15:56 ` [PATCH v1 25/54] block: blk-merge: try to make front segments in full size Ming Lei
2016-12-27 15:56 ` [PATCH v1 26/54] block: blk-merge: remove unnecessary check Ming Lei
2016-12-27 15:56 ` [PATCH v1 27/54] block: use bio_for_each_segment_mp() to compute segments count Ming Lei
2016-12-27 15:56 ` [PATCH v1 28/54] block: use bio_for_each_segment_mp() to map sg Ming Lei
2016-12-27 15:56 ` [PATCH v1 29/54] block: introduce bvec_for_each_sp_bvec() Ming Lei
2016-12-27 15:56 ` [PATCH v1 30/54] block: bio: introduce single/multi page version of bio_for_each_segment_all() Ming Lei
2016-12-27 15:56 ` [PATCH v1 31/54] block: introduce bio_segments_all() Ming Lei
2017-01-16  3:19 ` [PATCH v1 00/54] block: support multipage bvec Ming Lei
2017-01-16 15:18   ` Christoph Hellwig
2017-01-17  2:40     ` Ming Lei
2017-01-17  7:50       ` Christoph Hellwig
2017-01-17  8:13         ` Ming Lei

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=1482854250-13481-18-git-send-email-tom.leiming@gmail.com \
    --to=tom.leiming@gmail.com \
    --cc=axboe@fb.com \
    --cc=axboe@kernel.dk \
    --cc=chaitanya.kulkarni@hgst.com \
    --cc=hare@suse.com \
    --cc=hch@infradead.org \
    --cc=kent.overstreet@gmail.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mchristi@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).