bcachefs: Eliminate function calls in DIO fastpaths
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 2 Nov 2022 20:45:28 +0000 (16:45 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:31 +0000 (17:08 -0400)
We can assume that usually buffered and O_DIRECT IO won't be mixed, and
the calls to flush the page cache won't be needed.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io.c

index 185a37a6705e8b86c929519e87fcba3cdc64115c..a1767ee8559109a6c3f5bf601efdf6576e15ae11 100644 (file)
@@ -77,7 +77,7 @@ struct dio_read {
 };
 
 /* pagecache_block must be held */
-static int write_invalidate_inode_pages_range(struct address_space *mapping,
+static noinline int write_invalidate_inode_pages_range(struct address_space *mapping,
                                              loff_t start, loff_t end)
 {
        int ret;
@@ -1693,11 +1693,13 @@ ssize_t bch2_read_iter(struct kiocb *iocb, struct iov_iter *iter)
        if (iocb->ki_flags & IOCB_DIRECT) {
                struct blk_plug plug;
 
-               ret = filemap_write_and_wait_range(mapping,
-                                       iocb->ki_pos,
-                                       iocb->ki_pos + count - 1);
-               if (ret < 0)
-                       return ret;
+               if (unlikely(mapping->nrpages)) {
+                       ret = filemap_write_and_wait_range(mapping,
+                                               iocb->ki_pos,
+                                               iocb->ki_pos + count - 1);
+                       if (ret < 0)
+                               return ret;
+               }
 
                file_accessed(file);
 
@@ -1961,11 +1963,13 @@ ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter)
                                        dio->op.opts.data_replicas))
                goto err_put_bio;
 
-       ret = write_invalidate_inode_pages_range(mapping,
-                                       req->ki_pos,
-                                       req->ki_pos + iter->count - 1);
-       if (unlikely(ret))
-               goto err_put_bio;
+       if (unlikely(mapping->nrpages)) {
+               ret = write_invalidate_inode_pages_range(mapping,
+                                               req->ki_pos,
+                                               req->ki_pos + iter->count - 1);
+               if (unlikely(ret))
+                       goto err_put_bio;
+       }
 
        ret = bch2_dio_write_loop(dio);
 err: