Skip to content

Commit d92dc6e

Browse files
keithbuschkawasaki
authored andcommitted
blk-mq-dma: set the bvec being iterated
This will make it easier to add different bvec sources, like for upcoming integrity support. It also makes iterating "special" payloads more common with iterating normal data bi_io_vecs. Signed-off-by: Keith Busch <[email protected]>
1 parent a846f97 commit d92dc6e

2 files changed

Lines changed: 17 additions & 14 deletions

File tree

block/blk-mq-dma.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,17 @@ static bool blk_map_iter_next(struct request *req, struct blk_dma_iter *iter,
1616
unsigned int max_size;
1717
struct bio_vec bv;
1818

19-
if (req->rq_flags & RQF_SPECIAL_PAYLOAD) {
20-
if (!iter->bio)
21-
return false;
22-
vec->paddr = bvec_phys(&req->special_vec);
23-
vec->len = req->special_vec.bv_len;
24-
iter->bio = NULL;
25-
return true;
26-
}
27-
2819
if (!iter->iter.bi_size)
2920
return false;
3021

31-
bv = mp_bvec_iter_bvec(iter->bio->bi_io_vec, iter->iter);
22+
bv = mp_bvec_iter_bvec(iter->bvec, iter->iter);
3223
vec->paddr = bvec_phys(&bv);
3324
max_size = get_max_segment_size(&req->q->limits, vec->paddr, UINT_MAX);
3425
bv.bv_len = min(bv.bv_len, max_size);
35-
bio_advance_iter_single(iter->bio, &iter->iter, bv.bv_len);
26+
bvec_iter_advance_single(iter->bvec, &iter->iter, bv.bv_len);
27+
28+
if (req->rq_flags & RQF_SPECIAL_PAYLOAD)
29+
return true;
3630

3731
/*
3832
* If we are entirely done with this bi_io_vec entry, check if the next
@@ -47,15 +41,16 @@ static bool blk_map_iter_next(struct request *req, struct blk_dma_iter *iter,
4741
break;
4842
iter->bio = iter->bio->bi_next;
4943
iter->iter = iter->bio->bi_iter;
44+
iter->bvec = iter->bio->bi_io_vec;
5045
}
5146

52-
next = mp_bvec_iter_bvec(iter->bio->bi_io_vec, iter->iter);
47+
next = mp_bvec_iter_bvec(iter->bvec, iter->iter);
5348
if (bv.bv_len + next.bv_len > max_size ||
5449
!biovec_phys_mergeable(req->q, &bv, &next))
5550
break;
5651

5752
bv.bv_len += next.bv_len;
58-
bio_advance_iter_single(iter->bio, &iter->iter, next.bv_len);
53+
bvec_iter_advance_single(iter->bvec, &iter->iter, next.bv_len);
5954
}
6055

6156
vec->len = bv.bv_len;
@@ -158,6 +153,11 @@ bool blk_rq_dma_map_iter_start(struct request *req, struct device *dma_dev,
158153
memset(&iter->p2pdma, 0, sizeof(iter->p2pdma));
159154
iter->status = BLK_STS_OK;
160155

156+
if (req->rq_flags & RQF_SPECIAL_PAYLOAD)
157+
iter->bvec = &req->special_vec;
158+
else
159+
iter->bvec = req->bio->bi_io_vec;
160+
161161
/*
162162
* Grab the first segment ASAP because we'll need it to check for P2P
163163
* transfers.
@@ -253,8 +253,10 @@ int __blk_rq_map_sg(struct request *rq, struct scatterlist *sglist,
253253
int nsegs = 0;
254254

255255
/* the internal flush request may not have bio attached */
256-
if (iter.bio)
256+
if (iter.bio) {
257257
iter.iter = iter.bio->bi_iter;
258+
iter.bvec = iter.bio->bi_io_vec;
259+
}
258260

259261
while (blk_map_iter_next(rq, &iter, &vec)) {
260262
*last_sg = blk_next_sg(last_sg, sglist);

include/linux/blk-mq-dma.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct blk_dma_iter {
1414
blk_status_t status;
1515

1616
/* Internal to blk_rq_dma_map_iter_* */
17+
struct bio_vec *bvec;
1718
struct bvec_iter iter;
1819
struct bio *bio;
1920
struct pci_p2pdma_map_state p2pdma;

0 commit comments

Comments
 (0)