Skip to content

Commit

Permalink
Btrfs: finish read pages in the order they are submitted
Browse files Browse the repository at this point in the history
The endio is done at reverse order of bio vectors.

That means for a sequential read, the page first submitted will finish
last in a bio. Considering we will do checksum (making cache hot) for
every page, this does introduce delay (and chance to squeeze cache used
soon) for pages submitted at the begining.

I don't observe obvious performance difference with below patch at my
simple test, but seems more natural to finish read in the order they are
submitted.

Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
  • Loading branch information
Chris Mason committed Mar 15, 2010
1 parent 0be2e98 commit 4125bf7
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions fs/btrfs/extent_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1750,7 +1750,8 @@ static void end_bio_extent_writepage(struct bio *bio, int err)
static void end_bio_extent_readpage(struct bio *bio, int err)
{
int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
struct bio_vec *bvec_end = bio->bi_io_vec + bio->bi_vcnt - 1;
struct bio_vec *bvec = bio->bi_io_vec;
struct extent_io_tree *tree;
u64 start;
u64 end;
Expand All @@ -1773,7 +1774,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
else
whole_page = 0;

if (--bvec >= bio->bi_io_vec)
if (++bvec <= bvec_end)
prefetchw(&bvec->bv_page->flags);

if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) {
Expand Down Expand Up @@ -1818,7 +1819,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
}
check_page_locked(tree, page);
}
} while (bvec >= bio->bi_io_vec);
} while (bvec <= bvec_end);

bio_put(bio);
}
Expand Down

0 comments on commit 4125bf7

Please sign in to comment.