public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Shaohua Li <shli@kernel.org>
To: Ming Lei <ming.lei@redhat.com>
Cc: Guoqing Jiang <gqjiang@suse.com>, Jens Axboe <axboe@fb.com>,
	Christoph Hellwig <hch@infradead.org>,
	linux-kernel@vger.kernel.org, linux-block@vger.kernel.org,
	linux-raid@vger.kernel.org
Subject: Re: [PATCH v2 11/51] md: raid1: initialize bvec table via bio_add_page()
Date: Thu, 29 Jun 2017 12:00:36 -0700	[thread overview]
Message-ID: <20170629190036.gnczionyfpbwel6w@kernel.org> (raw)
In-Reply-To: <20170627162242.GA19610@ming.t460p>

On Wed, Jun 28, 2017 at 12:22:51AM +0800, Ming Lei wrote:
> On Tue, Jun 27, 2017 at 05:36:39PM +0800, Guoqing Jiang wrote:
> > 
> > 
> > On 06/26/2017 08:09 PM, Ming Lei wrote:
> > > We will support multipage bvec soon, so initialize bvec
> > > table using the standardy way instead of writing the
> > > talbe directly. Otherwise it won't work any more once
> > > multipage bvec is enabled.
> > > 
> > > Cc: Shaohua Li <shli@kernel.org>
> > > Cc: linux-raid@vger.kernel.org
> > > Signed-off-by: Ming Lei <ming.lei@redhat.com>
> > > ---
> > >   drivers/md/raid1.c | 27 ++++++++++++++-------------
> > >   1 file changed, 14 insertions(+), 13 deletions(-)
> > > 
> > > diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> > > index 3febfc8391fb..835c42396861 100644
> > > --- a/drivers/md/raid1.c
> > > +++ b/drivers/md/raid1.c
> > > @@ -2086,10 +2086,8 @@ static void process_checks(struct r1bio *r1_bio)
> > >   	/* Fix variable parts of all bios */
> > >   	vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9);
> > >   	for (i = 0; i < conf->raid_disks * 2; i++) {
> > > -		int j;
> > >   		int size;
> > >   		blk_status_t status;
> > > -		struct bio_vec *bi;
> > >   		struct bio *b = r1_bio->bios[i];
> > >   		struct resync_pages *rp = get_resync_pages(b);
> > >   		if (b->bi_end_io != end_sync_read)
> > > @@ -2098,8 +2096,6 @@ static void process_checks(struct r1bio *r1_bio)
> > >   		status = b->bi_status;
> > >   		bio_reset(b);
> > >   		b->bi_status = status;
> > > -		b->bi_vcnt = vcnt;
> > > -		b->bi_iter.bi_size = r1_bio->sectors << 9;
> > >   		b->bi_iter.bi_sector = r1_bio->sector +
> > >   			conf->mirrors[i].rdev->data_offset;
> > >   		b->bi_bdev = conf->mirrors[i].rdev->bdev;
> > > @@ -2107,15 +2103,20 @@ static void process_checks(struct r1bio *r1_bio)
> > >   		rp->raid_bio = r1_bio;
> > >   		b->bi_private = rp;
> > > -		size = b->bi_iter.bi_size;
> > > -		bio_for_each_segment_all(bi, b, j) {
> > > -			bi->bv_offset = 0;
> > > -			if (size > PAGE_SIZE)
> > > -				bi->bv_len = PAGE_SIZE;
> > > -			else
> > > -				bi->bv_len = size;
> > > -			size -= PAGE_SIZE;
> > > -		}
> > > +		/* initialize bvec table again */
> > > +		rp->idx = 0;
> > > +		size = r1_bio->sectors << 9;
> > > +		do {
> > > +			struct page *page = resync_fetch_page(rp, rp->idx++);
> > > +			int len = min_t(int, size, PAGE_SIZE);
> > > +
> > > +			/*
> > > +			 * won't fail because the vec table is big
> > > +			 * enough to hold all these pages
> > > +			 */
> > > +			bio_add_page(b, page, len, 0);
> > > +			size -= len;
> > > +		} while (rp->idx < RESYNC_PAGES && size > 0);
> > >   	}
> > 
> > Seems above section is similar as reset_bvec_table introduced in next patch,
> > why there is difference between raid1 and raid10? Maybe add reset_bvec_table
> > into md.c, then call it in raid1 or raid10 is better, just my 2 cents.
> 
> Hi Guoqing,
> 
> I think it is a good idea, and even the two patches can be put into
> one, so how about the following patch?
> 
> Shaohua, what do you think of this one?

generally looks good.
 
> ---
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 3d957ac1e109..7ffc622dd7fa 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -9126,6 +9126,24 @@ void md_reload_sb(struct mddev *mddev, int nr)
>  }
>  EXPORT_SYMBOL(md_reload_sb);
>  
> +/* generally called after bio_reset() for reseting bvec */
> +void reset_bvec_table(struct bio *bio, struct resync_pages *rp, int size)
> +{
> +	/* initialize bvec table again */
> +	rp->idx = 0;
> +	do {
> +		struct page *page = resync_fetch_page(rp, rp->idx++);
> +		int len = min_t(int, size, PAGE_SIZE);
> +
> +		/*
> +		 * won't fail because the vec table is big
> +		 * enough to hold all these pages
> +		 */
> +		bio_add_page(bio, page, len, 0);
> +		size -= len;
> +	} while (rp->idx < RESYNC_PAGES && size > 0);
> +}
> +

