All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: Dmitri Monakhov <dmonakhov@openvz.org>
Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	Jens Axboe <jens.axboe@oracle.com>
Subject: Re: [PATCH] fix bio_add_page for non trivial merge_bvec_fn case
Date: Mon, 30 Jun 2008 13:37:39 -0700	[thread overview]
Message-ID: <20080630133739.fc4effec.akpm@linux-foundation.org> (raw)
In-Reply-To: <m3y75gszgb.fsf@dmon-lap.sw.ru>

On Sun, 08 Jun 2008 19:45:08 +0400
Dmitri Monakhov <dmonakhov@openvz.org> wrote:

> We have to properly decrease all related bio's counters, especially bi_size
> in order to merge_bvec_fn return right result. Usually this result in
> false merge rejects for two absolutely valid bio_vecs. This may cause 
> significant performance penalty for example Itanium: page_size == 16k,
> fs_block_size == 1k and block device is raid with small chunk_size.
> 

Please cc Jens on BIO changes.

> ---
>  fs/bio.c |   16 ++++++++++++----
>  1 files changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/bio.c b/fs/bio.c
> index 7856257..d713074 100644
> --- a/fs/bio.c
> +++ b/fs/bio.c
> @@ -332,14 +332,21 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
>  
>  		if (page == prev->bv_page &&
>  		    offset == prev->bv_offset + prev->bv_len) {
> +			/* Temprory detacth last bio_vec. */

whoa, drunken speling.

> +			bio->bi_size -= prev->bv_len;
> +			bio->bi_vcnt--;
> +			bio->bi_phys_segments--;
> +			bio->bi_hw_segments--;
> +
>  			prev->bv_len += len;
>  			if (q->merge_bvec_fn &&
>  			    q->merge_bvec_fn(q, bio, prev) < len) {
>  				prev->bv_len -= len;
> -				return 0;
> +				len = 0;
>  			}
>  
> -			goto done;
> +			bio->bi_size += prev->bv_len;
> +			goto out_add_bvec;
>  		}
>  	}
>  
> @@ -394,11 +401,12 @@ static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
>  	    BIOVEC_VIRT_MERGEABLE(bvec-1, bvec)))
>  		bio->bi_flags &= ~(1 << BIO_SEG_VALID);
>  
> +	bio->bi_size += len;
> +out_add_bvec:
>  	bio->bi_vcnt++;
>  	bio->bi_phys_segments++;
>  	bio->bi_hw_segments++;
> - done:
> -	bio->bi_size += len;
>  	return len;
>  }

For some reason patch(1) claims this hunk was corrupted.  I typed it in
by hand.


  reply	other threads:[~2008-06-30 20:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-08 15:45 [PATCH] fix bio_add_page for non trivial merge_bvec_fn case Dmitri Monakhov
2008-06-30 20:37 ` Andrew Morton [this message]
2008-07-01  7:14   ` 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=20080630133739.fc4effec.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=dmonakhov@openvz.org \
    --cc=jens.axboe@oracle.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /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.