From: Ming Lei <ming.lei@redhat.com>
To: Jens Axboe <axboe@fb.com>, Christoph Hellwig <hch@infradead.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
Kent Overstreet <kent.overstreet@gmail.com>
Cc: 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>,
Ming Lei <ming.lei@redhat.com>
Subject: [PATCH V6 18/30] block: convert to bio_for_each_chunk_segment_all()
Date: Sat, 9 Jun 2018 20:30:02 +0800 [thread overview]
Message-ID: <20180609123014.8861-19-ming.lei@redhat.com> (raw)
In-Reply-To: <20180609123014.8861-1-ming.lei@redhat.com>
We have to convert to bio_for_each_chunk_segment_all() for iterating page by
page.
bio_for_each_segment_all() can't be used any more after multipage bvec is
enabled.
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
block/bio.c | 27 ++++++++++++++++++---------
block/blk-zoned.c | 5 +++--
block/bounce.c | 6 ++++--
include/linux/bio.h | 3 ++-
4 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/block/bio.c b/block/bio.c
index 60219f82ddab..276fc35ec559 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1146,8 +1146,9 @@ static int bio_copy_from_iter(struct bio *bio, struct iov_iter *iter)
{
int i;
struct bio_vec *bvec;
+ struct bvec_chunk_iter citer;
- bio_for_each_segment_all(bvec, bio, i) {
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer) {
ssize_t ret;
ret = copy_page_from_iter(bvec->bv_page,
@@ -1177,8 +1178,9 @@ static int bio_copy_to_iter(struct bio *bio, struct iov_iter iter)
{
int i;
struct bio_vec *bvec;
+ struct bvec_chunk_iter citer;
- bio_for_each_segment_all(bvec, bio, i) {
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer) {
ssize_t ret;
ret = copy_page_to_iter(bvec->bv_page,
@@ -1200,8 +1202,9 @@ void bio_free_pages(struct bio *bio)
{
struct bio_vec *bvec;
int i;
+ struct bvec_chunk_iter citer;
- bio_for_each_segment_all(bvec, bio, i)
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer)
__free_page(bvec->bv_page);
}
EXPORT_SYMBOL(bio_free_pages);
@@ -1367,6 +1370,7 @@ struct bio *bio_map_user_iov(struct request_queue *q,
struct bio *bio;
int ret;
struct bio_vec *bvec;
+ struct bvec_chunk_iter citer;
if (!iov_iter_count(iter))
return ERR_PTR(-EINVAL);
@@ -1440,7 +1444,7 @@ struct bio *bio_map_user_iov(struct request_queue *q,
return bio;
out_unmap:
- bio_for_each_segment_all(bvec, bio, j) {
+ bio_for_each_chunk_segment_all(bvec, bio, j, citer) {
put_page(bvec->bv_page);
}
bio_put(bio);
@@ -1451,11 +1455,12 @@ static void __bio_unmap_user(struct bio *bio)
{
struct bio_vec *bvec;
int i;
+ struct bvec_chunk_iter citer;
/*
* make sure we dirty pages we wrote to
*/
- bio_for_each_segment_all(bvec, bio, i) {
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer) {
if (bio_data_dir(bio) == READ)
set_page_dirty_lock(bvec->bv_page);
@@ -1547,8 +1552,9 @@ static void bio_copy_kern_endio_read(struct bio *bio)
char *p = bio->bi_private;
struct bio_vec *bvec;
int i;
+ struct bvec_chunk_iter citer;
- bio_for_each_segment_all(bvec, bio, i) {
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer) {
memcpy(p, page_address(bvec->bv_page), bvec->bv_len);
p += bvec->bv_len;
}
@@ -1657,8 +1663,9 @@ void bio_set_pages_dirty(struct bio *bio)
{
struct bio_vec *bvec;
int i;
+ struct bvec_chunk_iter citer;
- bio_for_each_segment_all(bvec, bio, i) {
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer) {
if (!PageCompound(bvec->bv_page))
set_page_dirty_lock(bvec->bv_page);
}
@@ -1669,8 +1676,9 @@ static void bio_release_pages(struct bio *bio)
{
struct bio_vec *bvec;
int i;
+ struct bvec_chunk_iter citer;
- bio_for_each_segment_all(bvec, bio, i)
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer)
put_page(bvec->bv_page);
}
@@ -1717,8 +1725,9 @@ void bio_check_pages_dirty(struct bio *bio)
struct bio_vec *bvec;
unsigned long flags;
int i;
+ struct bvec_chunk_iter citer;
- bio_for_each_segment_all(bvec, bio, i) {
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer) {
if (!PageDirty(bvec->bv_page) && !PageCompound(bvec->bv_page))
goto defer;
}
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 3d08dc84db16..9223666c845d 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -123,6 +123,7 @@ int blkdev_report_zones(struct block_device *bdev,
unsigned int ofst;
void *addr;
int ret;
+ struct bvec_chunk_iter citer;
if (!q)
return -ENXIO;
@@ -190,7 +191,7 @@ int blkdev_report_zones(struct block_device *bdev,
n = 0;
nz = 0;
nr_rep = 0;
- bio_for_each_segment_all(bv, bio, i) {
+ bio_for_each_chunk_segment_all(bv, bio, i, citer) {
if (!bv->bv_page)
break;
@@ -223,7 +224,7 @@ int blkdev_report_zones(struct block_device *bdev,
*nr_zones = nz;
out:
- bio_for_each_segment_all(bv, bio, i)
+ bio_for_each_chunk_segment_all(bv, bio, i, citer)
__free_page(bv->bv_page);
bio_put(bio);
diff --git a/block/bounce.c b/block/bounce.c
index fd31347b7836..c6af0bd29ec9 100644
--- a/block/bounce.c
+++ b/block/bounce.c
@@ -146,11 +146,12 @@ static void bounce_end_io(struct bio *bio, mempool_t *pool)
struct bio_vec *bvec, orig_vec;
int i;
struct bvec_iter orig_iter = bio_orig->bi_iter;
+ struct bvec_chunk_iter citer;
/*
* free up bounce indirect pages used
*/
- bio_for_each_segment_all(bvec, bio, i) {
+ bio_for_each_chunk_segment_all(bvec, bio, i, citer) {
orig_vec = bio_iter_iovec(bio_orig, orig_iter);
if (bvec->bv_page != orig_vec.bv_page) {
dec_zone_page_state(bvec->bv_page, NR_BOUNCE);
@@ -206,6 +207,7 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
bool bounce = false;
int sectors = 0;
bool passthrough = bio_is_passthrough(*bio_orig);
+ struct bvec_chunk_iter citer;
bio_for_each_segment(from, *bio_orig, iter) {
if (i++ < BIO_MAX_PAGES)
@@ -225,7 +227,7 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
bio = bio_clone_bioset(*bio_orig, GFP_NOIO, passthrough ? NULL :
&bounce_bio_set);
- bio_for_each_segment_all(to, bio, i) {
+ bio_for_each_chunk_segment_all(to, bio, i, citer) {
struct page *page = to->bv_page;
if (page_to_pfn(page) <= q->limits.bounce_pfn)
diff --git a/include/linux/bio.h b/include/linux/bio.h
index f21384be9b51..c22b8be961ce 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -374,10 +374,11 @@ static inline unsigned bio_pages_all(struct bio *bio)
{
unsigned i;
struct bio_vec *bv;
+ struct bvec_chunk_iter citer;
WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED));
- bio_for_each_segment_all(bv, bio, i)
+ bio_for_each_chunk_segment_all(bv, bio, i, citer)
;
return i;
}
--
2.9.5
next prev parent reply other threads:[~2018-06-09 12:30 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
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 ` Ming Lei [this message]
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=20180609123014.8861-19-ming.lei@redhat.com \
--to=ming.lei@redhat.com \
--cc=axboe@fb.com \
--cc=colyli@suse.de \
--cc=darrick.wong@oracle.com \
--cc=dsterba@suse.cz \
--cc=fdmanana@gmail.com \
--cc=hch@infradead.org \
--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=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.