diff mbox series

[3/4] block: don't bother iter advancing a fully done bio

Message ID 20211013164937.985367-4-axboe@kernel.dk (mailing list archive)
State New, archived
Headers show
Series Various block optimizations | expand

Commit Message

Jens Axboe Oct. 13, 2021, 4:49 p.m. UTC
If we're completing nbytes and nbytes is the size of the bio, don't bother
with calling into the iterator increment helpers. Just clear the bio
size and we're done.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
 block/bio.c         |  4 ++--
 include/linux/bio.h | 13 +++++++++++--
 2 files changed, 13 insertions(+), 4 deletions(-)

Comments

Christoph Hellwig Oct. 13, 2021, 5:26 p.m. UTC | #1
On Wed, Oct 13, 2021 at 10:49:36AM -0600, Jens Axboe wrote:
> +extern void __bio_advance(struct bio *, unsigned);

No need for the extern, but it would be nice to spell out the argument
names.

> +static inline void bio_advance(struct bio *bio, unsigned int nbytes)
> +{

The kerneldoc comment for bio_advance needs to move here now.
Jens Axboe Oct. 13, 2021, 5:46 p.m. UTC | #2
On 10/13/21 11:26 AM, Christoph Hellwig wrote:
> On Wed, Oct 13, 2021 at 10:49:36AM -0600, Jens Axboe wrote:
>> +extern void __bio_advance(struct bio *, unsigned);
> 
> No need for the extern, but it would be nice to spell out the argument
> names.

Done

>> +static inline void bio_advance(struct bio *bio, unsigned int nbytes)
>> +{
> 
> The kerneldoc comment for bio_advance needs to move here now.

Ah yes, done.
diff mbox series

Patch

diff --git a/block/bio.c b/block/bio.c
index a3c9ff23a036..874ff235aff7 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -1289,7 +1289,7 @@  EXPORT_SYMBOL(submit_bio_wait);
  *
  * @bio will then represent the remaining, uncompleted portion of the io.
  */
-void bio_advance(struct bio *bio, unsigned bytes)
+void __bio_advance(struct bio *bio, unsigned bytes)
 {
 	if (bio_integrity(bio))
 		bio_integrity_advance(bio, bytes);
@@ -1297,7 +1297,7 @@  void bio_advance(struct bio *bio, unsigned bytes)
 	bio_crypt_advance(bio, bytes);
 	bio_advance_iter(bio, &bio->bi_iter, bytes);
 }
-EXPORT_SYMBOL(bio_advance);
+EXPORT_SYMBOL(__bio_advance);
 
 void bio_copy_data_iter(struct bio *dst, struct bvec_iter *dst_iter,
 			struct bio *src, struct bvec_iter *src_iter)
diff --git a/include/linux/bio.h b/include/linux/bio.h
index 62d684b7dd4c..44b543e7baf6 100644
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -119,6 +119,17 @@  static inline void bio_advance_iter_single(const struct bio *bio,
 		bvec_iter_advance_single(bio->bi_io_vec, iter, bytes);
 }
 
+extern void __bio_advance(struct bio *, unsigned);
+
+static inline void bio_advance(struct bio *bio, unsigned int nbytes)
+{
+	if (nbytes == bio->bi_iter.bi_size) {
+		bio->bi_iter.bi_size = 0;
+		return;
+	}
+	__bio_advance(bio, nbytes);
+}
+
 #define __bio_for_each_segment(bvl, bio, iter, start)			\
 	for (iter = (start);						\
 	     (iter).bi_size &&						\
@@ -381,8 +392,6 @@  static inline int bio_iov_vecs_to_alloc(struct iov_iter *iter, int max_segs)
 struct request_queue;
 
 extern int submit_bio_wait(struct bio *bio);
-extern void bio_advance(struct bio *, unsigned);
-
 extern void bio_init(struct bio *bio, struct bio_vec *table,
 		     unsigned short max_vecs);
 extern void bio_uninit(struct bio *);