On 01/12/2020 12:06, Ming Lei wrote: > 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. Looks good to me. Except for using BIO_MAX_PAGES for number of vecs, it's even cleaner because it adds pages constrained by number of vecs, not pages, with all side effects like skipping __blkdev_direct_IO_simple() for many page 1-segment bvecs. One nit below. Reviewed-by: Pavel Begunkov <asml.silence@xxxxxxxxx> > > 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@xxxxxxxxxxxxxxxxxxxx/ > > Cc: Matthew Wilcox <willy@xxxxxxxxxxxxx> > Cc: Pavel Begunkov <asml.silence@xxxxxxxxx> > Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> > Cc: linux-fsdevel@xxxxxxxxxxxxxxx > Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxx> > --- > fs/block_dev.c | 30 +++++++++++++++--------------- > fs/iomap/direct-io.c | 14 +++++++------- > include/linux/bio.h | 10 ++++++++++ > 3 files changed, 32 insertions(+), 22 deletions(-) > [...] > diff --git a/include/linux/bio.h b/include/linux/bio.h > index ecf67108f091..b985857ce9d1 100644 > --- a/include/linux/bio.h > +++ b/include/linux/bio.h > @@ -10,6 +10,7 @@ [...] > > +static inline int bio_iov_iter_nvecs(const struct iov_iter *i, int maxvecs) > +{ > + if (!iov_iter_count(i)) > + return 0; > + if (iov_iter_is_bvec(i)) > + return min_t(int, maxvecs, i->nr_segs); spaces instead of tabs > + return iov_iter_npages(i, maxvecs); > +} > + > #endif /* __LINUX_BIO_H */ > -- Pavel Begunkov