All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: Christoph Hellwig <hch@lst.de>, Ming Lei <ming.lei@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>,
	linux-block@vger.kernel.org, Qu Wenruo <quwenruo.btrfs@gmx.com>,
	linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	Omar Sandoval <osandov@fb.com>
Subject: Re: [PATCH] block: don't use for-inside-for in bio_for_each_segment_all
Date: Mon, 8 Apr 2019 08:07:55 +0200	[thread overview]
Message-ID: <f0c82caf-24f3-dba7-0bf0-85dd0e056e73@suse.de> (raw)
In-Reply-To: <20190407065205.GA8799@lst.de>

On 4/7/19 8:52 AM, Christoph Hellwig wrote:
> The change itself looks fine to be, but a few comments on semingly
> unrelated changes:
> 
>> +#define bio_for_each_segment_all(bvl, bio, i, iter_all)			\
>> +	for (i = 0, bvl = bvec_init_iter_all(&iter_all);		\
>> +		iter_all.idx < (bio)->bi_vcnt &&			\
>> +		(mp_bvec_advance(&((bio)->bi_io_vec[iter_all.idx]),	\
>> +				 &iter_all), 1); i++)
> 
> Instead of the complicated expression inside the for loop test
> expression can't we move the index check into mp_bvec_advance and let
> it return a bool?
> 
>> diff --git a/include/linux/bvec.h b/include/linux/bvec.h
>> index f6275c4da13a..6e4996dfc847 100644
>> --- a/include/linux/bvec.h
>> +++ b/include/linux/bvec.h
>> @@ -48,7 +48,7 @@ struct bvec_iter {
>>   struct bvec_iter_all {
>>   	struct bio_vec	bv;
>>   	int		idx;
>> -	unsigned	done;
>> +	unsigned	bv_done;
> 
> Why the rename here?
> 
>> +static inline void mp_bvec_advance(const struct bio_vec *bvec,
>> +				   struct bvec_iter_all *iter_all)
> 
> If we rename this we should probably drop the mp_ prefix..
> 
> Also not for this patch, but we should really consider moving this
> function out of line given how big it is.
> 
> 
> Here is how I'd do this with my slight changes:
> 
> 
> diff --git a/include/linux/bio.h b/include/linux/bio.h
> index bb915591557b..fd7629ac9f11 100644
> --- a/include/linux/bio.h
> +++ b/include/linux/bio.h
> @@ -120,19 +120,42 @@ static inline bool bio_full(struct bio *bio)
>   	return bio->bi_vcnt >= bio->bi_max_vecs;
>   }
>   
> -#define mp_bvec_for_each_segment(bv, bvl, i, iter_all)			\
> -	for (bv = bvec_init_iter_all(&iter_all);			\
> -		(iter_all.done < (bvl)->bv_len) &&			\
> -		(mp_bvec_next_segment((bvl), &iter_all), 1);		\
> -		iter_all.done += bv->bv_len, i += 1)
> +static inline bool __bio_next_segment_all(struct bio *bio,
> +		struct bvec_iter_all *iter_all)
> +{
> +	struct bio_vec *bvec = &bio->bi_io_vec[iter_all->idx];
> +	struct bio_vec *bv = &iter_all->bv;
> +
> +	if (iter_all->idx >= bio->bi_vcnt)
> +		return false;
> +
> +	if (iter_all->done) {
> +		bv->bv_page = nth_page(bv->bv_page, 1);
> +		bv->bv_offset = 0;
> +	} else {
> +		bv->bv_page = bvec->bv_page;
> +		bv->bv_offset = bvec->bv_offset;
> +	}
> +	bv->bv_len = min_t(unsigned int, PAGE_SIZE - bv->bv_offset,
> +			   bvec->bv_len - iter_all->done);
> +	iter_all->done += bv->bv_len;
> +
> +	if (iter_all->done == bvec->bv_len) {
> +		iter_all->idx++;
> +		iter_all->done = 0;
> +	}
> +
> +	return true;
> +}
>   
>   /*
>    * drivers should _never_ use the all version - the bio may have been split
>    * before it got to the driver and the driver won't own all of it
>    */
> -#define bio_for_each_segment_all(bvl, bio, i, iter_all)		\
> -	for (i = 0, iter_all.idx = 0; iter_all.idx < (bio)->bi_vcnt; iter_all.idx++)	\
> -		mp_bvec_for_each_segment(bvl, &((bio)->bi_io_vec[iter_all.idx]), i, iter_all)
> +#define bio_for_each_segment_all(bvl, bio, i, iter_all)			\
> +	for (i = 0, bvl = bvec_init_iter_all(&iter_all);		\
> +	     __bio_next_segment_all(bio, &iter_all);			\
> +	     i++)
>   
>   static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter,
>   				    unsigned bytes)
> diff --git a/include/linux/bvec.h b/include/linux/bvec.h
> index f6275c4da13a..bcebfc522498 100644
> --- a/include/linux/bvec.h
> +++ b/include/linux/bvec.h
> @@ -145,28 +145,12 @@ static inline bool bvec_iter_advance(const struct bio_vec *bv,
>   
>   static inline struct bio_vec *bvec_init_iter_all(struct bvec_iter_all *iter_all)
>   {
> -	iter_all->bv.bv_page = NULL;
>   	iter_all->done = 0;
> +	iter_all->idx = 0;
>   
>   	return &iter_all->bv;
>   }
>   
> -static inline void mp_bvec_next_segment(const struct bio_vec *bvec,
> -					struct bvec_iter_all *iter_all)
> -{
> -	struct bio_vec *bv = &iter_all->bv;
> -
> -	if (bv->bv_page) {
> -		bv->bv_page = nth_page(bv->bv_page, 1);
> -		bv->bv_offset = 0;
> -	} else {
> -		bv->bv_page = bvec->bv_page;
> -		bv->bv_offset = bvec->bv_offset;
> -	}
> -	bv->bv_len = min_t(unsigned int, PAGE_SIZE - bv->bv_offset,
> -			   bvec->bv_len - iter_all->done);
> -}
> -
>   /*
>    * Get the last single-page segment from the multi-page bvec and store it
>    * in @seg
> 
Oh yes, please do.
The macros are fast becoming unparseable :-)

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		   Teamlead Storage & Networking
hare@suse.de			               +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Mary Higgins, Sri Rasiah
HRB 21284 (AG Nürnberg)

  parent reply	other threads:[~2019-04-08  6:08 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-06 21:54 [PATCH] block: don't use for-inside-for in bio_for_each_segment_all Ming Lei
2019-04-07  6:52 ` Christoph Hellwig
2019-04-07  7:37   ` Ming Lei
2019-04-07  7:38     ` Christoph Hellwig
2019-04-07  7:54     ` Ming Lei
2019-04-07  7:58       ` Christoph Hellwig
2019-04-07  8:13         ` Ming Lei
2019-04-08  6:07   ` Hannes Reinecke [this message]
2019-04-08 14:12     ` Matthew Wilcox
2019-04-09  9:48       ` Christoph Hellwig
2019-04-09 10:25         ` Johannes Thumshirn
2019-04-09 11:38         ` Matthew Wilcox
2019-04-09 15:36           ` David Sterba

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=f0c82caf-24f3-dba7-0bf0-85dd0e056e73@suse.de \
    --to=hare@suse.de \
    --cc=axboe@kernel.dk \
    --cc=hch@lst.de \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=ming.lei@redhat.com \
    --cc=osandov@fb.com \
    --cc=quwenruo.btrfs@gmx.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.