Skip to content

Commit

Permalink
block: optimize bvec_iter_advance()
Browse files Browse the repository at this point in the history
This results in fewer branches/cmov instructions in the inner loop

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
  • Loading branch information
koverstreet committed Aug 31, 2018
1 parent c88022c commit 9c08efd
Showing 1 changed file with 21 additions and 11 deletions.
32 changes: 21 additions & 11 deletions include/linux/bvec.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,26 +72,36 @@ struct bvec_iter {
static inline bool bvec_iter_advance(const struct bio_vec *bv,
struct bvec_iter *iter, unsigned bytes)
{
unsigned bvec_len;

if (WARN_ONCE(bytes > iter->bi_size,
"Attempted to advance past end of bvec iter\n")) {
iter->bi_size = 0;
return false;
}

while (bytes) {
unsigned iter_len = bvec_iter_len(bv, *iter);
unsigned len = min(bytes, iter_len);
iter->bi_size -= bytes;
iter->bi_done += bytes;

bytes -= len;
iter->bi_size -= len;
iter->bi_bvec_done += len;
iter->bi_done += len;
bv += iter->bi_idx;

if (iter->bi_bvec_done == __bvec_iter_bvec(bv, *iter)->bv_len) {
iter->bi_bvec_done = 0;
iter->bi_idx++;
}
while (1) {
/* don't deref bv when bytes == 0: */
if (!bytes)
break;

bvec_len = bv->bv_len - iter->bi_bvec_done;
if (bytes < bvec_len)
break;

bytes -= bvec_len;

iter->bi_bvec_done = 0;
iter->bi_idx++;
bv++;
}

iter->bi_bvec_done += bytes;
return true;
}

Expand Down

0 comments on commit 9c08efd

Please sign in to comment.