@@ -473,137 +473,100 @@ unsigned int blk_recalc_rq_segments(struct request *rq)
473
473
return nr_phys_segs ;
474
474
}
475
475
476
- static inline struct scatterlist * blk_next_sg (struct scatterlist * * sg ,
477
- struct scatterlist * sglist )
478
- {
479
- if (!* sg )
480
- return sglist ;
476
+ struct phys_vec {
477
+ phys_addr_t paddr ;
478
+ u32 len ;
479
+ };
481
480
482
- /*
483
- * If the driver previously mapped a shorter list, we could see a
484
- * termination bit prematurely unless it fully inits the sg table
485
- * on each mapping. We KNOW that there must be more entries here
486
- * or the driver would be buggy, so force clear the termination bit
487
- * to avoid doing a full sg_init_table() in drivers for each command.
488
- */
489
- sg_unmark_end (* sg );
490
- return sg_next (* sg );
491
- }
492
-
493
- static unsigned blk_bvec_map_sg (struct request_queue * q ,
494
- struct bio_vec * bvec , struct scatterlist * sglist ,
495
- struct scatterlist * * sg )
481
+ static bool blk_map_iter_next (struct request * req ,
482
+ struct req_iterator * iter , struct phys_vec * vec )
496
483
{
497
- unsigned nbytes = bvec -> bv_len ;
498
- unsigned nsegs = 0 , total = 0 ;
499
-
500
- while (nbytes > 0 ) {
501
- unsigned offset = bvec -> bv_offset + total ;
502
- unsigned len = get_max_segment_size (& q -> limits ,
503
- bvec_phys (bvec ) + total , nbytes );
504
- struct page * page = bvec -> bv_page ;
505
-
506
- /*
507
- * Unfortunately a fair number of drivers barf on scatterlists
508
- * that have an offset larger than PAGE_SIZE, despite other
509
- * subsystems dealing with that invariant just fine. For now
510
- * stick to the legacy format where we never present those from
511
- * the block layer, but the code below should be removed once
512
- * these offenders (mostly MMC/SD drivers) are fixed.
513
- */
514
- page += (offset >> PAGE_SHIFT );
515
- offset &= ~PAGE_MASK ;
516
-
517
- * sg = blk_next_sg (sg , sglist );
518
- sg_set_page (* sg , page , len , offset );
484
+ unsigned int max_size ;
485
+ struct bio_vec bv ;
519
486
520
- total += len ;
521
- nbytes -= len ;
522
- nsegs ++ ;
487
+ if (req -> rq_flags & RQF_SPECIAL_PAYLOAD ) {
488
+ if (!iter -> bio )
489
+ return false;
490
+ vec -> paddr = bvec_phys (& req -> special_vec );
491
+ vec -> len = req -> special_vec .bv_len ;
492
+ iter -> bio = NULL ;
493
+ return true;
523
494
}
524
495
525
- return nsegs ;
526
- }
527
-
528
- static inline int __blk_bvec_map_sg (struct bio_vec bv ,
529
- struct scatterlist * sglist , struct scatterlist * * sg )
530
- {
531
- * sg = blk_next_sg (sg , sglist );
532
- sg_set_page (* sg , bv .bv_page , bv .bv_len , bv .bv_offset );
533
- return 1 ;
534
- }
535
-
536
- /* only try to merge bvecs into one sg if they are from two bios */
537
- static inline bool
538
- __blk_segment_map_sg_merge (struct request_queue * q , struct bio_vec * bvec ,
539
- struct bio_vec * bvprv , struct scatterlist * * sg )
540
- {
541
-
542
- int nbytes = bvec -> bv_len ;
543
-
544
- if (!* sg )
496
+ if (!iter -> iter .bi_size )
545
497
return false;
546
498
547
- if ((* sg )-> length + nbytes > queue_max_segment_size (q ))
548
- return false;
499
+ bv = mp_bvec_iter_bvec (iter -> bio -> bi_io_vec , iter -> iter );
500
+ vec -> paddr = bvec_phys (& bv );
501
+ max_size = get_max_segment_size (& req -> q -> limits , vec -> paddr , UINT_MAX );
502
+ bv .bv_len = min (bv .bv_len , max_size );
503
+ bio_advance_iter_single (iter -> bio , & iter -> iter , bv .bv_len );
549
504
550
- if (!biovec_phys_mergeable (q , bvprv , bvec ))
551
- return false;
505
+ /*
506
+ * If we are entirely done with this bi_io_vec entry, check if the next
507
+ * one could be merged into it. This typically happens when moving to
508
+ * the next bio, but some callers also don't pack bvecs tight.
509
+ */
510
+ while (!iter -> iter .bi_size || !iter -> iter .bi_bvec_done ) {
511
+ struct bio_vec next ;
512
+
513
+ if (!iter -> iter .bi_size ) {
514
+ if (!iter -> bio -> bi_next )
515
+ break ;
516
+ iter -> bio = iter -> bio -> bi_next ;
517
+ iter -> iter = iter -> bio -> bi_iter ;
518
+ }
552
519
553
- (* sg )-> length += nbytes ;
520
+ next = mp_bvec_iter_bvec (iter -> bio -> bi_io_vec , iter -> iter );
521
+ if (bv .bv_len + next .bv_len > max_size ||
522
+ !biovec_phys_mergeable (req -> q , & bv , & next ))
523
+ break ;
524
+
525
+ bv .bv_len += next .bv_len ;
526
+ bio_advance_iter_single (iter -> bio , & iter -> iter , next .bv_len );
527
+ }
554
528
529
+ vec -> len = bv .bv_len ;
555
530
return true;
556
531
}
557
532
558
- static int __blk_bios_map_sg (struct request_queue * q , struct bio * bio ,
559
- struct scatterlist * sglist ,
560
- struct scatterlist * * sg )
533
+ static inline struct scatterlist * blk_next_sg (struct scatterlist * * sg ,
534
+ struct scatterlist * sglist )
561
535
{
562
- struct bio_vec bvec , bvprv = { NULL };
563
- struct bvec_iter iter ;
564
- int nsegs = 0 ;
565
- bool new_bio = false;
566
-
567
- for_each_bio (bio ) {
568
- bio_for_each_bvec (bvec , bio , iter ) {
569
- /*
570
- * Only try to merge bvecs from two bios given we
571
- * have done bio internal merge when adding pages
572
- * to bio
573
- */
574
- if (new_bio &&
575
- __blk_segment_map_sg_merge (q , & bvec , & bvprv , sg ))
576
- goto next_bvec ;
577
-
578
- if (bvec .bv_offset + bvec .bv_len <= PAGE_SIZE )
579
- nsegs += __blk_bvec_map_sg (bvec , sglist , sg );
580
- else
581
- nsegs += blk_bvec_map_sg (q , & bvec , sglist , sg );
582
- next_bvec :
583
- new_bio = false;
584
- }
585
- if (likely (bio -> bi_iter .bi_size )) {
586
- bvprv = bvec ;
587
- new_bio = true;
588
- }
589
- }
536
+ if (!* sg )
537
+ return sglist ;
590
538
591
- return nsegs ;
539
+ /*
540
+ * If the driver previously mapped a shorter list, we could see a
541
+ * termination bit prematurely unless it fully inits the sg table
542
+ * on each mapping. We KNOW that there must be more entries here
543
+ * or the driver would be buggy, so force clear the termination bit
544
+ * to avoid doing a full sg_init_table() in drivers for each command.
545
+ */
546
+ sg_unmark_end (* sg );
547
+ return sg_next (* sg );
592
548
}
593
549
594
550
/*
595
- * map a request to scatterlist, return number of sg entries setup. Caller
596
- * must make sure sg can hold rq->nr_phys_segments entries
551
+ * Map a request to scatterlist, return number of sg entries setup. Caller
552
+ * must make sure sg can hold rq->nr_phys_segments entries.
597
553
*/
598
554
int __blk_rq_map_sg (struct request_queue * q , struct request * rq ,
599
555
struct scatterlist * sglist , struct scatterlist * * last_sg )
600
556
{
557
+ struct req_iterator iter = {
558
+ .bio = rq -> bio ,
559
+ .iter = rq -> bio -> bi_iter ,
560
+ };
561
+ struct phys_vec vec ;
601
562
int nsegs = 0 ;
602
563
603
- if (rq -> rq_flags & RQF_SPECIAL_PAYLOAD )
604
- nsegs = __blk_bvec_map_sg (rq -> special_vec , sglist , last_sg );
605
- else if (rq -> bio )
606
- nsegs = __blk_bios_map_sg (q , rq -> bio , sglist , last_sg );
564
+ while (blk_map_iter_next (rq , & iter , & vec )) {
565
+ * last_sg = blk_next_sg (last_sg , sglist );
566
+ sg_set_page (* last_sg , phys_to_page (vec .paddr ), vec .len ,
567
+ offset_in_page (vec .paddr ));
568
+ nsegs ++ ;
569
+ }
607
570
608
571
if (* last_sg )
609
572
sg_mark_end (* last_sg );
0 commit comments