From: Jens Axboe <axboe@kernel.dk>
To: linux-block@vger.kernel.org
Cc: joshi.k@samsung.com, kbusch@kernel.org, Jens Axboe <axboe@kernel.dk>
Subject: [PATCH 3/3] block: use on-stack page vec for <= UIO_FASTIOV
Date: Sat, 6 Aug 2022 09:20:04 -0600 [thread overview]
Message-ID: <20220806152004.382170-4-axboe@kernel.dk> (raw)
In-Reply-To: <20220806152004.382170-1-axboe@kernel.dk>
Avoid a kmalloc+kfree for each page array, if we only have a few pages
that are mapped. An alloc+free for each IO is quite expensive, and
it's pretty pointless if we're only dealing with 1 or a few vecs.
Use UIO_FASTIOV like we do in other spots to set a sane limit for how
big of an IO we want to avoid allocations for.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
block/blk-map.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/block/blk-map.c b/block/blk-map.c
index 5da03f2614eb..d0ff80a9902e 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -268,12 +268,19 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter,
}
while (iov_iter_count(iter)) {
- struct page **pages;
+ struct page **pages, *stack_pages[UIO_FASTIOV];
ssize_t bytes;
size_t offs, added = 0;
int npages;
- bytes = iov_iter_get_pages_alloc(iter, &pages, LONG_MAX, &offs);
+ if (nr_vecs < ARRAY_SIZE(stack_pages)) {
+ pages = stack_pages;
+ bytes = iov_iter_get_pages(iter, pages, LONG_MAX,
+ nr_vecs, &offs);
+ } else {
+ bytes = iov_iter_get_pages_alloc(iter, &pages, LONG_MAX,
+ &offs);
+ }
if (unlikely(bytes <= 0)) {
ret = bytes ? bytes : -EFAULT;
goto out_unmap;
@@ -310,7 +317,8 @@ static int bio_map_user_iov(struct request *rq, struct iov_iter *iter,
*/
while (j < npages)
put_page(pages[j++]);
- kvfree(pages);
+ if (pages != stack_pages)
+ kvfree(pages);
/* couldn't stuff something into bio? */
if (bytes)
break;
--
2.35.1
next prev parent reply other threads:[~2022-08-06 15:20 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-06 15:20 [PATCHSET 0/3] passthru block optimizations Jens Axboe
2022-08-06 15:20 ` [PATCH 1/3] block: shrink rq_map_data a bit Jens Axboe
2022-08-07 9:26 ` Chaitanya Kulkarni
2022-08-06 15:20 ` [PATCH 2/3] block: enable bio caching use for passthru IO Jens Axboe
2022-08-07 9:27 ` Chaitanya Kulkarni
2022-08-07 18:08 ` Kanchan Joshi
2022-08-07 18:45 ` Jens Axboe
2022-08-06 15:20 ` Jens Axboe [this message]
2022-08-07 9:30 ` [PATCH 3/3] block: use on-stack page vec for <= UIO_FASTIOV Chaitanya Kulkarni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220806152004.382170-4-axboe@kernel.dk \
--to=axboe@kernel.dk \
--cc=joshi.k@samsung.com \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).