From: Ming Lei <tom.leiming@gmail.com>
To: Jens Axboe <axboe@fb.com>, linux-kernel@vger.kernel.org
Cc: linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org,
Christoph Hellwig <hch@infradead.org>,
"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
Ming Lei <tom.leiming@gmail.com>, Jens Axboe <axboe@kernel.dk>,
Mike Christie <mchristi@redhat.com>,
Hannes Reinecke <hare@suse.com>,
Keith Busch <keith.busch@intel.com>,
Mike Snitzer <snitzer@redhat.com>
Subject: [PATCH 34/60] block: introduce bio_clone_sp()
Date: Sat, 29 Oct 2016 16:08:33 +0800 [thread overview]
Message-ID: <1477728600-12938-35-git-send-email-tom.leiming@gmail.com> (raw)
In-Reply-To: <1477728600-12938-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 a49d1d89a85c..a9bf01784f37 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -626,16 +626,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
@@ -659,7 +665,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;
@@ -675,8 +686,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;
}
@@ -694,7 +709,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 17852ba0e40f..ec1c0f2aaa19 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -217,7 +217,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;
@@ -237,12 +237,26 @@ static inline unsigned bio_segments(struct bio *bio)
if (bio_op(bio) == REQ_OP_WRITE_SAME)
return 1;
- 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:
@@ -415,10 +429,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);
@@ -429,6 +457,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
next prev parent reply other threads:[~2016-10-29 8:14 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1477728600-12938-1-git-send-email-tom.leiming@gmail.com>
2016-10-29 8:08 ` [PATCH 01/60] block: bio: introduce bio_init_with_vec_table() Ming Lei
2016-10-29 15:21 ` Christoph Hellwig
2016-10-29 8:08 ` [PATCH 02/60] block drivers: convert to bio_init_with_vec_table() Ming Lei
2016-10-29 8:08 ` [PATCH 03/60] block: drbd: remove impossible failure handling Ming Lei
2016-10-31 15:25 ` Christoph Hellwig
2016-10-29 8:08 ` [PATCH 04/60] block: floppy: use bio_add_page() Ming Lei
2016-10-31 15:26 ` Christoph Hellwig
2016-10-31 22:54 ` Ming Lei
2016-10-29 8:08 ` [PATCH 05/60] target: avoid to access .bi_vcnt directly Ming Lei
2016-10-31 15:26 ` Christoph Hellwig
2016-10-29 8:08 ` [PATCH 06/60] bcache: debug: avoid to access .bi_io_vec directly Ming Lei
2016-10-29 8:08 ` [PATCH 07/60] dm: crypt: use bio_add_page() Ming Lei
2016-10-29 8:08 ` [PATCH 08/60] dm: use bvec iterator helpers to implement .get_page and .next_page Ming Lei
2016-10-29 8:08 ` [PATCH 09/60] dm: dm.c: replace 'bio->bi_vcnt == 1' with !bio_multiple_segments Ming Lei
2016-10-31 15:29 ` Christoph Hellwig
2016-10-31 22:59 ` Ming Lei
2016-11-02 3:09 ` Kent Overstreet
2016-11-02 7:56 ` Ming Lei
2016-11-02 14:24 ` Mike Snitzer
2016-11-02 23:47 ` Ming Lei
2016-10-29 8:08 ` [PATCH 10/60] fs: logfs: convert to bio_add_page() in sync_request() Ming Lei
2016-10-29 8:08 ` [PATCH 11/60] fs: logfs: use bio_add_page() in __bdev_writeseg() Ming Lei
2016-10-31 15:29 ` Christoph Hellwig
2016-10-29 8:08 ` [PATCH 12/60] fs: logfs: use bio_add_page() in do_erase() Ming Lei
2016-10-31 15:29 ` Christoph Hellwig
2016-10-29 8:08 ` [PATCH 13/60] fs: logfs: remove unnecesary check Ming Lei
2016-10-31 15:29 ` Christoph Hellwig
2016-10-29 8:08 ` [PATCH 14/60] block: drbd: comment on direct access bvec table Ming Lei
2016-10-29 8:08 ` [PATCH 15/60] block: loop: comment on direct access to " Ming Lei
2016-10-31 15:31 ` Christoph Hellwig
2016-10-31 23:08 ` Ming Lei
2016-10-29 8:08 ` [PATCH 16/60] block: pktcdvd: " Ming Lei
2016-10-31 15:33 ` Christoph Hellwig
2016-10-31 23:08 ` Ming Lei
2016-10-29 8:08 ` [PATCH 17/60] kernel/power/swap.c: " Ming Lei
2016-10-29 8:08 ` [PATCH 18/60] mm: page_io.c: " Ming Lei
2016-10-29 8:08 ` [PATCH 19/60] fs/buffer: " Ming Lei
2016-10-31 15:35 ` Christoph Hellwig
2016-10-31 23:12 ` Ming Lei
2016-10-29 8:08 ` [PATCH 20/60] f2fs: f2fs_read_end_io: " Ming Lei
2016-10-29 8:08 ` [PATCH 21/60] bcache: " Ming Lei
2016-10-29 8:08 ` [PATCH 22/60] block: comment on bio_alloc_pages() Ming Lei
2016-10-29 8:08 ` [PATCH 23/60] block: introduce flag QUEUE_FLAG_NO_MP Ming Lei
2016-10-29 15:29 ` Christoph Hellwig
2016-10-29 22:20 ` Ming Lei
2016-10-29 8:08 ` [PATCH 24/60] md: set NO_MP for request queue of md Ming Lei
2016-10-29 8:08 ` [PATCH 25/60] block: pktcdvd: set NO_MP for pktcdvd request queue Ming Lei
2016-10-29 8:08 ` [PATCH 26/60] btrfs: set NO_MP for request queues behind BTRFS Ming Lei
2016-10-31 15:36 ` Christoph Hellwig
2016-10-31 17:58 ` Chris Mason
2016-10-31 18:00 ` Christoph Hellwig
2016-10-29 8:08 ` [PATCH 27/60] block: introduce BIO_SP_MAX_SECTORS Ming Lei
2016-10-29 8:08 ` [PATCH 28/60] block: introduce QUEUE_FLAG_SPLIT_MP Ming Lei
2016-10-31 15:39 ` Christoph Hellwig
2016-10-31 23:56 ` Ming Lei
2016-11-02 3:08 ` Kent Overstreet
2016-11-03 10:38 ` Ming Lei
2016-11-03 11:20 ` Kent Overstreet
2016-11-03 11:26 ` Ming Lei
2016-11-03 11:30 ` Kent Overstreet
2016-10-29 8:08 ` [PATCH 29/60] dm: limit the max bio size as BIO_SP_MAX_SECTORS << SECTOR_SHIFT Ming Lei
2016-10-29 8:08 ` [PATCH 30/60] bcache: set flag of QUEUE_FLAG_SPLIT_MP Ming Lei
2016-10-29 8:08 ` [PATCH 31/60] block: introduce multipage/single page bvec helpers Ming Lei
2016-10-29 8:08 ` [PATCH 32/60] block: implement sp version of bvec iterator helpers Ming Lei
2016-10-29 11:06 ` kbuild test robot
2016-12-17 11:38 ` Ming Lei
2016-10-29 8:08 ` [PATCH 33/60] block: introduce bio_for_each_segment_mp() Ming Lei
2016-10-29 8:08 ` Ming Lei [this message]
2016-10-29 8:08 ` [PATCH 35/60] bvec_iter: introduce BVEC_ITER_ALL_INIT Ming Lei
2016-10-29 8:08 ` [PATCH 36/60] block: bounce: avoid direct access to bvec from bio->bi_io_vec Ming Lei
2016-10-29 8:08 ` [PATCH 37/60] block: bounce: don't access bio->bi_io_vec in copy_to_high_bio_irq Ming Lei
2016-10-29 8:08 ` [PATCH 38/60] block: bounce: convert multipage bvecs into singlepage Ming Lei
2016-10-29 8:08 ` [PATCH 39/60] bcache: debug: switch to bio_clone_sp() Ming Lei
2016-10-29 8:08 ` [PATCH 40/60] blk-merge: compute bio->bi_seg_front_size efficiently Ming Lei
2016-10-29 8:08 ` [PATCH 41/60] block: blk-merge: try to make front segments in full size Ming Lei
2016-10-29 8:08 ` [PATCH 42/60] block: use bio_for_each_segment_mp() to compute segments count Ming Lei
2016-10-29 8:08 ` [PATCH 43/60] block: use bio_for_each_segment_mp() to map sg Ming Lei
2016-10-29 8:08 ` [PATCH 44/60] block: introduce bvec_for_each_sp_bvec() Ming Lei
2016-10-29 8:08 ` [PATCH 45/60] block: bio: introduce bio_for_each_segment_all_rd() and its write pair Ming Lei
2016-10-31 13:59 ` Theodore Ts'o
2016-10-31 15:11 ` Christoph Hellwig
2016-10-31 22:50 ` Ming Lei
2016-11-02 3:01 ` Kent Overstreet
2016-10-31 22:46 ` Ming Lei
2016-10-31 23:51 ` Ming Lei
2016-11-01 14:17 ` Theodore Ts'o
2016-11-02 1:58 ` Ming Lei
2016-10-29 8:08 ` [PATCH 46/60] block: deal with dirtying pages for multipage bvec Ming Lei
2016-10-31 15:40 ` Christoph Hellwig
2016-11-01 0:19 ` Ming Lei
2016-10-29 8:08 ` [PATCH 47/60] block: convert to bio_for_each_segment_all_rd() Ming Lei
2016-10-29 8:08 ` [PATCH 48/60] fs/mpage: " Ming Lei
2016-10-29 8:08 ` [PATCH 49/60] fs/direct-io: " Ming Lei
2016-10-29 8:08 ` [PATCH 50/60] ext4: " Ming Lei
2016-10-29 8:08 ` [PATCH 51/60] xfs: " Ming Lei
2016-10-29 8:08 ` [PATCH 52/60] logfs: " Ming Lei
2016-10-29 8:08 ` [PATCH 53/60] gfs2: " Ming Lei
2016-10-29 8:08 ` [PATCH 54/60] f2fs: " Ming Lei
2016-10-29 8:08 ` [PATCH 55/60] exofs: " Ming Lei
2016-10-29 8:08 ` [PATCH 56/60] fs: crypto: " Ming Lei
2016-10-29 8:08 ` [PATCH 57/60] bcache: " Ming Lei
2016-10-29 8:08 ` [PATCH 58/60] dm-crypt: " Ming Lei
2016-10-29 8:08 ` [PATCH 59/60] fs/buffer.c: use bvec iterator to truncate the bio Ming Lei
2016-10-29 8:08 ` [PATCH 60/60] block: enable multipage bvecs 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=1477728600-12938-35-git-send-email-tom.leiming@gmail.com \
--to=tom.leiming@gmail.com \
--cc=axboe@fb.com \
--cc=axboe@kernel.dk \
--cc=hare@suse.com \
--cc=hch@infradead.org \
--cc=keith.busch@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mchristi@redhat.com \
--cc=snitzer@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
Powered by JetHome