From: Ming Lei <ming.lei@redhat.com> To: Jens Axboe <axboe@fb.com>, Christoph Hellwig <hch@infradead.org>, Huang Ying <ying.huang@intel.com>, Andrew Morton <akpm@linux-foundation.org>, Alexander Viro <viro@zeniv.linux.org.uk> Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Ming Lei <ming.lei@redhat.com> Subject: [PATCH v3 24/49] block: use bio_for_each_segment_mp() to compute segments count Date: Tue, 8 Aug 2017 16:45:23 +0800 [thread overview] Message-ID: <20170808084548.18963-25-ming.lei@redhat.com> (raw) In-Reply-To: <20170808084548.18963-1-ming.lei@redhat.com> Firstly it is more efficient to use bio_for_each_segment_mp() in both blk_bio_segment_split() and __blk_recalc_rq_segments() to compute how many segments there are in the bio. Secondaly once bio_for_each_segment_mp() is used, the bvec may need to be splitted because its length can be very long and more than max segment size, so we have to support to split one bvec into several segments. Thirdly during splitting mp bvec into segments, max segment number may be reached, then the bio need to be splitted when this happens. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- block/blk-merge.c | 97 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 79 insertions(+), 18 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index ac217fce4921..c9b300f91fba 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -96,6 +96,62 @@ static inline unsigned get_max_io_size(struct request_queue *q, return sectors; } +/* + * Split the bvec @bv into segments, and update all kinds of + * variables. + */ +static bool bvec_split_segs(struct request_queue *q, struct bio_vec *bv, + unsigned *nsegs, unsigned *last_seg_size, + unsigned *front_seg_size, unsigned *sectors) +{ + bool need_split = false; + unsigned len = bv->bv_len; + unsigned total_len = 0; + unsigned new_nsegs = 0, seg_size = 0; + + if ((*nsegs >= queue_max_segments(q)) || !len) + return need_split; + + /* + * Multipage bvec may be too big to hold in one segment, + * so the current bvec has to be splitted as multiple + * segments. + */ + while (new_nsegs + *nsegs < queue_max_segments(q)) { + seg_size = min(queue_max_segment_size(q), len); + + new_nsegs++; + total_len += seg_size; + len -= seg_size; + + if ((queue_virt_boundary(q) && ((bv->bv_offset + + total_len) & queue_virt_boundary(q))) || !len) + break; + } + + /* split in the middle of the bvec */ + if (len) + need_split = true; + + /* update front segment size */ + if (!*nsegs) { + unsigned first_seg_size = seg_size; + + if (new_nsegs > 1) + first_seg_size = queue_max_segment_size(q); + if (*front_seg_size < first_seg_size) + *front_seg_size = first_seg_size; + } + + /* update other varibles */ + *last_seg_size = seg_size; + *nsegs += new_nsegs; + if (sectors) + *sectors += total_len >> 9; + + return need_split; +} + static struct bio *blk_bio_segment_split(struct request_queue *q, struct bio *bio, struct bio_set *bs, @@ -110,7 +166,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, const unsigned max_sectors = get_max_io_size(q, bio); unsigned advance = 0; - bio_for_each_segment(bv, bio, iter) { + bio_for_each_segment_mp(bv, bio, iter) { /* * If the queue doesn't support SG gaps and adding this * offset would create a gap, disallow it. @@ -125,8 +181,12 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, */ if (nsegs < queue_max_segments(q) && sectors < max_sectors) { - nsegs++; - sectors = max_sectors; + /* split in the middle of bvec */ + bv.bv_len = (max_sectors - sectors) << 9; + bvec_split_segs(q, &bv, &nsegs, + &seg_size, + &front_seg_size, + §ors); } goto split; } @@ -138,10 +198,9 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, goto new_segment; if (seg_size + bv.bv_len > queue_max_segment_size(q)) { /* - * On assumption is that initial value of - * @seg_size(equals to bv.bv_len) won't be - * bigger than max segment size, but will - * becomes false after multipage bvec comes. + * The initial value of @seg_size won't be + * bigger than max segment size, because we + * split the bvec via bvec_split_segs(). */ advance = queue_max_segment_size(q) - seg_size; @@ -173,11 +232,12 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, if (nsegs == 1 && seg_size > front_seg_size) front_seg_size = seg_size; - nsegs++; bvprv = bv; bvprvp = &bvprv; - seg_size = bv.bv_len; - sectors += bv.bv_len >> 9; + + if (bvec_split_segs(q, &bv, &nsegs, &seg_size, + &front_seg_size, §ors)) + goto split; /* restore the bvec for iterator */ if (advance) { @@ -251,6 +311,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio_vec bv, bvprv = { NULL }; int cluster, prev = 0; unsigned int seg_size, nr_phys_segs; + unsigned front_seg_size = bio->bi_seg_front_size; struct bio *fbio, *bbio; struct bvec_iter iter; @@ -271,7 +332,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, seg_size = 0; nr_phys_segs = 0; for_each_bio(bio) { - bio_for_each_segment(bv, bio, iter) { + bio_for_each_segment_mp(bv, bio, iter) { /* * If SG merging is disabled, each bio vector is * a segment @@ -293,20 +354,20 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, continue; } new_segment: - if (nr_phys_segs == 1 && seg_size > - fbio->bi_seg_front_size) - fbio->bi_seg_front_size = seg_size; + if (nr_phys_segs == 1 && seg_size > front_seg_size) + front_seg_size = seg_size; - nr_phys_segs++; bvprv = bv; prev = 1; - seg_size = bv.bv_len; + bvec_split_segs(q, &bv, &nr_phys_segs, &seg_size, + &front_seg_size, NULL); } bbio = bio; } - if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) - fbio->bi_seg_front_size = seg_size; + if (nr_phys_segs == 1 && seg_size > front_seg_size) + front_seg_size = seg_size; + fbio->bi_seg_front_size = front_seg_size; if (seg_size > bbio->bi_seg_back_size) bbio->bi_seg_back_size = seg_size; -- 2.9.4
WARNING: multiple messages have this Message-ID (diff)
From: Ming Lei <ming.lei@redhat.com> To: Jens Axboe <axboe@fb.com>, Christoph Hellwig <hch@infradead.org>, Huang Ying <ying.huang@intel.com>, Andrew Morton <akpm@linux-foundation.org>, Alexander Viro <viro@zeniv.linux.org.uk> Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, Ming Lei <ming.lei@redhat.com> Subject: [PATCH v3 24/49] block: use bio_for_each_segment_mp() to compute segments count Date: Tue, 8 Aug 2017 16:45:23 +0800 [thread overview] Message-ID: <20170808084548.18963-25-ming.lei@redhat.com> (raw) In-Reply-To: <20170808084548.18963-1-ming.lei@redhat.com> Firstly it is more efficient to use bio_for_each_segment_mp() in both blk_bio_segment_split() and __blk_recalc_rq_segments() to compute how many segments there are in the bio. Secondaly once bio_for_each_segment_mp() is used, the bvec may need to be splitted because its length can be very long and more than max segment size, so we have to support to split one bvec into several segments. Thirdly during splitting mp bvec into segments, max segment number may be reached, then the bio need to be splitted when this happens. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- block/blk-merge.c | 97 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 79 insertions(+), 18 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index ac217fce4921..c9b300f91fba 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -96,6 +96,62 @@ static inline unsigned get_max_io_size(struct request_queue *q, return sectors; } +/* + * Split the bvec @bv into segments, and update all kinds of + * variables. + */ +static bool bvec_split_segs(struct request_queue *q, struct bio_vec *bv, + unsigned *nsegs, unsigned *last_seg_size, + unsigned *front_seg_size, unsigned *sectors) +{ + bool need_split = false; + unsigned len = bv->bv_len; + unsigned total_len = 0; + unsigned new_nsegs = 0, seg_size = 0; + + if ((*nsegs >= queue_max_segments(q)) || !len) + return need_split; + + /* + * Multipage bvec may be too big to hold in one segment, + * so the current bvec has to be splitted as multiple + * segments. + */ + while (new_nsegs + *nsegs < queue_max_segments(q)) { + seg_size = min(queue_max_segment_size(q), len); + + new_nsegs++; + total_len += seg_size; + len -= seg_size; + + if ((queue_virt_boundary(q) && ((bv->bv_offset + + total_len) & queue_virt_boundary(q))) || !len) + break; + } + + /* split in the middle of the bvec */ + if (len) + need_split = true; + + /* update front segment size */ + if (!*nsegs) { + unsigned first_seg_size = seg_size; + + if (new_nsegs > 1) + first_seg_size = queue_max_segment_size(q); + if (*front_seg_size < first_seg_size) + *front_seg_size = first_seg_size; + } + + /* update other varibles */ + *last_seg_size = seg_size; + *nsegs += new_nsegs; + if (sectors) + *sectors += total_len >> 9; + + return need_split; +} + static struct bio *blk_bio_segment_split(struct request_queue *q, struct bio *bio, struct bio_set *bs, @@ -110,7 +166,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, const unsigned max_sectors = get_max_io_size(q, bio); unsigned advance = 0; - bio_for_each_segment(bv, bio, iter) { + bio_for_each_segment_mp(bv, bio, iter) { /* * If the queue doesn't support SG gaps and adding this * offset would create a gap, disallow it. @@ -125,8 +181,12 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, */ if (nsegs < queue_max_segments(q) && sectors < max_sectors) { - nsegs++; - sectors = max_sectors; + /* split in the middle of bvec */ + bv.bv_len = (max_sectors - sectors) << 9; + bvec_split_segs(q, &bv, &nsegs, + &seg_size, + &front_seg_size, + §ors); } goto split; } @@ -138,10 +198,9 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, goto new_segment; if (seg_size + bv.bv_len > queue_max_segment_size(q)) { /* - * On assumption is that initial value of - * @seg_size(equals to bv.bv_len) won't be - * bigger than max segment size, but will - * becomes false after multipage bvec comes. + * The initial value of @seg_size won't be + * bigger than max segment size, because we + * split the bvec via bvec_split_segs(). */ advance = queue_max_segment_size(q) - seg_size; @@ -173,11 +232,12 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, if (nsegs == 1 && seg_size > front_seg_size) front_seg_size = seg_size; - nsegs++; bvprv = bv; bvprvp = &bvprv; - seg_size = bv.bv_len; - sectors += bv.bv_len >> 9; + + if (bvec_split_segs(q, &bv, &nsegs, &seg_size, + &front_seg_size, §ors)) + goto split; /* restore the bvec for iterator */ if (advance) { @@ -251,6 +311,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio_vec bv, bvprv = { NULL }; int cluster, prev = 0; unsigned int seg_size, nr_phys_segs; + unsigned front_seg_size = bio->bi_seg_front_size; struct bio *fbio, *bbio; struct bvec_iter iter; @@ -271,7 +332,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, seg_size = 0; nr_phys_segs = 0; for_each_bio(bio) { - bio_for_each_segment(bv, bio, iter) { + bio_for_each_segment_mp(bv, bio, iter) { /* * If SG merging is disabled, each bio vector is * a segment @@ -293,20 +354,20 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, continue; } new_segment: - if (nr_phys_segs == 1 && seg_size > - fbio->bi_seg_front_size) - fbio->bi_seg_front_size = seg_size; + if (nr_phys_segs == 1 && seg_size > front_seg_size) + front_seg_size = seg_size; - nr_phys_segs++; bvprv = bv; prev = 1; - seg_size = bv.bv_len; + bvec_split_segs(q, &bv, &nr_phys_segs, &seg_size, + &front_seg_size, NULL); } bbio = bio; } - if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) - fbio->bi_seg_front_size = seg_size; + if (nr_phys_segs == 1 && seg_size > front_seg_size) + front_seg_size = seg_size; + fbio->bi_seg_front_size = front_seg_size; if (seg_size > bbio->bi_seg_back_size) bbio->bi_seg_back_size = seg_size; -- 2.9.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2017-08-08 8:50 UTC|newest] Thread overview: 160+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-08-08 8:44 [PATCH v3 00/49] block: support multipage bvec Ming Lei 2017-08-08 8:44 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 01/49] block: drbd: comment on direct access bvec table Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 11:12 ` Christoph Hellwig 2017-08-10 11:12 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 02/49] block: loop: comment on direct access to " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 03/49] kernel/power/swap.c: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 04/49] mm: page_io.c: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 11:14 ` Christoph Hellwig 2017-08-10 11:14 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 05/49] fs/buffer: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 11:16 ` Christoph Hellwig 2017-08-10 11:16 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 06/49] f2fs: f2fs_read_end_io: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 07/49] bcache: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 12:36 ` Coly Li 2017-08-08 12:36 ` Coly Li 2017-08-08 12:36 ` Coly Li 2017-08-10 11:26 ` Christoph Hellwig 2017-08-10 11:26 ` Christoph Hellwig 2017-10-19 22:51 ` Ming Lei 2017-10-19 22:51 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 08/49] block: comment on bio_alloc_pages() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 09/49] block: comment on bio_iov_iter_get_pages() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 11:28 ` Christoph Hellwig 2017-08-10 11:28 ` Christoph Hellwig 2017-10-19 22:55 ` Ming Lei 2017-10-19 22:55 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 10/49] dm: limit the max bio size as BIO_MAX_PAGES * PAGE_SIZE Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 11:29 ` Christoph Hellwig 2017-08-10 11:29 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 11/49] btrfs: avoid access to .bi_vcnt directly Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 11:29 ` Christoph Hellwig 2017-08-10 11:29 ` Christoph Hellwig 2017-10-19 22:57 ` Ming Lei 2017-10-19 22:57 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 12/49] btrfs: avoid to access bvec table directly for a cloned bio Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 13/49] btrfs: comment on direct access bvec table Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 14/49] block: bounce: avoid direct access to " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 15/49] bvec_iter: introduce BVEC_ITER_ALL_INIT Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 16/49] block: bounce: don't access bio->bi_io_vec in copy_to_high_bio_irq Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 17/49] block: comments on bio_for_each_segment[_all] Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 11:32 ` Christoph Hellwig 2017-08-10 11:32 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 18/49] block: introduce multipage/single page bvec helpers Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 12:00 ` Christoph Hellwig 2017-08-10 12:00 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 19/49] block: implement sp version of bvec iterator helpers Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 12:01 ` Christoph Hellwig 2017-08-10 12:01 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 20/49] block: introduce bio_for_each_segment_mp() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 12:11 ` Christoph Hellwig 2017-08-10 12:11 ` Christoph Hellwig 2017-10-19 23:37 ` Ming Lei 2017-10-19 23:37 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 21/49] blk-merge: compute bio->bi_seg_front_size efficiently Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 12:11 ` Christoph Hellwig 2017-08-10 12:11 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 22/49] block: blk-merge: try to make front segments in full size Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 12:12 ` Christoph Hellwig 2017-08-10 12:12 ` Christoph Hellwig 2017-08-08 8:45 ` [PATCH v3 23/49] block: blk-merge: remove unnecessary check Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 12:12 ` Christoph Hellwig 2017-08-10 12:12 ` Christoph Hellwig 2017-08-08 8:45 ` Ming Lei [this message] 2017-08-08 8:45 ` [PATCH v3 24/49] block: use bio_for_each_segment_mp() to compute segments count Ming Lei 2017-08-08 8:45 ` [PATCH v3 25/49] block: use bio_for_each_segment_mp() to map sg Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 26/49] block: introduce bvec_for_each_sp_bvec() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 27/49] block: bio: introduce single/multi page version of bio_for_each_segment_all() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 28/49] block: introduce bvec_get_last_page() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 29/49] fs/buffer.c: use bvec iterator to truncate the bio Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 30/49] btrfs: use bvec_get_last_page to get bio's last page Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 31/49] block: deal with dirtying pages for multipage bvec Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 32/49] block: convert to singe/multi page version of bio_for_each_segment_all() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 33/49] bcache: convert to bio_for_each_segment_all_sp() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 12:35 ` Coly Li 2017-08-08 12:35 ` Coly Li 2017-08-08 12:35 ` Coly Li 2017-08-08 8:45 ` [PATCH v3 34/49] md: raid1: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 35/49] dm-crypt: don't clear bvec->bv_page in crypt_free_buffer_pages() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 36/49] dm-crypt: convert to bio_for_each_segment_all_sp() Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 37/49] fs/mpage: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-10 12:16 ` Christoph Hellwig 2017-08-10 12:16 ` Christoph Hellwig 2017-10-19 23:58 ` Ming Lei 2017-10-19 23:58 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 38/49] fs/block: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 39/49] fs/iomap: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 40/49] ext4: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 41/49] xfs: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 16:32 ` Darrick J. Wong 2017-08-08 16:32 ` Darrick J. Wong 2017-10-19 23:52 ` Ming Lei 2017-10-19 23:52 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 42/49] gfs2: " Ming Lei 2017-08-08 8:45 ` [Cluster-devel] " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 43/49] f2fs: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 44/49] exofs: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 45/49] fs: crypto: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 46/49] fs/btrfs: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 9:00 ` Filipe Manana 2017-08-08 9:00 ` Filipe Manana 2017-08-08 9:00 ` Filipe Manana 2017-08-11 16:54 ` kbuild test robot 2017-08-11 16:54 ` kbuild test robot 2017-08-08 8:45 ` [PATCH v3 47/49] fs/direct-io: " Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-08 8:45 ` [PATCH v3 48/49] block: enable multipage bvecs Ming Lei 2017-08-08 8:45 ` Ming Lei 2017-08-18 1:24 ` [lkp-robot] [block] 434f2ea20d: fileio.requests_per_sec -3.1% regression kernel test robot 2017-08-18 1:24 ` kernel test robot 2017-08-18 1:24 ` kernel test robot 2017-08-18 1:24 ` kernel test robot 2017-08-08 8:45 ` [PATCH v3 49/49] block: bio: pass segments to bio if bio_add_page() is bypassed Ming Lei 2017-08-08 8:45 ` 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=20170808084548.18963-25-ming.lei@redhat.com \ --to=ming.lei@redhat.com \ --cc=akpm@linux-foundation.org \ --cc=axboe@fb.com \ --cc=hch@infradead.org \ --cc=linux-block@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mm@kvack.org \ --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: linkBe 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.