block: remove the bi_seg_{front,back}_size fields in struct bio [Linux 5.2]

block: remove the bi_seg_{front,back}_size fields in struct bio [Linux 5.2]

This Linux kernel change "block: remove the bi_seg_{front,back}_size fields in struct bio" is included in the Linux 5.2 release. This change is authored by Christoph Hellwig <hch [at] lst.de> on Tue May 21 09:01:43 2019 +0200. The commit for this change in Linux stable tree is 6869875 (patch).

block: remove the bi_seg_{front,back}_size fields in struct bio

At this point these fields aren't used for anything, so we can remove
them.

Reviewed-by: Ming Lei <[email protected]>
Reviewed-by: Hannes Reinecke <[email protected]>
Signed-off-by: Christoph Hellwig <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>

There are 101 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 block/blk-merge.c         | 94 ++++++-----------------------------------------
 include/linux/blk_types.h |  7 ----
 2 files changed, 12 insertions(+), 89 deletions(-)

diff --git a/block/blk-merge.c b/block/blk-merge.c
index eee2c02..17713d7 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -162,8 +162,7 @@ static unsigned get_max_segment_size(struct request_queue *q,
  * variables.
  */
 static bool bvec_split_segs(struct request_queue *q, struct bio_vec *bv,
-       unsigned *nsegs, unsigned *last_seg_size,
-       unsigned *front_seg_size, unsigned *sectors, unsigned max_segs)
+       unsigned *nsegs, unsigned *sectors, unsigned max_segs)
 {
    unsigned len = bv->bv_len;
    unsigned total_len = 0;
@@ -185,28 +184,12 @@ static bool bvec_split_segs(struct request_queue *q, struct bio_vec *bv,
            break;
    }

-   if (!new_nsegs)
-       return !!len;
-
-   /* update front segment size */
-   if (!*nsegs) {
-       unsigned first_seg_size;
-
-       if (new_nsegs == 1)
-           first_seg_size = get_max_segment_size(q, bv->bv_offset);
-       else
-           first_seg_size = queue_max_segment_size(q);
-
-       if (*front_seg_size < first_seg_size)
-           *front_seg_size = first_seg_size;
+   if (new_nsegs) {
+       *nsegs += new_nsegs;
+       if (sectors)
+           *sectors += total_len >> 9;
    }

-   /* update other varibles */
-   *last_seg_size = seg_size;
-   *nsegs += new_nsegs;
-   if (sectors)
-       *sectors += total_len >> 9;
-
    /* split in the middle of the bvec if len != 0 */
    return !!len;
 }
@@ -218,8 +201,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,
 {
    struct bio_vec bv, bvprv, *bvprvp = NULL;
    struct bvec_iter iter;
-   unsigned seg_size = 0, nsegs = 0, sectors = 0;
-   unsigned front_seg_size = bio->bi_seg_front_size;
+   unsigned nsegs = 0, sectors = 0;
    bool do_split = true;
    struct bio *new = NULL;
    const unsigned max_sectors = get_max_io_size(q, bio);
@@ -243,8 +225,6 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,
                /* split in the middle of bvec */
                bv.bv_len = (max_sectors - sectors) << 9;
                bvec_split_segs(q, &bv, &nsegs,
-                       &seg_size,
-                       &front_seg_size,
                        &sectors, max_segs);
            }
            goto split;
@@ -258,12 +238,9 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,

        if (bv.bv_offset + bv.bv_len <= PAGE_SIZE) {
            nsegs++;
-           seg_size = bv.bv_len;
            sectors += bv.bv_len >> 9;
-           if (nsegs == 1 && seg_size > front_seg_size)
-               front_seg_size = seg_size;
-       } else if (bvec_split_segs(q, &bv, &nsegs, &seg_size,
-                   &front_seg_size, &sectors, max_segs)) {
+       } else if (bvec_split_segs(q, &bv, &nsegs, &sectors,
+               max_segs)) {
            goto split;
        }
    }
@@ -278,10 +255,6 @@ static struct bio *blk_bio_segment_split(struct request_queue *q,
            bio = new;
    }

