diff options
-rw-r--r-- | Documentation/block/biodoc.txt | 1 | ||||
-rw-r--r-- | block/bfq-iosched.c | 5 | ||||
-rw-r--r-- | block/bio.c | 15 | ||||
-rw-r--r-- | block/blk-core.c | 32 | ||||
-rw-r--r-- | block/blk-map.c | 10 | ||||
-rw-r--r-- | block/blk-merge.c | 75 | ||||
-rw-r--r-- | block/blk-mq-sched.c | 26 | ||||
-rw-r--r-- | block/blk-mq-sched.h | 10 | ||||
-rw-r--r-- | block/blk-mq.c | 23 | ||||
-rw-r--r-- | block/blk.h | 23 | ||||
-rw-r--r-- | block/kyber-iosched.c | 5 | ||||
-rw-r--r-- | block/mq-deadline.c | 5 | ||||
-rw-r--r-- | drivers/md/raid5.c | 1 | ||||
-rw-r--r-- | include/linux/bio.h | 1 | ||||
-rw-r--r-- | include/linux/blk-mq.h | 2 | ||||
-rw-r--r-- | include/linux/blk_types.h | 6 | ||||
-rw-r--r-- | include/linux/blkdev.h | 1 | ||||
-rw-r--r-- | include/linux/elevator.h | 2 |
18 files changed, 106 insertions, 137 deletions
diff --git a/Documentation/block/biodoc.txt b/Documentation/block/biodoc.txt index ac18b488cb5e..31c177663ed5 100644 --- a/Documentation/block/biodoc.txt +++ b/Documentation/block/biodoc.txt | |||
@@ -436,7 +436,6 @@ struct bio { | |||
436 | struct bvec_iter bi_iter; /* current index into bio_vec array */ | 436 | struct bvec_iter bi_iter; /* current index into bio_vec array */ |
437 | 437 | ||
438 | unsigned int bi_size; /* total size in bytes */ | 438 | unsigned int bi_size; /* total size in bytes */ |
439 | unsigned short bi_phys_segments; /* segments after physaddr coalesce*/ | ||
440 | unsigned short bi_hw_segments; /* segments after DMA remapping */ | 439 | unsigned short bi_hw_segments; /* segments after DMA remapping */ |
441 | unsigned int bi_max; /* max bio_vecs we can hold | 440 | unsigned int bi_max; /* max bio_vecs we can hold |
442 | used as index into pool */ | 441 | used as index into pool */ |
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index f8d430f88d25..a6bf842cbe16 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c | |||
@@ -2027,7 +2027,8 @@ static void bfq_remove_request(struct request_queue *q, | |||
2027 | 2027 | ||
2028 | } | 2028 | } |
2029 | 2029 | ||
2030 | static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio) | 2030 | static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio, |
2031 | unsigned int nr_segs) | ||
2031 | { | 2032 | { |
2032 | struct request_queue *q = hctx->queue; | 2033 | struct request_queue *q = hctx->queue; |
2033 | struct bfq_data *bfqd = q->elevator->elevator_data; | 2034 | struct bfq_data *bfqd = q->elevator->elevator_data; |
@@ -2050,7 +2051,7 @@ static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio) | |||
2050 | bfqd->bio_bfqq = NULL; | 2051 | bfqd->bio_bfqq = NULL; |
2051 | bfqd->bio_bic = bic; | 2052 | bfqd->bio_bic = bic; |
2052 | 2053 | ||
2053 | ret = blk_mq_sched_try_merge(q, bio, &free); | 2054 | ret = blk_mq_sched_try_merge(q, bio, nr_segs, &free); |
2054 | 2055 | ||
2055 | if (free) | 2056 | if (free) |
2056 | blk_mq_free_request(free); | 2057 | blk_mq_free_request(free); |
diff --git a/block/bio.c b/block/bio.c index 4bcdcd3f63f4..ad9c3aa9bf7d 100644 --- a/block/bio.c +++ b/block/bio.c | |||
@@ -558,14 +558,6 @@ void bio_put(struct bio *bio) | |||
558 | } | 558 | } |
559 | EXPORT_SYMBOL(bio_put); | 559 | EXPORT_SYMBOL(bio_put); |
560 | 560 | ||
561 | int bio_phys_segments(struct request_queue *q, struct bio *bio) | ||
562 | { | ||
563 | if (unlikely(!bio_flagged(bio, BIO_SEG_VALID))) | ||
564 | blk_recount_segments(q, bio); | ||
565 | |||
566 | return bio->bi_phys_segments; | ||
567 | } | ||
568 | |||
569 | /** | 561 | /** |
570 | * __bio_clone_fast - clone a bio that shares the original bio's biovec | 562 | * __bio_clone_fast - clone a bio that shares the original bio's biovec |
571 | * @bio: destination bio | 563 | * @bio: destination bio |
@@ -739,7 +731,7 @@ static int __bio_add_pc_page(struct request_queue *q, struct bio *bio, | |||
739 | if (bio_full(bio)) | 731 | if (bio_full(bio)) |
740 | return 0; | 732 | return 0; |
741 | 733 | ||
742 | if (bio->bi_phys_segments >= queue_max_segments(q)) | 734 | if (bio->bi_vcnt >= queue_max_segments(q)) |
743 | return 0; | 735 | return 0; |
744 | 736 | ||
745 | bvec = &bio->bi_io_vec[bio->bi_vcnt]; | 737 | bvec = &bio->bi_io_vec[bio->bi_vcnt]; |
@@ -749,8 +741,6 @@ static int __bio_add_pc_page(struct request_queue *q, struct bio *bio, | |||
749 | bio->bi_vcnt++; | 741 | bio->bi_vcnt++; |
750 | done: | 742 | done: |
751 | bio->bi_iter.bi_size += len; | 743 | bio->bi_iter.bi_size += len; |
752 | bio->bi_phys_segments = bio->bi_vcnt; | ||
753 | bio_set_flag(bio, BIO_SEG_VALID); | ||
754 | return len; | 744 | return len; |
755 | } | 745 | } |
756 | 746 | ||
@@ -1909,10 +1899,7 @@ void bio_trim(struct bio *bio, int offset, int size) | |||
1909 | if (offset == 0 && size == bio->bi_iter.bi_size) | 1899 | if (offset == 0 && size == bio->bi_iter.bi_size) |
1910 | return; | 1900 | return; |
1911 | 1901 | ||
1912 | bio_clear_flag(bio, BIO_SEG_VALID); | ||
1913 | |||
1914 | bio_advance(bio, offset << 9); | 1902 | bio_advance(bio, offset << 9); |
1915 | |||
1916 | bio->bi_iter.bi_size = size; | 1903 | bio->bi_iter.bi_size = size; |
1917 | 1904 | ||
1918 | if (bio_integrity(bio)) | 1905 | if (bio_integrity(bio)) |
diff --git a/block/blk-core.c b/block/blk-core.c index d1c7c69a20dd..ef998a724b27 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -550,15 +550,15 @@ void blk_put_request(struct request *req) | |||
550 | } | 550 | } |
551 | EXPORT_SYMBOL(blk_put_request); | 551 | EXPORT_SYMBOL(blk_put_request); |
552 | 552 | ||
553 | bool bio_attempt_back_merge(struct request_queue *q, struct request *req, | 553 | bool bio_attempt_back_merge(struct request *req, struct bio *bio, |
554 | struct bio *bio) | 554 | unsigned int nr_segs) |
555 | { | 555 | { |
556 | const int ff = bio->bi_opf & REQ_FAILFAST_MASK; | 556 | const int ff = bio->bi_opf & REQ_FAILFAST_MASK; |
557 | 557 | ||
558 | if (!ll_back_merge_fn(q, req, bio)) | 558 | if (!ll_back_merge_fn(req, bio, nr_segs)) |
559 | return false; | 559 | return false; |
560 | 560 | ||
561 | trace_block_bio_backmerge(q, req, bio); | 561 | trace_block_bio_backmerge(req->q, req, bio); |
562 | 562 | ||
563 | if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff) | 563 | if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff) |
564 | blk_rq_set_mixed_merge(req); | 564 | blk_rq_set_mixed_merge(req); |
@@ -571,15 +571,15 @@ bool bio_attempt_back_merge(struct request_queue *q, struct request *req, | |||
571 | return true; | 571 | return true; |
572 | } | 572 | } |
573 | 573 | ||
574 | bool bio_attempt_front_merge(struct request_queue *q, struct request *req, | 574 | bool bio_attempt_front_merge(struct request *req, struct bio *bio, |
575 | struct bio *bio) | 575 | unsigned int nr_segs) |
576 | { | 576 | { |
577 | const int ff = bio->bi_opf & REQ_FAILFAST_MASK; | 577 | const int ff = bio->bi_opf & REQ_FAILFAST_MASK; |
578 | 578 | ||
579 | if (!ll_front_merge_fn(q, req, bio)) | 579 | if (!ll_front_merge_fn(req, bio, nr_segs)) |
580 | return false; | 580 | return false; |
581 | 581 | ||
582 | trace_block_bio_frontmerge(q, req, bio); | 582 | trace_block_bio_frontmerge(req->q, req, bio); |
583 | 583 | ||
584 | if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff) | 584 | if ((req->cmd_flags & REQ_FAILFAST_MASK) != ff) |
585 | blk_rq_set_mixed_merge(req); | 585 | blk_rq_set_mixed_merge(req); |
@@ -621,6 +621,7 @@ no_merge: | |||
621 | * blk_attempt_plug_merge - try to merge with %current's plugged list | 621 | * blk_attempt_plug_merge - try to merge with %current's plugged list |
622 | * @q: request_queue new bio is being queued at | 622 | * @q: request_queue new bio is being queued at |
623 | * @bio: new bio being queued | 623 | * @bio: new bio being queued |
624 | * @nr_segs: number of segments in @bio | ||
624 | * @same_queue_rq: pointer to &struct request that gets filled in when | 625 | * @same_queue_rq: pointer to &struct request that gets filled in when |
625 | * another request associated with @q is found on the plug list | 626 | * another request associated with @q is found on the plug list |
626 | * (optional, may be %NULL) | 627 | * (optional, may be %NULL) |
@@ -639,7 +640,7 @@ no_merge: | |||
639 | * Caller must ensure !blk_queue_nomerges(q) beforehand. | 640 | * Caller must ensure !blk_queue_nomerges(q) beforehand. |
640 | */ | 641 | */ |
641 | bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio, | 642 | bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio, |
642 | struct request **same_queue_rq) | 643 | unsigned int nr_segs, struct request **same_queue_rq) |
643 | { | 644 | { |
644 | struct blk_plug *plug; | 645 | struct blk_plug *plug; |
645 | struct request *rq; | 646 | struct request *rq; |
@@ -668,10 +669,10 @@ bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio, | |||
668 | 669 | ||
669 | switch (blk_try_merge(rq, bio)) { | 670 | switch (blk_try_merge(rq, bio)) { |
670 | case ELEVATOR_BACK_MERGE: | 671 | case ELEVATOR_BACK_MERGE: |
671 | merged = bio_attempt_back_merge(q, rq, bio); | 672 | merged = bio_attempt_back_merge(rq, bio, nr_segs); |
672 | break; | 673 | break; |
673 | case ELEVATOR_FRONT_MERGE: | 674 | case ELEVATOR_FRONT_MERGE: |
674 | merged = bio_attempt_front_merge(q, rq, bio); | 675 | merged = bio_attempt_front_merge(rq, bio, nr_segs); |
675 | break; | 676 | break; |
676 | case ELEVATOR_DISCARD_MERGE: | 677 | case ELEVATOR_DISCARD_MERGE: |
677 | merged = bio_attempt_discard_merge(q, rq, bio); | 678 | merged = bio_attempt_discard_merge(q, rq, bio); |
@@ -1427,14 +1428,9 @@ bool blk_update_request(struct request *req, blk_status_t error, | |||
1427 | } | 1428 | } |
1428 | EXPORT_SYMBOL_GPL(blk_update_request); | 1429 | EXPORT_SYMBOL_GPL(blk_update_request); |
1429 | 1430 | ||
1430 | void blk_rq_bio_prep(struct request_queue *q, struct request *rq, | 1431 | void blk_rq_bio_prep(struct request *rq, struct bio *bio, unsigned int nr_segs) |
1431 | struct bio *bio) | ||
1432 | { | 1432 | { |
1433 | if (bio_has_data(bio)) | 1433 | rq->nr_phys_segments = nr_segs; |
1434 | rq->nr_phys_segments = bio_phys_segments(q, bio); | ||
1435 | else if (bio_op(bio) == REQ_OP_DISCARD) | ||
1436 | rq->nr_phys_segments = 1; | ||
1437 | |||
1438 | rq->__data_len = bio->bi_iter.bi_size; | 1434 | rq->__data_len = bio->bi_iter.bi_size; |
1439 | rq->bio = rq->biotail = bio; | 1435 | rq->bio = rq->biotail = bio; |
1440 | rq->ioprio = bio_prio(bio); | 1436 | rq->ioprio = bio_prio(bio); |
diff --git a/block/blk-map.c b/block/blk-map.c index db9373bd31ac..3a62e471d81b 100644 --- a/block/blk-map.c +++ b/block/blk-map.c | |||
@@ -18,13 +18,19 @@ | |||
18 | int blk_rq_append_bio(struct request *rq, struct bio **bio) | 18 | int blk_rq_append_bio(struct request *rq, struct bio **bio) |
19 | { | 19 | { |
20 | struct bio *orig_bio = *bio; | 20 | struct bio *orig_bio = *bio; |
21 | struct bvec_iter iter; | ||
22 | struct bio_vec bv; | ||
23 | unsigned int nr_segs = 0; | ||
21 | 24 | ||
22 | blk_queue_bounce(rq->q, bio); | 25 | blk_queue_bounce(rq->q, bio); |
23 | 26 | ||
27 | bio_for_each_bvec(bv, *bio, iter) | ||
28 | nr_segs++; | ||
29 | |||
24 | if (!rq->bio) { | 30 | if (!rq->bio) { |
25 | blk_rq_bio_prep(rq->q, rq, *bio); | 31 | blk_rq_bio_prep(rq, *bio, nr_segs); |
26 | } else { | 32 | } else { |
27 | if (!ll_back_merge_fn(rq->q, rq, *bio)) { | 33 | if (!ll_back_merge_fn(rq, *bio, nr_segs)) { |
28 | if (orig_bio != *bio) { | 34 | if (orig_bio != *bio) { |
29 | bio_put(*bio); | 35 | bio_put(*bio); |
30 | *bio = orig_bio; | 36 | *bio = orig_bio; |
diff --git a/block/blk-merge.c b/block/blk-merge.c index 17713d7d98d5..72b4fd89a22d 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
@@ -258,32 +258,29 @@ split: | |||
258 | return do_split ? new : NULL; | 258 | return do_split ? new : NULL; |
259 | } | 259 | } |
260 | 260 | ||
261 | void blk_queue_split(struct request_queue *q, struct bio **bio) | 261 | void __blk_queue_split(struct request_queue *q, struct bio **bio, |
262 | unsigned int *nr_segs) | ||
262 | { | 263 | { |
263 | struct bio *split, *res; | 264 | struct bio *split; |
264 | unsigned nsegs; | ||
265 | 265 | ||
266 | switch (bio_op(*bio)) { | 266 | switch (bio_op(*bio)) { |
267 | case REQ_OP_DISCARD: | 267 | case REQ_OP_DISCARD: |
268 | case REQ_OP_SECURE_ERASE: | 268 | case REQ_OP_SECURE_ERASE: |
269 | split = blk_bio_discard_split(q, *bio, &q->bio_split, &nsegs); | 269 | split = blk_bio_discard_split(q, *bio, &q->bio_split, nr_segs); |
270 | break; | 270 | break; |
271 | case REQ_OP_WRITE_ZEROES: | 271 | case REQ_OP_WRITE_ZEROES: |
272 | split = blk_bio_write_zeroes_split(q, *bio, &q->bio_split, &nsegs); | 272 | split = blk_bio_write_zeroes_split(q, *bio, &q->bio_split, |
273 | nr_segs); | ||
273 | break; | 274 | break; |
274 | case REQ_OP_WRITE_SAME: | 275 | case REQ_OP_WRITE_SAME: |
275 | split = blk_bio_write_same_split(q, *bio, &q->bio_split, &nsegs); | 276 | split = blk_bio_write_same_split(q, *bio, &q->bio_split, |
277 | nr_segs); | ||
276 | break; | 278 | break; |
277 | default: | 279 | default: |
278 | split = blk_bio_segment_split(q, *bio, &q->bio_split, &nsegs); | 280 | split = blk_bio_segment_split(q, *bio, &q->bio_split, nr_segs); |
279 | break; | 281 | break; |
280 | } | 282 | } |
281 | 283 | ||
282 | /* physical segments can be figured out during splitting */ | ||
283 | res = split ? split : *bio; | ||
284 | res->bi_phys_segments = nsegs; | ||
285 | bio_set_flag(res, BIO_SEG_VALID); | ||
286 | |||
287 | if (split) { | 284 | if (split) { |
288 | /* there isn't chance to merge the splitted bio */ | 285 | /* there isn't chance to merge the splitted bio */ |
289 | split->bi_opf |= REQ_NOMERGE; | 286 | split->bi_opf |= REQ_NOMERGE; |
@@ -304,6 +301,13 @@ void blk_queue_split(struct request_queue *q, struct bio **bio) | |||
304 | *bio = split; | 301 | *bio = split; |
305 | } | 302 | } |
306 | } | 303 | } |
304 | |||
305 | void blk_queue_split(struct request_queue *q, struct bio **bio) | ||
306 | { | ||
307 | unsigned int nr_segs; | ||
308 | |||
309 | __blk_queue_split(q, bio, &nr_segs); | ||
310 | } | ||
307 | EXPORT_SYMBOL(blk_queue_split); | 311 | EXPORT_SYMBOL(blk_queue_split); |
308 | 312 | ||
309 | static unsigned int __blk_recalc_rq_segments(struct request_queue *q, | 313 | static unsigned int __blk_recalc_rq_segments(struct request_queue *q, |
@@ -338,17 +342,6 @@ void blk_recalc_rq_segments(struct request *rq) | |||
338 | rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio); | 342 | rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio); |
339 | } | 343 | } |
340 | 344 | ||
341 | void blk_recount_segments(struct request_queue *q, struct bio *bio) | ||
342 | { | ||
343 | struct bio *nxt = bio->bi_next; | ||
344 | |||
345 | bio->bi_next = NULL; | ||
346 | bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio); | ||
347 | bio->bi_next = nxt; | ||
348 | |||
349 | bio_set_flag(bio, BIO_SEG_VALID); | ||
350 | } | ||
351 | |||
352 | static inline struct scatterlist *blk_next_sg(struct scatterlist **sg, | 345 | static inline struct scatterlist *blk_next_sg(struct scatterlist **sg, |
353 | struct scatterlist *sglist) | 346 | struct scatterlist *sglist) |
354 | { | 347 | { |
@@ -519,16 +512,13 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, | |||
519 | } | 512 | } |
520 | EXPORT_SYMBOL(blk_rq_map_sg); | 513 | EXPORT_SYMBOL(blk_rq_map_sg); |
521 | 514 | ||
522 | static inline int ll_new_hw_segment(struct request_queue *q, | 515 | static inline int ll_new_hw_segment(struct request *req, struct bio *bio, |
523 | struct request *req, | 516 | unsigned int nr_phys_segs) |
524 | struct bio *bio) | ||
525 | { | 517 | { |
526 | int nr_phys_segs = bio_phys_segments(q, bio); | 518 | if (req->nr_phys_segments + nr_phys_segs > queue_max_segments(req->q)) |
527 | |||
528 | if (req->nr_phys_segments + nr_phys_segs > queue_max_segments(q)) | ||
529 | goto no_merge; | 519 | goto no_merge; |
530 | 520 | ||
531 | if (blk_integrity_merge_bio(q, req, bio) == false) | 521 | if (blk_integrity_merge_bio(req->q, req, bio) == false) |
532 | goto no_merge; | 522 | goto no_merge; |
533 | 523 | ||
534 | /* | 524 | /* |
@@ -539,12 +529,11 @@ static inline int ll_new_hw_segment(struct request_queue *q, | |||
539 | return 1; | 529 | return 1; |
540 | 530 | ||
541 | no_merge: | 531 | no_merge: |
542 | req_set_nomerge(q, req); | 532 | req_set_nomerge(req->q, req); |
543 | return 0; | 533 | return 0; |
544 | } | 534 | } |
545 | 535 | ||
546 | int ll_back_merge_fn(struct request_queue *q, struct request *req, | 536 | int ll_back_merge_fn(struct request *req, struct bio *bio, unsigned int nr_segs) |
547 | struct bio *bio) | ||
548 | { | 537 | { |
549 | if (req_gap_back_merge(req, bio)) | 538 | if (req_gap_back_merge(req, bio)) |
550 | return 0; | 539 | return 0; |
@@ -553,21 +542,15 @@ int ll_back_merge_fn(struct request_queue *q, struct request *req, | |||
553 | return 0; | 542 | return 0; |
554 | if (blk_rq_sectors(req) + bio_sectors(bio) > | 543 | if (blk_rq_sectors(req) + bio_sectors(bio) > |
555 | blk_rq_get_max_sectors(req, blk_rq_pos(req))) { | 544 | blk_rq_get_max_sectors(req, blk_rq_pos(req))) { |
556 | req_set_nomerge(q, req); | 545 | req_set_nomerge(req->q, req); |
557 | return 0; | 546 | return 0; |
558 | } | 547 | } |
559 | if (!bio_flagged(req->biotail, BIO_SEG_VALID)) | ||
560 | blk_recount_segments(q, req->biotail); | ||
561 | if (!bio_flagged(bio, BIO_SEG_VALID)) | ||
562 | blk_recount_segments(q, bio); | ||
563 | 548 | ||
564 | return ll_new_hw_segment(q, req, bio); | 549 | return ll_new_hw_segment(req, bio, nr_segs); |
565 | } | 550 | } |
566 | 551 | ||
567 | int ll_front_merge_fn(struct request_queue *q, struct request *req, | 552 | int ll_front_merge_fn(struct request *req, struct bio *bio, unsigned int nr_segs) |
568 | struct bio *bio) | ||
569 | { | 553 | { |
570 | |||
571 | if (req_gap_front_merge(req, bio)) | 554 | if (req_gap_front_merge(req, bio)) |
572 | return 0; | 555 | return 0; |
573 | if (blk_integrity_rq(req) && | 556 | if (blk_integrity_rq(req) && |
@@ -575,15 +558,11 @@ int ll_front_merge_fn(struct request_queue *q, struct request *req, | |||
575 | return 0; | 558 | return 0; |
576 | if (blk_rq_sectors(req) + bio_sectors(bio) > | 559 | if (blk_rq_sectors(req) + bio_sectors(bio) > |
577 | blk_rq_get_max_sectors(req, bio->bi_iter.bi_sector)) { | 560 | blk_rq_get_max_sectors(req, bio->bi_iter.bi_sector)) { |
578 | req_set_nomerge(q, req); | 561 | req_set_nomerge(req->q, req); |
579 | return 0; | 562 | return 0; |
580 | } | 563 | } |
581 | if (!bio_flagged(bio, BIO_SEG_VALID)) | ||
582 | blk_recount_segments(q, bio); | ||
583 | if (!bio_flagged(req->bio, BIO_SEG_VALID)) | ||
584 | blk_recount_segments(q, req->bio); | ||
585 | 564 | ||
586 | return ll_new_hw_segment(q, req, bio); | 565 | return ll_new_hw_segment(req, bio, nr_segs); |
587 | } | 566 | } |
588 | 567 | ||
589 | static bool req_attempt_discard_merge(struct request_queue *q, struct request *req, | 568 | static bool req_attempt_discard_merge(struct request_queue *q, struct request *req, |
diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c index 2766066a15db..956a7aa9a637 100644 --- a/block/blk-mq-sched.c +++ b/block/blk-mq-sched.c | |||
@@ -224,7 +224,7 @@ void blk_mq_sched_dispatch_requests(struct blk_mq_hw_ctx *hctx) | |||
224 | } | 224 | } |
225 | 225 | ||
226 | bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, | 226 | bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, |
227 | struct request **merged_request) | 227 | unsigned int nr_segs, struct request **merged_request) |
228 | { | 228 | { |
229 | struct request *rq; | 229 | struct request *rq; |
230 | 230 | ||
@@ -232,7 +232,7 @@ bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, | |||
232 | case ELEVATOR_BACK_MERGE: | 232 | case ELEVATOR_BACK_MERGE: |
233 | if (!blk_mq_sched_allow_merge(q, rq, bio)) | 233 | if (!blk_mq_sched_allow_merge(q, rq, bio)) |
234 | return false; | 234 | return false; |
235 | if (!bio_attempt_back_merge(q, rq, bio)) | 235 | if (!bio_attempt_back_merge(rq, bio, nr_segs)) |
236 | return false; | 236 | return false; |
237 | *merged_request = attempt_back_merge(q, rq); | 237 | *merged_request = attempt_back_merge(q, rq); |
238 | if (!*merged_request) | 238 | if (!*merged_request) |
@@ -241,7 +241,7 @@ bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, | |||
241 | case ELEVATOR_FRONT_MERGE: | 241 | case ELEVATOR_FRONT_MERGE: |
242 | if (!blk_mq_sched_allow_merge(q, rq, bio)) | 242 | if (!blk_mq_sched_allow_merge(q, rq, bio)) |
243 | return false; | 243 | return false; |
244 | if (!bio_attempt_front_merge(q, rq, bio)) | 244 | if (!bio_attempt_front_merge(rq, bio, nr_segs)) |
245 | return false; | 245 | return false; |
246 | *merged_request = attempt_front_merge(q, rq); | 246 | *merged_request = attempt_front_merge(q, rq); |
247 | if (!*merged_request) | 247 | if (!*merged_request) |
@@ -260,7 +260,7 @@ EXPORT_SYMBOL_GPL(blk_mq_sched_try_merge); | |||
260 | * of them. | 260 | * of them. |
261 | */ | 261 | */ |
262 | bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list, | 262 | bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list, |
263 | struct bio *bio) | 263 | struct bio *bio, unsigned int nr_segs) |
264 | { | 264 | { |
265 | struct request *rq; | 265 | struct request *rq; |
266 | int checked = 8; | 266 | int checked = 8; |
@@ -277,11 +277,13 @@ bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list, | |||
277 | switch (blk_try_merge(rq, bio)) { | 277 | switch (blk_try_merge(rq, bio)) { |
278 | case ELEVATOR_BACK_MERGE: | 278 | case ELEVATOR_BACK_MERGE: |
279 | if (blk_mq_sched_allow_merge(q, rq, bio)) | 279 | if (blk_mq_sched_allow_merge(q, rq, bio)) |
280 | merged = bio_attempt_back_merge(q, rq, bio); | 280 | merged = bio_attempt_back_merge(rq, bio, |
281 | nr_segs); | ||
281 | break; | 282 | break; |
282 | case ELEVATOR_FRONT_MERGE: | 283 | case ELEVATOR_FRONT_MERGE: |
283 | if (blk_mq_sched_allow_merge(q, rq, bio)) | 284 | if (blk_mq_sched_allow_merge(q, rq, bio)) |
284 | merged = bio_attempt_front_merge(q, rq, bio); | 285 | merged = bio_attempt_front_merge(rq, bio, |
286 | nr_segs); | ||
285 | break; | 287 | break; |
286 | case ELEVATOR_DISCARD_MERGE: | 288 | case ELEVATOR_DISCARD_MERGE: |
287 | merged = bio_attempt_discard_merge(q, rq, bio); | 289 | merged = bio_attempt_discard_merge(q, rq, bio); |
@@ -304,13 +306,14 @@ EXPORT_SYMBOL_GPL(blk_mq_bio_list_merge); | |||
304 | */ | 306 | */ |
305 | static bool blk_mq_attempt_merge(struct request_queue *q, | 307 | static bool blk_mq_attempt_merge(struct request_queue *q, |
306 | struct blk_mq_hw_ctx *hctx, | 308 | struct blk_mq_hw_ctx *hctx, |
307 | struct blk_mq_ctx *ctx, struct bio *bio) | 309 | struct blk_mq_ctx *ctx, struct bio *bio, |
310 | unsigned int nr_segs) | ||
308 | { | 311 | { |
309 | enum hctx_type type = hctx->type; | 312 | enum hctx_type type = hctx->type; |
310 | 313 | ||
311 | lockdep_assert_held(&ctx->lock); | 314 | lockdep_assert_held(&ctx->lock); |
312 | 315 | ||
313 | if (blk_mq_bio_list_merge(q, &ctx->rq_lists[type], bio)) { | 316 | if (blk_mq_bio_list_merge(q, &ctx->rq_lists[type], bio, nr_segs)) { |
314 | ctx->rq_merged++; | 317 | ctx->rq_merged++; |
315 | return true; | 318 | return true; |
316 | } | 319 | } |
@@ -318,7 +321,8 @@ static bool blk_mq_attempt_merge(struct request_queue *q, | |||
318 | return false; | 321 | return false; |
319 | } | 322 | } |
320 | 323 | ||
321 | bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio) | 324 | bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio, |
325 | unsigned int nr_segs) | ||
322 | { | 326 | { |
323 | struct elevator_queue *e = q->elevator; | 327 | struct elevator_queue *e = q->elevator; |
324 | struct blk_mq_ctx *ctx = blk_mq_get_ctx(q); | 328 | struct blk_mq_ctx *ctx = blk_mq_get_ctx(q); |
@@ -328,7 +332,7 @@ bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio) | |||
328 | 332 | ||
329 | if (e && e->type->ops.bio_merge) { | 333 | if (e && e->type->ops.bio_merge) { |
330 | blk_mq_put_ctx(ctx); | 334 | blk_mq_put_ctx(ctx); |
331 | return e->type->ops.bio_merge(hctx, bio); | 335 | return e->type->ops.bio_merge(hctx, bio, nr_segs); |
332 | } | 336 | } |
333 | 337 | ||
334 | type = hctx->type; | 338 | type = hctx->type; |
@@ -336,7 +340,7 @@ bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio) | |||
336 | !list_empty_careful(&ctx->rq_lists[type])) { | 340 | !list_empty_careful(&ctx->rq_lists[type])) { |
337 | /* default per sw-queue merge */ | 341 | /* default per sw-queue merge */ |
338 | spin_lock(&ctx->lock); | 342 | spin_lock(&ctx->lock); |
339 | ret = blk_mq_attempt_merge(q, hctx, ctx, bio); | 343 | ret = blk_mq_attempt_merge(q, hctx, ctx, bio, nr_segs); |
340 | spin_unlock(&ctx->lock); | 344 | spin_unlock(&ctx->lock); |
341 | } | 345 | } |
342 | 346 | ||
diff --git a/block/blk-mq-sched.h b/block/blk-mq-sched.h index 3cf92cbbd8ac..cf22ab00fefb 100644 --- a/block/blk-mq-sched.h +++ b/block/blk-mq-sched.h | |||
@@ -12,8 +12,9 @@ void blk_mq_sched_assign_ioc(struct request *rq); | |||
12 | 12 | ||
13 | void blk_mq_sched_request_inserted(struct request *rq); | 13 | void blk_mq_sched_request_inserted(struct request *rq); |
14 | bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, | 14 | bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio, |
15 | struct request **merged_request); | 15 | unsigned int nr_segs, struct request **merged_request); |
16 | bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio); | 16 | bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio, |
17 | unsigned int nr_segs); | ||
17 | bool blk_mq_sched_try_insert_merge(struct request_queue *q, struct request *rq); | 18 | bool blk_mq_sched_try_insert_merge(struct request_queue *q, struct request *rq); |
18 | void blk_mq_sched_mark_restart_hctx(struct blk_mq_hw_ctx *hctx); | 19 | void blk_mq_sched_mark_restart_hctx(struct blk_mq_hw_ctx *hctx); |
19 | void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx); | 20 | void blk_mq_sched_restart(struct blk_mq_hw_ctx *hctx); |
@@ -31,12 +32,13 @@ void blk_mq_exit_sched(struct request_queue *q, struct elevator_queue *e); | |||
31 | void blk_mq_sched_free_requests(struct request_queue *q); | 32 | void blk_mq_sched_free_requests(struct request_queue *q); |
32 | 33 | ||
33 | static inline bool | 34 | static inline bool |
34 | blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio) | 35 | blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio, |
36 | unsigned int nr_segs) | ||
35 | { | 37 | { |
36 | if (blk_queue_nomerges(q) || !bio_mergeable(bio)) | 38 | if (blk_queue_nomerges(q) || !bio_mergeable(bio)) |
37 | return false; | 39 | return false; |
38 | 40 | ||
39 | return __blk_mq_sched_bio_merge(q, bio); | 41 | return __blk_mq_sched_bio_merge(q, bio, nr_segs); |
40 | } | 42 | } |
41 | 43 | ||
42 | static inline bool | 44 | static inline bool |
diff --git a/block/blk-mq.c b/block/blk-mq.c index 61457bffa55f..d89383847d09 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -1764,14 +1764,15 @@ void blk_mq_flush_plug_list(struct blk_plug *plug, bool from_schedule) | |||
1764 | } | 1764 | } |
1765 | } | 1765 | } |
1766 | 1766 | ||
1767 | static void blk_mq_bio_to_request(struct request *rq, struct bio *bio) | 1767 | static void blk_mq_bio_to_request(struct request *rq, struct bio *bio, |
1768 | unsigned int nr_segs) | ||
1768 | { | 1769 | { |
1769 | if (bio->bi_opf & REQ_RAHEAD) | 1770 | if (bio->bi_opf & REQ_RAHEAD) |
1770 | rq->cmd_flags |= REQ_FAILFAST_MASK; | 1771 | rq->cmd_flags |= REQ_FAILFAST_MASK; |
1771 | 1772 | ||
1772 | rq->__sector = bio->bi_iter.bi_sector; | 1773 | rq->__sector = bio->bi_iter.bi_sector; |
1773 | rq->write_hint = bio->bi_write_hint; | 1774 | rq->write_hint = bio->bi_write_hint; |
1774 | blk_rq_bio_prep(rq->q, rq, bio); | 1775 | blk_rq_bio_prep(rq, bio, nr_segs); |
1775 | 1776 | ||
1776 | blk_account_io_start(rq, true); | 1777 | blk_account_io_start(rq, true); |
1777 | } | 1778 | } |
@@ -1941,20 +1942,20 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) | |||
1941 | struct request *rq; | 1942 | struct request *rq; |
1942 | struct blk_plug *plug; | 1943 | struct blk_plug *plug; |
1943 | struct request *same_queue_rq = NULL; | 1944 | struct request *same_queue_rq = NULL; |
1945 | unsigned int nr_segs; | ||
1944 | blk_qc_t cookie; | 1946 | blk_qc_t cookie; |
1945 | 1947 | ||
1946 | blk_queue_bounce(q, &bio); | 1948 | blk_queue_bounce(q, &bio); |
1947 | 1949 | __blk_queue_split(q, &bio, &nr_segs); | |
1948 | blk_queue_split(q, &bio); | ||
1949 | 1950 | ||
1950 | if (!bio_integrity_prep(bio)) | 1951 | if (!bio_integrity_prep(bio)) |
1951 | return BLK_QC_T_NONE; | 1952 | return BLK_QC_T_NONE; |
1952 | 1953 | ||
1953 | if (!is_flush_fua && !blk_queue_nomerges(q) && | 1954 | if (!is_flush_fua && !blk_queue_nomerges(q) && |
1954 | blk_attempt_plug_merge(q, bio, &same_queue_rq)) | 1955 | blk_attempt_plug_merge(q, bio, nr_segs, &same_queue_rq)) |
1955 | return BLK_QC_T_NONE; | 1956 | return BLK_QC_T_NONE; |
1956 | 1957 | ||
1957 | if (blk_mq_sched_bio_merge(q, bio)) | 1958 | if (blk_mq_sched_bio_merge(q, bio, nr_segs)) |
1958 | return BLK_QC_T_NONE; | 1959 | return BLK_QC_T_NONE; |
1959 | 1960 | ||
1960 | rq_qos_throttle(q, bio); | 1961 | rq_qos_throttle(q, bio); |
@@ -1977,7 +1978,7 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) | |||
1977 | plug = current->plug; | 1978 | plug = current->plug; |
1978 | if (unlikely(is_flush_fua)) { | 1979 | if (unlikely(is_flush_fua)) { |
1979 | blk_mq_put_ctx(data.ctx); | 1980 | blk_mq_put_ctx(data.ctx); |
1980 | blk_mq_bio_to_request(rq, bio); | 1981 | blk_mq_bio_to_request(rq, bio, nr_segs); |
1981 | 1982 | ||
1982 | /* bypass scheduler for flush rq */ | 1983 | /* bypass scheduler for flush rq */ |
1983 | blk_insert_flush(rq); | 1984 | blk_insert_flush(rq); |
@@ -1991,7 +1992,7 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) | |||
1991 | struct request *last = NULL; | 1992 | struct request *last = NULL; |
1992 | 1993 | ||
1993 | blk_mq_put_ctx(data.ctx); | 1994 | blk_mq_put_ctx(data.ctx); |
1994 | blk_mq_bio_to_request(rq, bio); | 1995 | blk_mq_bio_to_request(rq, bio, nr_segs); |
1995 | 1996 | ||
1996 | if (!request_count) | 1997 | if (!request_count) |
1997 | trace_block_plug(q); | 1998 | trace_block_plug(q); |
@@ -2006,7 +2007,7 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) | |||
2006 | 2007 | ||
2007 | blk_add_rq_to_plug(plug, rq); | 2008 | blk_add_rq_to_plug(plug, rq); |
2008 | } else if (plug && !blk_queue_nomerges(q)) { | 2009 | } else if (plug && !blk_queue_nomerges(q)) { |
2009 | blk_mq_bio_to_request(rq, bio); | 2010 | blk_mq_bio_to_request(rq, bio, nr_segs); |
2010 | 2011 | ||
2011 | /* | 2012 | /* |
2012 | * We do limited plugging. If the bio can be merged, do that. | 2013 | * We do limited plugging. If the bio can be merged, do that. |
@@ -2035,11 +2036,11 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) | |||
2035 | } else if ((q->nr_hw_queues > 1 && is_sync) || (!q->elevator && | 2036 | } else if ((q->nr_hw_queues > 1 && is_sync) || (!q->elevator && |
2036 | !data.hctx->dispatch_busy)) { | 2037 | !data.hctx->dispatch_busy)) { |
2037 | blk_mq_put_ctx(data.ctx); | 2038 | blk_mq_put_ctx(data.ctx); |
2038 | blk_mq_bio_to_request(rq, bio); | 2039 | blk_mq_bio_to_request(rq, bio, nr_segs); |
2039 | blk_mq_try_issue_directly(data.hctx, rq, &cookie); | 2040 | blk_mq_try_issue_directly(data.hctx, rq, &cookie); |
2040 | } else { | 2041 | } else { |
2041 | blk_mq_put_ctx(data.ctx); | 2042 | blk_mq_put_ctx(data.ctx); |
2042 | blk_mq_bio_to_request(rq, bio); | 2043 | blk_mq_bio_to_request(rq, bio, nr_segs); |
2043 | blk_mq_sched_insert_request(rq, false, true, true); | 2044 | blk_mq_sched_insert_request(rq, false, true, true); |
2044 | } | 2045 | } |
2045 | 2046 | ||
diff --git a/block/blk.h b/block/blk.h index 7814aa207153..a1d33cb65842 100644 --- a/block/blk.h +++ b/block/blk.h | |||
@@ -51,8 +51,7 @@ struct blk_flush_queue *blk_alloc_flush_queue(struct request_queue *q, | |||
51 | int node, int cmd_size, gfp_t flags); | 51 | int node, int cmd_size, gfp_t flags); |
52 | void blk_free_flush_queue(struct blk_flush_queue *q); | 52 | void blk_free_flush_queue(struct blk_flush_queue *q); |
53 | 53 | ||
54 | void blk_rq_bio_prep(struct request_queue *q, struct request *rq, | 54 | void blk_rq_bio_prep(struct request *rq, struct bio *bio, unsigned int nr_segs); |
55 | struct bio *bio); | ||
56 | void blk_freeze_queue(struct request_queue *q); | 55 | void blk_freeze_queue(struct request_queue *q); |
57 | 56 | ||
58 | static inline void blk_queue_enter_live(struct request_queue *q) | 57 | static inline void blk_queue_enter_live(struct request_queue *q) |
@@ -154,14 +153,14 @@ static inline bool bio_integrity_endio(struct bio *bio) | |||
154 | unsigned long blk_rq_timeout(unsigned long timeout); | 153 | unsigned long blk_rq_timeout(unsigned long timeout); |
155 | void blk_add_timer(struct request *req); | 154 | void blk_add_timer(struct request *req); |
156 | 155 | ||
157 | bool bio_attempt_front_merge(struct request_queue *q, struct request *req, | 156 | bool bio_attempt_front_merge(struct request *req, struct bio *bio, |
158 | struct bio *bio); | 157 | unsigned int nr_segs); |
159 | bool bio_attempt_back_merge(struct request_queue *q, struct request *req, | 158 | bool bio_attempt_back_merge(struct request *req, struct bio *bio, |
160 | struct bio *bio); | 159 | unsigned int nr_segs); |
161 | bool bio_attempt_discard_merge(struct request_queue *q, struct request *req, | 160 | bool bio_attempt_discard_merge(struct request_queue *q, struct request *req, |
162 | struct bio *bio); | 161 | struct bio *bio); |
163 | bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio, | 162 | bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio, |
164 | struct request **same_queue_rq); | 163 | unsigned int nr_segs, struct request **same_queue_rq); |
165 | 164 | ||
166 | void blk_account_io_start(struct request *req, bool new_io); | 165 | void blk_account_io_start(struct request *req, bool new_io); |
167 | void blk_account_io_completion(struct request *req, unsigned int bytes); | 166 | void blk_account_io_completion(struct request *req, unsigned int bytes); |
@@ -202,10 +201,12 @@ static inline int blk_should_fake_timeout(struct request_queue *q) | |||
202 | } | 201 | } |
203 | #endif | 202 | #endif |
204 | 203 | ||
205 | int ll_back_merge_fn(struct request_queue *q, struct request *req, | 204 | void __blk_queue_split(struct request_queue *q, struct bio **bio, |
206 | struct bio *bio); | 205 | unsigned int *nr_segs); |
207 | int ll_front_merge_fn(struct request_queue *q, struct request *req, | 206 | int ll_back_merge_fn(struct request *req, struct bio *bio, |
208 | struct bio *bio); | 207 | unsigned int nr_segs); |
208 | int ll_front_merge_fn(struct request *req, struct bio *bio, | ||
209 | unsigned int nr_segs); | ||
209 | struct request *attempt_back_merge(struct request_queue *q, struct request *rq); | 210 | struct request *attempt_back_merge(struct request_queue *q, struct request *rq); |
210 | struct request *attempt_front_merge(struct request_queue *q, struct request *rq); | 211 | struct request *attempt_front_merge(struct request_queue *q, struct request *rq); |
211 | int blk_attempt_req_merge(struct request_queue *q, struct request *rq, | 212 | int blk_attempt_req_merge(struct request_queue *q, struct request *rq, |
diff --git a/block/kyber-iosched.c b/block/kyber-iosched.c index c3b05119cebd..3c2602601741 100644 --- a/block/kyber-iosched.c +++ b/block/kyber-iosched.c | |||
@@ -562,7 +562,8 @@ static void kyber_limit_depth(unsigned int op, struct blk_mq_alloc_data *data) | |||
562 | } | 562 | } |
563 | } | 563 | } |
564 | 564 | ||
565 | static bool kyber_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio) | 565 | static bool kyber_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio, |
566 | unsigned int nr_segs) | ||
566 | { | 567 | { |
567 | struct kyber_hctx_data *khd = hctx->sched_data; | 568 | struct kyber_hctx_data *khd = hctx->sched_data; |
568 | struct blk_mq_ctx *ctx = blk_mq_get_ctx(hctx->queue); | 569 | struct blk_mq_ctx *ctx = blk_mq_get_ctx(hctx->queue); |
@@ -572,7 +573,7 @@ static bool kyber_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio) | |||
572 | bool merged; | 573 | bool merged; |
573 | 574 | ||
574 | spin_lock(&kcq->lock); | 575 | spin_lock(&kcq->lock); |
575 | merged = blk_mq_bio_list_merge(hctx->queue, rq_list, bio); | 576 | merged = blk_mq_bio_list_merge(hctx->queue, rq_list, bio, nr_segs); |
576 | spin_unlock(&kcq->lock); | 577 | spin_unlock(&kcq->lock); |
577 | blk_mq_put_ctx(ctx); | 578 | blk_mq_put_ctx(ctx); |
578 | 579 | ||
diff --git a/block/mq-deadline.c b/block/mq-deadline.c index 1876f5712bfd..b8a682b5a1bb 100644 --- a/block/mq-deadline.c +++ b/block/mq-deadline.c | |||
@@ -469,7 +469,8 @@ static int dd_request_merge(struct request_queue *q, struct request **rq, | |||
469 | return ELEVATOR_NO_MERGE; | 469 | return ELEVATOR_NO_MERGE; |
470 | } | 470 | } |
471 | 471 | ||
472 | static bool dd_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio) | 472 | static bool dd_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio, |
473 | unsigned int nr_segs) | ||
473 | { | 474 | { |
474 | struct request_queue *q = hctx->queue; | 475 | struct request_queue *q = hctx->queue; |
475 | struct deadline_data *dd = q->elevator->elevator_data; | 476 | struct deadline_data *dd = q->elevator->elevator_data; |
@@ -477,7 +478,7 @@ static bool dd_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio) | |||
477 | bool ret; | 478 | bool ret; |
478 | 479 | ||
479 | spin_lock(&dd->lock); | 480 | spin_lock(&dd->lock); |
480 | ret = blk_mq_sched_try_merge(q, bio, &free); | 481 | ret = blk_mq_sched_try_merge(q, bio, nr_segs, &free); |
481 | spin_unlock(&dd->lock); | 482 | spin_unlock(&dd->lock); |
482 | 483 | ||
483 | if (free) | 484 | if (free) |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index da94cbaa1a9e..3de4e13bde98 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -5251,7 +5251,6 @@ static int raid5_read_one_chunk(struct mddev *mddev, struct bio *raid_bio) | |||
5251 | rcu_read_unlock(); | 5251 | rcu_read_unlock(); |
5252 | raid_bio->bi_next = (void*)rdev; | 5252 | raid_bio->bi_next = (void*)rdev; |
5253 | bio_set_dev(align_bi, rdev->bdev); | 5253 | bio_set_dev(align_bi, rdev->bdev); |
5254 | bio_clear_flag(align_bi, BIO_SEG_VALID); | ||
5255 | 5254 | ||
5256 | if (is_badblock(rdev, align_bi->bi_iter.bi_sector, | 5255 | if (is_badblock(rdev, align_bi->bi_iter.bi_sector, |
5257 | bio_sectors(align_bi), | 5256 | bio_sectors(align_bi), |
diff --git a/include/linux/bio.h b/include/linux/bio.h index 0f23b5682640..ee11c4324751 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h | |||
@@ -408,7 +408,6 @@ static inline void bio_wouldblock_error(struct bio *bio) | |||
408 | } | 408 | } |
409 | 409 | ||
410 | struct request_queue; | 410 | struct request_queue; |
411 | extern int bio_phys_segments(struct request_queue *, struct bio *); | ||
412 | 411 | ||
413 | extern int submit_bio_wait(struct bio *bio); | 412 | extern int submit_bio_wait(struct bio *bio); |
414 | extern void bio_advance(struct bio *, unsigned); | 413 | extern void bio_advance(struct bio *, unsigned); |
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 15d1aa53d96c..3fa1fa59f9b2 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h | |||
@@ -306,7 +306,7 @@ void blk_mq_delay_kick_requeue_list(struct request_queue *q, unsigned long msecs | |||
306 | bool blk_mq_complete_request(struct request *rq); | 306 | bool blk_mq_complete_request(struct request *rq); |
307 | void blk_mq_complete_request_sync(struct request *rq); | 307 | void blk_mq_complete_request_sync(struct request *rq); |
308 | bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list, | 308 | bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list, |
309 | struct bio *bio); | 309 | struct bio *bio, unsigned int nr_segs); |
310 | bool blk_mq_queue_stopped(struct request_queue *q); | 310 | bool blk_mq_queue_stopped(struct request_queue *q); |
311 | void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx); | 311 | void blk_mq_stop_hw_queue(struct blk_mq_hw_ctx *hctx); |
312 | void blk_mq_start_hw_queue(struct blk_mq_hw_ctx *hctx); | 312 | void blk_mq_start_hw_queue(struct blk_mq_hw_ctx *hctx); |
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 95202f80676c..6a53799c3fe2 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h | |||
@@ -154,11 +154,6 @@ struct bio { | |||
154 | blk_status_t bi_status; | 154 | blk_status_t bi_status; |
155 | u8 bi_partno; | 155 | u8 bi_partno; |
156 | 156 | ||
157 | /* Number of segments in this BIO after | ||
158 | * physical address coalescing is performed. | ||
159 | */ | ||
160 | unsigned int bi_phys_segments; | ||
161 | |||
162 | struct bvec_iter bi_iter; | 157 | struct bvec_iter bi_iter; |
163 | 158 | ||
164 | atomic_t __bi_remaining; | 159 | atomic_t __bi_remaining; |
@@ -210,7 +205,6 @@ struct bio { | |||
210 | */ | 205 | */ |
211 | enum { | 206 | enum { |
212 | BIO_NO_PAGE_REF, /* don't put release vec pages */ | 207 | BIO_NO_PAGE_REF, /* don't put release vec pages */ |
213 | BIO_SEG_VALID, /* bi_phys_segments valid */ | ||
214 | BIO_CLONED, /* doesn't own data */ | 208 | BIO_CLONED, /* doesn't own data */ |
215 | BIO_BOUNCED, /* bio is a bounce bio */ | 209 | BIO_BOUNCED, /* bio is a bounce bio */ |
216 | BIO_USER_MAPPED, /* contains user pages */ | 210 | BIO_USER_MAPPED, /* contains user pages */ |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 2d4dfe82767a..d5d3bb45dfb6 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -841,7 +841,6 @@ extern blk_status_t blk_insert_cloned_request(struct request_queue *q, | |||
841 | struct request *rq); | 841 | struct request *rq); |
842 | extern int blk_rq_append_bio(struct request *rq, struct bio **bio); | 842 | extern int blk_rq_append_bio(struct request *rq, struct bio **bio); |
843 | extern void blk_queue_split(struct request_queue *, struct bio **); | 843 | extern void blk_queue_split(struct request_queue *, struct bio **); |
844 | extern void blk_recount_segments(struct request_queue *, struct bio *); | ||
845 | extern int scsi_verify_blk_ioctl(struct block_device *, unsigned int); | 844 | extern int scsi_verify_blk_ioctl(struct block_device *, unsigned int); |
846 | extern int scsi_cmd_blk_ioctl(struct block_device *, fmode_t, | 845 | extern int scsi_cmd_blk_ioctl(struct block_device *, fmode_t, |
847 | unsigned int, void __user *); | 846 | unsigned int, void __user *); |
diff --git a/include/linux/elevator.h b/include/linux/elevator.h index 6e8bc53740f0..169bb2e02516 100644 --- a/include/linux/elevator.h +++ b/include/linux/elevator.h | |||
@@ -34,7 +34,7 @@ struct elevator_mq_ops { | |||
34 | void (*depth_updated)(struct blk_mq_hw_ctx *); | 34 | void (*depth_updated)(struct blk_mq_hw_ctx *); |
35 | 35 | ||
36 | bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); | 36 | bool (*allow_merge)(struct request_queue *, struct request *, struct bio *); |
37 | bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *); | 37 | bool (*bio_merge)(struct blk_mq_hw_ctx *, struct bio *, unsigned int); |
38 | int (*request_merge)(struct request_queue *q, struct request **, struct bio *); | 38 | int (*request_merge)(struct request_queue *q, struct request **, struct bio *); |
39 | void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); | 39 | void (*request_merged)(struct request_queue *, struct request *, enum elv_merge); |
40 | void (*requests_merged)(struct request_queue *, struct request *, struct request *); | 40 | void (*requests_merged)(struct request_queue *, struct request *, struct request *); |