static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio *bio) { struct bio_vec *bv, *bvprv = NULL; int cluster, i, high, highprv = 1; unsigned int seg_size, nr_phys_segs; struct bio *fbio, *bbio; if (!bio) return 0; fbio = bio; cluster = blk_queue_cluster(q); seg_size = 0; nr_phys_segs = 0; for_each_bio(bio) { bio_for_each_segment(bv, bio, i) { /* */ high = page_to_pfn(bv->bv_page) > queue_bounce_pfn(q); if (high || highprv) goto new_segment; if (cluster) { if (seg_size + bv->bv_len > queue_max_segment_size(q)) goto new_segment; if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv)) goto new_segment; if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv)) goto new_segment; if ((bvprv->bv_page != bv->bv_page) && (bvprv->bv_page + 1) != bv->bv_page) goto new_segment; seg_size += bv->bv_len; bvprv = bv; continue; } new_segment: if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) fbio->bi_seg_front_size = seg_size; nr_phys_segs++; bvprv = bv; seg_size = bv->bv_len; highprv = high; } bbio = bio; }
static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio *bio) { unsigned int phys_size; struct bio_vec *bv, *bvprv = NULL; int cluster, i, high, highprv = 1; unsigned int seg_size, nr_phys_segs; struct bio *fbio, *bbio; if (!bio) return 0; fbio = bio; cluster = test_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags); seg_size = 0; phys_size = nr_phys_segs = 0; for_each_bio(bio) { bio_for_each_segment(bv, bio, i) { /* * the trick here is making sure that a high page is * never considered part of another segment, since that * might change with the bounce page. */ high = page_to_pfn(bv->bv_page) > queue_bounce_pfn(q); if (high || highprv) goto new_segment; if (cluster) { if (seg_size + bv->bv_len > queue_max_segment_size(q)) goto new_segment; if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv)) goto new_segment; if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv)) goto new_segment; seg_size += bv->bv_len; bvprv = bv; continue; } new_segment: if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) fbio->bi_seg_front_size = seg_size; nr_phys_segs++; bvprv = bv; seg_size = bv->bv_len; highprv = high; } bbio = bio; }
static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio *bio) { struct bio_vec bv, bvprv = { NULL }; int cluster, high, highprv = 1; unsigned int seg_size, nr_phys_segs; struct bio *fbio, *bbio; struct bvec_iter iter; if (!bio) return 0; fbio = bio; cluster = blk_queue_cluster(q); seg_size = 0; nr_phys_segs = 0; for_each_bio(bio) { bio_for_each_segment(bv, bio, iter) { /* * the trick here is making sure that a high page is * never considered part of another segment, since that * might change with the bounce page. */ high = page_to_pfn(bv.bv_page) > queue_bounce_pfn(q); if (!high && !highprv && cluster) { if (seg_size + bv.bv_len > queue_max_segment_size(q)) goto new_segment; if (!BIOVEC_PHYS_MERGEABLE(&bvprv, &bv)) goto new_segment; if (!BIOVEC_SEG_BOUNDARY(q, &bvprv, &bv)) goto new_segment; seg_size += bv.bv_len; bvprv = bv; continue; } new_segment: if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) fbio->bi_seg_front_size = seg_size; nr_phys_segs++; bvprv = bv; seg_size = bv.bv_len; highprv = high; } bbio = bio; }
static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio *bio) { struct bio_vec *bv, *bvprv = NULL; int cluster, i, high, highprv = 1; unsigned int seg_size, nr_phys_segs; struct bio *fbio, *bbio; if (!bio) return 0; fbio = bio; cluster = blk_queue_cluster(q); seg_size = 0; nr_phys_segs = 0; for_each_bio(bio) { bio_for_each_segment(bv, bio, i) { /* * the trick here is making sure that a high page is * never considered part of another segment, since that * might change with the bounce page. */ high = page_to_pfn(bv->bv_page) > queue_bounce_pfn(q); if (high || highprv) goto new_segment; if (cluster) { if (seg_size + bv->bv_len > queue_max_segment_size(q)) goto new_segment; if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv)) goto new_segment; if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv)) goto new_segment; <<<<<<< HEAD if ((bvprv->bv_page != bv->bv_page) && (bvprv->bv_page + 1) != bv->bv_page) goto new_segment; ======= <<<<<<< HEAD if ((bvprv->bv_page != bv->bv_page) && (bvprv->bv_page + 1) != bv->bv_page) goto new_segment; ======= >>>>>>> 58a75b6a81be54a8b491263ca1af243e9d8617b9 >>>>>>> ae1773bb70f3d7cf73324ce8fba787e01d8fa9f2
static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio *bio, bool no_sg_merge) { struct bio_vec bv, bvprv = { NULL }; int cluster, high, highprv = 1; unsigned int seg_size, nr_phys_segs; struct bio *fbio, *bbio; struct bvec_iter iter; if (!bio) return 0; /* * This should probably be returning 0, but blk_add_request_payload() * (Christoph!!!!) */ if (bio->bi_rw & REQ_DISCARD) return 1; if (bio->bi_rw & REQ_WRITE_SAME) return 1; fbio = bio; cluster = blk_queue_cluster(q); seg_size = 0; nr_phys_segs = 0; high = 0; for_each_bio(bio) { bio_for_each_segment(bv, bio, iter) { /* * If SG merging is disabled, each bio vector is * a segment */ if (no_sg_merge) goto new_segment; /* * the trick here is making sure that a high page is * never considered part of another segment, since * that might change with the bounce page. */ high = page_to_pfn(bv.bv_page) > queue_bounce_pfn(q); if (!high && !highprv && cluster) { if (seg_size + bv.bv_len > queue_max_segment_size(q)) goto new_segment; if (!BIOVEC_PHYS_MERGEABLE(&bvprv, &bv)) goto new_segment; if (!BIOVEC_SEG_BOUNDARY(q, &bvprv, &bv)) goto new_segment; seg_size += bv.bv_len; bvprv = bv; continue; } new_segment: if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) fbio->bi_seg_front_size = seg_size; nr_phys_segs++; bvprv = bv; seg_size = bv.bv_len; highprv = high; } bbio = bio; } if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) fbio->bi_seg_front_size = seg_size; if (seg_size > bbio->bi_seg_back_size) bbio->bi_seg_back_size = seg_size; return nr_phys_segs; }
static unsigned int __blk_recalc_rq_segments(struct request_queue *q, struct bio *bio, bool no_sg_merge) { struct bio_vec *bv, *bvprv = NULL; int cluster, i, high, highprv = 1; unsigned int seg_size, nr_phys_segs; struct bio *fbio, *bbio; if (!bio) return 0; fbio = bio; cluster = blk_queue_cluster(q); seg_size = 0; nr_phys_segs = 0; high = 0; for_each_bio(bio) { bio_for_each_segment(bv, bio, i) { /* * If SG merging is disabled, each bio vector is * a segment */ if (no_sg_merge) goto new_segment; /* * the trick here is making sure that a high page is * never considered part of another segment, since * that might change with the bounce page. */ high = page_to_pfn(bv->bv_page) > queue_bounce_pfn(q); if (high || highprv) goto new_segment; if (cluster) { if (seg_size + bv->bv_len > queue_max_segment_size(q)) goto new_segment; if (!BIOVEC_PHYS_MERGEABLE(bvprv, bv)) goto new_segment; if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bv)) goto new_segment; seg_size += bv->bv_len; bvprv = bv; continue; } new_segment: if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) fbio->bi_seg_front_size = seg_size; nr_phys_segs++; bvprv = bv; seg_size = bv->bv_len; highprv = high; } bbio = bio; } if (nr_phys_segs == 1 && seg_size > fbio->bi_seg_front_size) fbio->bi_seg_front_size = seg_size; if (seg_size > bbio->bi_seg_back_size) bbio->bi_seg_back_size = seg_size; return nr_phys_segs; }