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>, Alasdair Kergon <agk@redhat.com>, Mike Snitzer <snitzer@redhat.com>, "maintainer:DEVICE-MAPPER LVM" <dm-devel@redhat.com>, Shaohua Li <shli@kernel.org>, "open list:SOFTWARE RAID Multiple Disks SUPPORT" <linux-raid@vger.kernel.org> Subject: [PATCH 08/60] dm: use bvec iterator helpers to implement .get_page and .next_page Date: Sat, 29 Oct 2016 16:08:07 +0800 [thread overview] Message-ID: <1477728600-12938-9-git-send-email-tom.leiming@gmail.com> (raw) In-Reply-To: <1477728600-12938-1-git-send-email-tom.leiming@gmail.com> Firstly we have mature bvec/bio iterator helper for iterate each page in one bio, not necessary to reinvent a wheel to do that. Secondly the coming multipage bvecs requires this patch. Also add comments about the direct access to bvec table. Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- drivers/md/dm-io.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 0bf1a12e35fe..2ef573c220fc 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -162,7 +162,10 @@ struct dpages { struct page **p, unsigned long *len, unsigned *offset); void (*next_page)(struct dpages *dp); - unsigned context_u; + union { + unsigned context_u; + struct bvec_iter context_bi; + }; void *context_ptr; void *vma_invalidate_address; @@ -204,25 +207,36 @@ static void list_dp_init(struct dpages *dp, struct page_list *pl, unsigned offse static void bio_get_page(struct dpages *dp, struct page **p, unsigned long *len, unsigned *offset) { - struct bio_vec *bvec = dp->context_ptr; - *p = bvec->bv_page; - *len = bvec->bv_len - dp->context_u; - *offset = bvec->bv_offset + dp->context_u; + struct bio_vec bv = bvec_iter_bvec((struct bio_vec *)dp->context_ptr, + dp->context_bi); + + *p = bv.bv_page; + *len = bv.bv_len; + *offset = bv.bv_offset; + + /* avoid to figure out it in bio_next_page() again */ + dp->context_bi.bi_sector = (sector_t)bv.bv_len; } static void bio_next_page(struct dpages *dp) { - struct bio_vec *bvec = dp->context_ptr; - dp->context_ptr = bvec + 1; - dp->context_u = 0; + unsigned int len = (unsigned int)dp->context_bi.bi_sector; + + bvec_iter_advance((struct bio_vec *)dp->context_ptr, + &dp->context_bi, len); } static void bio_dp_init(struct dpages *dp, struct bio *bio) { dp->get_page = bio_get_page; dp->next_page = bio_next_page; - dp->context_ptr = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); - dp->context_u = bio->bi_iter.bi_bvec_done; + + /* + * We just use bvec iterator to retrieve pages, so it is ok to + * access the bvec table directly here + */ + dp->context_ptr = bio->bi_io_vec; + dp->context_bi = bio->bi_iter; } /* -- 2.7.4
WARNING: multiple messages have this Message-ID (diff)
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>, Alasdair Kergon <agk@redhat.com>, Mike Snitzer <snitzer@redhat.com>, dm-devel@redhat.com (maintainer:DEVICE-MAPPER (LVM)), Shaohua Li <shli@kernel.org>, linux-raid@vger.kernel.org (open list:SOFTWARE RAID (Multiple Disks) SUPPORT) Subject: [PATCH 08/60] dm: use bvec iterator helpers to implement .get_page and .next_page Date: Sat, 29 Oct 2016 16:08:07 +0800 [thread overview] Message-ID: <1477728600-12938-9-git-send-email-tom.leiming@gmail.com> (raw) In-Reply-To: <1477728600-12938-1-git-send-email-tom.leiming@gmail.com> Firstly we have mature bvec/bio iterator helper for iterate each page in one bio, not necessary to reinvent a wheel to do that. Secondly the coming multipage bvecs requires this patch. Also add comments about the direct access to bvec table. Signed-off-by: Ming Lei <tom.leiming@gmail.com> --- drivers/md/dm-io.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c index 0bf1a12e35fe..2ef573c220fc 100644 --- a/drivers/md/dm-io.c +++ b/drivers/md/dm-io.c @@ -162,7 +162,10 @@ struct dpages { struct page **p, unsigned long *len, unsigned *offset); void (*next_page)(struct dpages *dp); - unsigned context_u; + union { + unsigned context_u; + struct bvec_iter context_bi; + }; void *context_ptr; void *vma_invalidate_address; @@ -204,25 +207,36 @@ static void list_dp_init(struct dpages *dp, struct page_list *pl, unsigned offse static void bio_get_page(struct dpages *dp, struct page **p, unsigned long *len, unsigned *offset) { - struct bio_vec *bvec = dp->context_ptr; - *p = bvec->bv_page; - *len = bvec->bv_len - dp->context_u; - *offset = bvec->bv_offset + dp->context_u; + struct bio_vec bv = bvec_iter_bvec((struct bio_vec *)dp->context_ptr, + dp->context_bi); + + *p = bv.bv_page; + *len = bv.bv_len; + *offset = bv.bv_offset; + + /* avoid to figure out it in bio_next_page() again */ + dp->context_bi.bi_sector = (sector_t)bv.bv_len; } static void bio_next_page(struct dpages *dp) { - struct bio_vec *bvec = dp->context_ptr; - dp->context_ptr = bvec + 1; - dp->context_u = 0; + unsigned int len = (unsigned int)dp->context_bi.bi_sector; + + bvec_iter_advance((struct bio_vec *)dp->context_ptr, + &dp->context_bi, len); } static void bio_dp_init(struct dpages *dp, struct bio *bio) { dp->get_page = bio_get_page; dp->next_page = bio_next_page; - dp->context_ptr = __bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter); - dp->context_u = bio->bi_iter.bi_bvec_done; + + /* + * We just use bvec iterator to retrieve pages, so it is ok to + * access the bvec table directly here + */ + dp->context_ptr = bio->bi_io_vec; + dp->context_bi = bio->bi_iter; } /* -- 2.7.4
next prev parent reply other threads:[~2016-10-29 8:08 UTC|newest] Thread overview: 148+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-10-29 8:07 [PATCH 00/60] block: support multipage bvec Ming Lei 2016-10-29 8:07 ` [Cluster-devel] " Ming Lei 2016-10-29 8:07 ` Ming Lei 2016-10-29 8:07 ` Ming Lei 2016-10-29 8:07 ` Ming Lei 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 ` 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-11-10 19:35 ` Christoph Hellwig 2016-11-11 8:39 ` Ming Lei 2016-10-29 8:08 ` [PATCH 05/60] target: avoid to access .bi_vcnt directly Ming Lei 2016-10-29 8:08 ` 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 ` Ming Lei 2016-10-29 8:08 ` [PATCH 07/60] dm: crypt: use bio_add_page() Ming Lei 2016-10-29 8:08 ` Ming Lei 2016-10-29 8:08 ` Ming Lei [this message] 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-29 8:08 ` Ming Lei 2016-10-31 15:29 ` Christoph Hellwig 2016-10-31 15:29 ` Christoph Hellwig 2016-10-31 22:59 ` Ming Lei 2016-10-31 22:59 ` Ming Lei 2016-11-02 3:09 ` Kent Overstreet 2016-11-02 3:09 ` Kent Overstreet 2016-11-02 7:56 ` Ming Lei 2016-11-02 7:56 ` Ming Lei 2016-11-02 14:24 ` Mike Snitzer 2016-11-02 14:24 ` Mike Snitzer 2016-11-02 14:24 ` Mike Snitzer 2016-11-02 23:47 ` Ming Lei 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 ` Ming Lei 2016-10-29 8:08 ` [PATCH 18/60] mm: page_io.c: " Ming Lei 2016-10-29 8:08 ` Ming Lei 2016-10-29 8:08 ` 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 ` Ming Lei 2016-10-29 8:08 ` [PATCH 21/60] bcache: " Ming Lei 2016-10-29 8:08 ` Ming Lei 2016-10-29 8:08 ` [PATCH 22/60] block: comment on bio_alloc_pages() Ming Lei 2016-10-29 8:08 ` 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 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 ` 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 ` 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 ` 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-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 ` [PATCH 34/60] block: introduce bio_clone_sp() Ming Lei 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 ` 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 ` 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 ` [Cluster-devel] " Ming Lei 2016-10-29 8:08 ` [PATCH 54/60] f2fs: " Ming Lei 2016-10-29 8:08 ` 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 ` Ming Lei 2016-10-29 8:08 ` [PATCH 58/60] dm-crypt: " Ming Lei 2016-10-29 8:08 ` 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 2016-10-31 15:25 ` [PATCH 00/60] block: support multipage bvec Christoph Hellwig 2016-10-31 15:25 ` [Cluster-devel] " Christoph Hellwig 2016-10-31 15:25 ` Christoph Hellwig 2016-10-31 15:25 ` Christoph Hellwig 2016-10-31 22:52 ` Ming Lei 2016-10-31 22:52 ` [Cluster-devel] " Ming Lei 2016-10-31 22:52 ` 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-9-git-send-email-tom.leiming@gmail.com \ --to=tom.leiming@gmail.com \ --cc=agk@redhat.com \ --cc=axboe@fb.com \ --cc=dm-devel@redhat.com \ --cc=hch@infradead.org \ --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=linux-raid@vger.kernel.org \ --cc=shli@kernel.org \ --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: 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.