used in raid1/10, so must export the symbol. Then please not pollute global
names, maybe call it md_bio_reset_resync_pages?

>  #ifndef MODULE
>  
>  /*
> diff --git a/drivers/md/md.h b/drivers/md/md.h
> index 991f0fe2dcc6..f569831b1de9 100644
> --- a/drivers/md/md.h
> +++ b/drivers/md/md.h
> @@ -783,4 +783,6 @@ static inline struct page *resync_fetch_page(struct resync_pages *rp,
>  		return NULL;
>  	return rp->pages[idx];
>  }
> +
> +void reset_bvec_table(struct bio *bio, struct resync_pages *rp, int size);
>  #endif /* _MD_MD_H */
> diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
> index 3febfc8391fb..6ae2665ecd58 100644
> --- a/drivers/md/raid1.c
> +++ b/drivers/md/raid1.c
> @@ -2086,10 +2086,7 @@ static void process_checks(struct r1bio *r1_bio)
>  	/* Fix variable parts of all bios */
>  	vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9);
>  	for (i = 0; i < conf->raid_disks * 2; i++) {
> -		int j;
> -		int size;
>  		blk_status_t status;
> -		struct bio_vec *bi;
>  		struct bio *b = r1_bio->bios[i];
>  		struct resync_pages *rp = get_resync_pages(b);
>  		if (b->bi_end_io != end_sync_read)
> @@ -2098,8 +2095,6 @@ static void process_checks(struct r1bio *r1_bio)
>  		status = b->bi_status;
>  		bio_reset(b);
>  		b->bi_status = status;
> -		b->bi_vcnt = vcnt;
> -		b->bi_iter.bi_size = r1_bio->sectors << 9;
>  		b->bi_iter.bi_sector = r1_bio->sector +
>  			conf->mirrors[i].rdev->data_offset;
>  		b->bi_bdev = conf->mirrors[i].rdev->bdev;
> @@ -2107,15 +2102,8 @@ static void process_checks(struct r1bio *r1_bio)
>  		rp->raid_bio = r1_bio;
>  		b->bi_private = rp;
>  
> -		size = b->bi_iter.bi_size;
> -		bio_for_each_segment_all(bi, b, j) {
> -			bi->bv_offset = 0;
> -			if (size > PAGE_SIZE)
> -				bi->bv_len = PAGE_SIZE;
> -			else
> -				bi->bv_len = size;
> -			size -= PAGE_SIZE;
> -		}
> +		/* initialize bvec table again */
> +		reset_bvec_table(b, rp, r1_bio->sectors << 9);
>  	}
>  	for (primary = 0; primary < conf->raid_disks * 2; primary++)
>  		if (r1_bio->bios[primary]->bi_end_io == end_sync_read &&
> diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
> index 5026e7ad51d3..72f4fa07449b 100644
> --- a/drivers/md/raid10.c
> +++ b/drivers/md/raid10.c
> @@ -2087,8 +2087,8 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
>  		rp = get_resync_pages(tbio);
>  		bio_reset(tbio);
>  
> -		tbio->bi_vcnt = vcnt;
> -		tbio->bi_iter.bi_size = fbio->bi_iter.bi_size;
> +		reset_bvec_table(tbio, rp, fbio->bi_iter.bi_size);
> +
>  		rp->raid_bio = r10_bio;
>  		tbio->bi_private = rp;
>  		tbio->bi_iter.bi_sector = r10_bio->devs[i].addr;
> 
> Thanks,
> Ming

  parent reply	other threads:[~2017-06-29 19:00 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-26 12:09 [PATCH v2 00/51] block: support multipage bvec Ming Lei
2017-06-26 12:09 ` [PATCH v2 01/51] block: drbd: comment on direct access bvec table Ming Lei
2017-06-26 12:09 ` [PATCH v2 02/51] block: loop: comment on direct access to " Ming Lei
2017-06-26 12:09 ` [PATCH v2 03/51] kernel/power/swap.c: " Ming Lei
2017-06-26 12:09 ` [PATCH v2 04/51] mm: page_io.c: " Ming Lei
2017-06-26 12:09 ` [PATCH v2 05/51] fs/buffer: " Ming Lei
2017-06-26 12:09 ` [PATCH v2 06/51] f2fs: f2fs_read_end_io: " Ming Lei
2017-06-26 12:09 ` [PATCH v2 07/51] bcache: " Ming Lei
2017-06-26 12:09 ` [PATCH v2 08/51] block: comment on bio_alloc_pages() Ming Lei
2017-06-26 12:09 ` [PATCH v2 09/51] block: comment on bio_iov_iter_get_pages() Ming Lei
2017-06-26 12:09 ` [PATCH v2 10/51] dm: limit the max bio size as BIO_MAX_PAGES * PAGE_SIZE Ming Lei
2017-06-26 12:09 ` [PATCH v2 11/51] md: raid1: initialize bvec table via bio_add_page() Ming Lei
2017-06-27  9:36   ` Guoqing Jiang
2017-06-27 16:22     ` Ming Lei
2017-06-29  1:36       ` Guoqing Jiang
2017-06-29 19:00       ` Shaohua Li [this message]
2017-06-26 12:09 ` [PATCH v2 12/51] md: raid10: avoid to access bvec table directly Ming Lei
2017-06-26 12:09 ` [PATCH v2 13/51] btrfs: avoid access to .bi_vcnt directly Ming Lei
2017-06-26 12:09 ` [PATCH v2 14/51] btrfs: avoid to access bvec table directly for a cloned bio Ming Lei
2017-06-26 18:04   ` Liu Bo
2017-06-26 12:09 ` [PATCH v2 15/51] btrfs: comment on direct access bvec table Ming Lei
2017-06-26 12:09 ` [PATCH v2 16/51] block: bounce: avoid direct access to " Ming Lei
2017-06-27  6:12   ` Matthew Wilcox
2017-06-27  7:34     ` Ming Lei
2017-06-26 12:10 ` [PATCH v2 17/51] bvec_iter: introduce BVEC_ITER_ALL_INIT Ming Lei
2017-06-26 12:10 ` [PATCH v2 18/51] block: bounce: don't access bio->bi_io_vec in copy_to_high_bio_irq Ming Lei
2017-06-26 12:10 ` [PATCH v2 19/51] block: comments on bio_for_each_segment[_all] Ming Lei
2017-06-26 12:10 ` [PATCH v2 20/51] block: introduce multipage/single page bvec helpers Ming Lei
2017-06-26 12:10 ` [PATCH v2 21/51] block: implement sp version of bvec iterator helpers Ming Lei
2017-06-26 12:10 ` [PATCH v2 22/51] block: introduce bio_for_each_segment_mp() Ming Lei
2017-06-26 12:10 ` [PATCH v2 23/51] blk-merge: compute bio->bi_seg_front_size efficiently Ming Lei
2017-06-26 12:10 ` [PATCH v2 24/51] block: blk-merge: try to make front segments in full size Ming Lei
2017-06-26 12:10 ` [PATCH v2 25/51] block: blk-merge: remove unnecessary check Ming Lei
2017-06-26 12:10 ` [PATCH v2 26/51] block: use bio_for_each_segment_mp() to compute segments count Ming Lei
2017-06-26 12:10 ` [PATCH v2 27/51] block: use bio_for_each_segment_mp() to map sg Ming Lei
2017-06-26 12:10 ` [PATCH v2 28/51] block: introduce bvec_for_each_sp_bvec() Ming Lei
2017-06-26 12:10 ` [PATCH v2 29/51] block: bio: introduce single/multi page version of bio_for_each_segment_all() Ming Lei
2017-06-26 12:10 ` [PATCH v2 30/51] block: introduce bvec_get_last_page() Ming Lei
2017-06-26 12:10 ` [PATCH v2 31/51] fs/buffer.c: use bvec iterator to truncate the bio Ming Lei
2017-06-26 12:10 ` [PATCH v2 32/51] btrfs: use bvec_get_last_page to get bio's last page Ming Lei
2017-06-26 12:10 ` [PATCH v2 33/51] block: deal with dirtying pages for multipage bvec Ming Lei
2017-06-26 12:10 ` [PATCH v2 34/51] block: convert to singe/multi page version of bio_for_each_segment_all() Ming Lei
2017-06-26 12:10 ` [PATCH v2 35/51] bcache: convert to bio_for_each_segment_all_sp() Ming Lei
2017-06-26 12:10 ` [PATCH v2 36/51] md: raid1: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 37/51] dm-crypt: don't clear bvec->bv_page in crypt_free_buffer_pages() Ming Lei
2017-06-26 12:10 ` [PATCH v2 38/51] dm-crypt: convert to bio_for_each_segment_all_sp() Ming Lei
2017-06-26 12:10 ` [PATCH v2 39/51] fs/mpage: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 40/51] fs/block: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 41/51] fs/iomap: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 42/51] ext4: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 43/51] xfs: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 44/51] gfs2: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 45/51] f2fs: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 46/51] exofs: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 47/51] fs: crypto: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 48/51] fs/btrfs: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 49/51] fs/direct-io: " Ming Lei
2017-06-26 12:10 ` [PATCH v2 50/51] block: enable multipage bvecs Ming Lei
2017-06-26 12:10 ` [PATCH v2 51/51] block: bio: pass segments to bio if bio_add_page() is bypassed Ming Lei
2017-06-26 16:42 ` [PATCH v2 00/51] block: support multipage bvec David Sterba
2017-06-26 16:46 ` Jens Axboe

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=20170629190036.gnczionyfpbwel6w@kernel.org \
    --to=shli@kernel.org \
    --cc=axboe@fb.com \
    --cc=gqjiang@suse.com \
    --cc=hch@infradead.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-raid@vger.kernel.org \
    --cc=ming.lei@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