-   bio->bi_seg_front_size = front_seg_size;
-   if (seg_size > bio->bi_seg_back_size)
-       bio->bi_seg_back_size = seg_size;
-
    return do_split ? new : NULL;
 }

@@ -336,17 +309,13 @@ void blk_queue_split(struct request_queue *q, struct bio **bio)
 static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
                         struct bio *bio)
 {
-   struct bio_vec uninitialized_var(bv), bvprv = { NULL };
-   unsigned int seg_size, nr_phys_segs;
-   unsigned front_seg_size;
-   struct bio *fbio, *bbio;
+   unsigned int nr_phys_segs = 0;
    struct bvec_iter iter;
+   struct bio_vec bv;

    if (!bio)
        return 0;

-   front_seg_size = bio->bi_seg_front_size;
-
    switch (bio_op(bio)) {
    case REQ_OP_DISCARD:
    case REQ_OP_SECURE_ERASE:
@@ -356,23 +325,11 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
        return 1;
    }

-   fbio = bio;
-   seg_size = 0;
-   nr_phys_segs = 0;
    for_each_bio(bio) {
-       bio_for_each_bvec(bv, bio, iter) {
-           bvec_split_segs(q, &bv, &nr_phys_segs, &seg_size,
-                   &front_seg_size, NULL, UINT_MAX);
-       }
-       bbio = bio;
-       if (likely(bio->bi_iter.bi_size))
-           bvprv = bv;
+       bio_for_each_bvec(bv, bio, iter)
+           bvec_split_segs(q, &bv, &nr_phys_segs, NULL, UINT_MAX);
    }

-   fbio->bi_seg_front_size = front_seg_size;
-   if (seg_size > bbio->bi_seg_back_size)
-       bbio->bi_seg_back_size = seg_size;
-
    return nr_phys_segs;
 }

@@ -392,24 +349,6 @@ void blk_recount_segments(struct request_queue *q, struct bio *bio)
    bio_set_flag(bio, BIO_SEG_VALID);
 }

-static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio,
-                  struct bio *nxt)
-{
-   struct bio_vec end_bv = { NULL }, nxt_bv;
-
-   if (bio->bi_seg_back_size + nxt->bi_seg_front_size >
-       queue_max_segment_size(q))
-       return 0;
-
-   if (!bio_has_data(bio))
-       return 1;
-
-   bio_get_last_bvec(bio, &end_bv);
-   bio_get_first_bvec(nxt, &nxt_bv);
-
-   return biovec_phys_mergeable(q, &end_bv, &nxt_bv);
-}
-
 static inline struct scatterlist *blk_next_sg(struct scatterlist **sg,
        struct scatterlist *sglist)
 {
@@ -669,8 +608,6 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
                struct request *next)
 {
    int total_phys_segments;
-   unsigned int seg_size =
-       req->biotail->bi_seg_back_size + next->bio->bi_seg_front_size;

    if (req_gap_back_merge(req, next->bio))
        return 0;
@@ -683,13 +620,6 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
        return 0;

    total_phys_segments = req->nr_phys_segments + next->nr_phys_segments;
-   if (blk_phys_contig_segment(q, req->biotail, next->bio)) {
-       if (req->nr_phys_segments == 1)
-           req->bio->bi_seg_front_size = seg_size;
-       if (next->nr_phys_segments == 1)
-           next->biotail->bi_seg_back_size = seg_size;
-   }
-
    if (total_phys_segments > queue_max_segments(q))
        return 0;

diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index be41827..95202f8 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -159,13 +159,6 @@ struct bio {
     */
    unsigned int        bi_phys_segments;

-   /*
-    * To keep track of the max segment size, we account for the
-    * sizes of the first and last mergeable segments in this bio.
-    */
-   unsigned int        bi_seg_front_size;
-   unsigned int        bi_seg_back_size;
-
    struct bvec_iter    bi_iter;

    atomic_t        __bi_remaining;

Leave a Reply

Your email address will not be published. Required fields are marked *