block: optimise boundary blkdev_read_iter's checks
authorPavel Begunkov <asml.silence@gmail.com>
Wed, 20 Oct 2021 19:00:48 +0000 (20:00 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 21 Oct 2021 14:27:17 +0000 (08:27 -0600)
Combine pos and len checks and mark unlikely. Also, don't reexpand if
it's not truncated.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/fff34e613aeaae1ad12977dc4592cb1a1f5d3190.1634755800.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/fops.c

index 21d25ee..8f733c9 100644 (file)
@@ -503,17 +503,20 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
        size_t shorted = 0;
        ssize_t ret;
 
-       if (pos >= size)
-               return 0;
-
-       size -= pos;
-       if (iov_iter_count(to) > size) {
-               shorted = iov_iter_count(to) - size;
-               iov_iter_truncate(to, size);
+       if (unlikely(pos + iov_iter_count(to) > size)) {
+               if (pos >= size)
+                       return 0;
+               size -= pos;
+               if (iov_iter_count(to) > size) {
+                       shorted = iov_iter_count(to) - size;
+                       iov_iter_truncate(to, size);
+               }
        }
 
        ret = generic_file_read_iter(iocb, to);
-       iov_iter_reexpand(to, iov_iter_count(to) + shorted);
+
+       if (unlikely(shorted))
+               iov_iter_reexpand(to, iov_iter_count(to) + shorted);
        return ret;
 }