Thread (23 messages) 23 messages, 6 authors, 2020-12-11

Re: [PATCH] block: add bio_iov_iter_nvecs for figuring out nr_vecs

From: Ming Lei <hidden>
Date: 2020-12-02 01:48:50
Also in: linux-fsdevel

On Tue, Dec 01, 2020 at 12:52:51PM +0000, Matthew Wilcox wrote:
On Tue, Dec 01, 2020 at 08:06:52PM +0800, Ming Lei wrote:
quoted
Pavel reported that iov_iter_npages is a bit heavy in case of bvec
iter.

Turns out it isn't necessary to iterate every page in the bvec iter,
and we call iov_iter_npages() just for figuring out how many bio
vecs need to be allocated. And we can simply map each vector in bvec iter
to bio's vec, so just return iter->nr_segs from bio_iov_iter_nvecs() for
bvec iter.

Also rename local variable 'nr_pages' as 'nr_vecs' which exactly matches its
real usage.

This patch is based on Mathew's post:

https://lore.kernel.org/linux-block/20201120123931.GN29991@casper.infradead.org/ (local)
But the only reason we want to know 'nr_vecs' is so we can allocate a
BIO which has that many vecs, right?  But we then don't actually use the
vecs in the bio because we use the ones already present in the iter.
That was why I had it return 1, not nr_vecs.

Did I miss something?
Please see bio_iov_iter_get_pages():

  do {
  		...
      	if (is_bvec)
        	ret = __bio_iov_bvec_add_pages(bio, iter);
		...
   } while (!ret && iov_iter_count(iter) && !bio_full(bio, 0));


So all bvecs in bvec iter will be added to the bio, and it isn't
correct or efficient to just return 1.

thanks,
Ming
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help