From: Jens Axboe <axboe@kernel.dk>
To: linux-block@vger.kernel.org, linux-mm@kvack.org
Cc: Jens Axboe <axboe@kernel.dk>
Subject: [PATCH 2/2] block: move direct_IO into our own read_iter handler
Date: Fri, 3 Dec 2021 08:38:29 -0700 [thread overview]
Message-ID: <20211203153829.298893-3-axboe@kernel.dk> (raw)
In-Reply-To: <20211203153829.298893-1-axboe@kernel.dk>
Don't call into generic_file_read_iter() if we know it's O_DIRECT, just
set it up ourselves and call our own handler. This avoids an indirect call
for O_DIRECT.
Fall back to filemap_read() if we fail.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
block/fops.c | 37 ++++++++++++++++++++++++++++++++-----
1 file changed, 32 insertions(+), 5 deletions(-)
diff --git a/block/fops.c b/block/fops.c
index 93bb5bf66f69..10015e1a5b01 100644
--- a/block/fops.c
+++ b/block/fops.c
@@ -566,21 +566,48 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
struct block_device *bdev = iocb->ki_filp->private_data;
loff_t size = bdev_nr_bytes(bdev);
+ size_t count = iov_iter_count(to);
loff_t pos = iocb->ki_pos;
size_t shorted = 0;
- ssize_t ret;
+ ssize_t ret = 0;
- if (unlikely(pos + iov_iter_count(to) > size)) {
+ if (unlikely(pos + count > size)) {
if (pos >= size)
return 0;
size -= pos;
- if (iov_iter_count(to) > size) {
- shorted = iov_iter_count(to) - size;
+ if (count > size) {
+ shorted = count - size;
iov_iter_truncate(to, size);
}
}
- ret = generic_file_read_iter(iocb, to);
+ if (iocb->ki_flags & IOCB_DIRECT) {
+ struct address_space *mapping = iocb->ki_filp->f_mapping;
+
+ if (iocb->ki_flags & IOCB_NOWAIT) {
+ if (filemap_range_needs_writeback(mapping, iocb->ki_pos,
+ iocb->ki_pos + count - 1))
+ return -EAGAIN;
+ } else {
+ ret = filemap_write_and_wait_range(mapping,
+ iocb->ki_pos,
+ iocb->ki_pos + count - 1);
+ if (ret < 0)
+ return ret;
+ }
+
+ file_accessed(iocb->ki_filp);
+
+ ret = blkdev_direct_IO(iocb, to);
+ if (ret >= 0) {
+ iocb->ki_pos += ret;
+ count -= ret;
+ }
+ if (ret < 0 || !count)
+ return ret;
+ }
+
+ ret = filemap_read(iocb, to, ret);
if (unlikely(shorted))
iov_iter_reexpand(to, iov_iter_count(to) + shorted);
--
2.34.1
next prev parent reply other threads:[~2021-12-03 15:39 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-03 15:38 [PATCHSET 0/2] Avoid unnecessary indirect calls for bdev dio Jens Axboe
2021-12-03 15:38 ` [PATCH 1/2] mm: move filemap_range_needs_writeback() into header Jens Axboe
2021-12-03 16:16 ` Matthew Wilcox
2021-12-03 16:24 ` Jens Axboe
2021-12-03 16:31 ` Jens Axboe
2021-12-03 16:35 ` Jens Axboe
2021-12-03 16:38 ` Jens Axboe
2021-12-03 17:46 ` Matthew Wilcox
2021-12-03 17:57 ` Jens Axboe
2021-12-03 18:01 ` Jens Axboe
2021-12-03 18:14 ` Matthew Wilcox
2021-12-03 19:09 ` Jens Axboe
2021-12-03 15:38 ` Jens Axboe [this message]
2021-12-06 6:58 ` [PATCH 2/2] block: move direct_IO into our own read_iter handler Christoph Hellwig
2021-12-06 16:33 ` Jens Axboe
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=20211203153829.298893-3-axboe@kernel.dk \
--to=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
--cc=linux-mm@kvack.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