On Mon, Jun 30 2008, Andrew Morton wrote: > On Sun, 08 Jun 2008 19:45:08 +0400 > Dmitri Monakhov <dmonakhov@xxxxxxxxxx> 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--; > > + This logic isn't quite right, the rules for what constitutes a new hw or phys segment is not a 1:1 mapping with number of pages in the bio. How about just dropping the segment decrement? The merge_bvec fn should not care, and we'll retry and coalesce segment count if we get to the limit anyway. -- Jens Axboe -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html