Skip to content

Commit 003b5c5

Browse files
author
Kent Overstreet
committed
block: Convert drivers to immutable biovecs
Now that we've got a mechanism for immutable biovecs - bi_iter.bi_bvec_done - we need to convert drivers to use primitives that respect it instead of using the bvec array directly. Signed-off-by: Kent Overstreet <[email protected]> Cc: Jens Axboe <[email protected]> Cc: NeilBrown <[email protected]> Cc: Alasdair Kergon <[email protected]> Cc: [email protected]
1 parent 458b76e commit 003b5c5

File tree

7 files changed

+89
-119
lines changed

7 files changed

+89
-119
lines changed

drivers/block/umem.c

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,7 @@ struct cardinfo {
108108
* have been written
109109
*/
110110
struct bio *bio, *currentbio, **biotail;
111-
int current_idx;
112-
sector_t current_sector;
111+
struct bvec_iter current_iter;
113112

114113
struct request_queue *queue;
115114

@@ -118,7 +117,7 @@ struct cardinfo {
118117
struct mm_dma_desc *desc;
119118
int cnt, headcnt;
120119
struct bio *bio, **biotail;
121-
int idx;
120+
struct bvec_iter iter;
122121
} mm_pages[2];
123122
#define DESC_PER_PAGE ((PAGE_SIZE*2)/sizeof(struct mm_dma_desc))
124123

@@ -344,16 +343,13 @@ static int add_bio(struct cardinfo *card)
344343
dma_addr_t dma_handle;
345344
int offset;
346345
struct bio *bio;
347-
struct bio_vec *vec;
348-
int idx;
346+
struct bio_vec vec;
349347
int rw;
350-
int len;
351348

352349
bio = card->currentbio;
353350
if (!bio && card->bio) {
354351
card->currentbio = card->bio;
355-
card->current_idx = card->bio->bi_iter.bi_idx;
356-
card->current_sector = card->bio->bi_iter.bi_sector;
352+
card->current_iter = card->bio->bi_iter;
357353
card->bio = card->bio->bi_next;
358354
if (card->bio == NULL)
359355
card->biotail = &card->bio;
@@ -362,26 +358,25 @@ static int add_bio(struct cardinfo *card)
362358
}
363359
if (!bio)
364360
return 0;
365-
idx = card->current_idx;
366361

367362
rw = bio_rw(bio);
368363
if (card->mm_pages[card->Ready].cnt >= DESC_PER_PAGE)
369364
return 0;
370365

371-
vec = bio_iovec_idx(bio, idx);
372-
len = vec->bv_len;
366+
vec = bio_iter_iovec(bio, card->current_iter);
367+
373368
dma_handle = pci_map_page(card->dev,
374-
vec->bv_page,
375-
vec->bv_offset,
376-
len,
369+
vec.bv_page,
370+
vec.bv_offset,
371+
vec.bv_len,
377372
(rw == READ) ?
378373
PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
379374

380375
p = &card->mm_pages[card->Ready];
381376
desc = &p->desc[p->cnt];
382377
p->cnt++;
383378
if (p->bio == NULL)
384-
p->idx = idx;
379+
p->iter = card->current_iter;
385380
if ((p->biotail) != &bio->bi_next) {
386381
*(p->biotail) = bio;
387382
p->biotail = &(bio->bi_next);
@@ -391,8 +386,8 @@ static int add_bio(struct cardinfo *card)
391386
desc->data_dma_handle = dma_handle;
392387

393388
desc->pci_addr = cpu_to_le64((u64)desc->data_dma_handle);
394-
desc->local_addr = cpu_to_le64(card->current_sector << 9);
395-
desc->transfer_size = cpu_to_le32(len);
389+
desc->local_addr = cpu_to_le64(card->current_iter.bi_sector << 9);
390+
desc->transfer_size = cpu_to_le32(vec.bv_len);
396391
offset = (((char *)&desc->sem_control_bits) - ((char *)p->desc));
397392
desc->sem_addr = cpu_to_le64((u64)(p->page_dma+offset));
398393
desc->zero1 = desc->zero2 = 0;
@@ -407,10 +402,9 @@ static int add_bio(struct cardinfo *card)
407402
desc->control_bits |= cpu_to_le32(DMASCR_TRANSFER_READ);
408403
desc->sem_control_bits = desc->control_bits;
409404

410-
card->current_sector += (len >> 9);
411-
idx++;
412-
card->current_idx = idx;
413-
if (idx >= bio->bi_vcnt)
405+
406+
bio_advance_iter(bio, &card->current_iter, vec.bv_len);
407+
if (!card->current_iter.bi_size)
414408
card->currentbio = NULL;
415409

416410
return 1;
@@ -439,23 +433,25 @@ static void process_page(unsigned long data)
439433
struct mm_dma_desc *desc = &page->desc[page->headcnt];
440434
int control = le32_to_cpu(desc->sem_control_bits);
441435
int last = 0;
442-
int idx;
436+
struct bio_vec vec;
443437

444438
if (!(control & DMASCR_DMA_COMPLETE)) {
445439
control = dma_status;
446440
last = 1;
447441
}
442+
448443
page->headcnt++;
449-
idx = page->idx;
450-
page->idx++;
451-
if (page->idx >= bio->bi_vcnt) {
444+
vec = bio_iter_iovec(bio, page->iter);
445+
bio_advance_iter(bio, &page->iter, vec.bv_len);
446+
447+
if (!page->iter.bi_size) {
452448
page->bio = bio->bi_next;
453449
if (page->bio)
454-
page->idx = page->bio->bi_iter.bi_idx;
450+
page->iter = page->bio->bi_iter;
455451
}
456452

457453
pci_unmap_page(card->dev, desc->data_dma_handle,
458-
bio_iovec_idx(bio, idx)->bv_len,
454+
vec.bv_len,
459455
(control & DMASCR_TRANSFER_READ) ?
460456
PCI_DMA_TODEVICE : PCI_DMA_FROMDEVICE);
461457
if (control & DMASCR_HARD_ERROR) {

drivers/md/dm-crypt.c

Lines changed: 18 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,8 @@ struct convert_context {
3939
struct completion restart;
4040
struct bio *bio_in;
4141
struct bio *bio_out;
42-
unsigned int offset_in;
43-
unsigned int offset_out;
44-
unsigned int idx_in;
45-
unsigned int idx_out;
42+
struct bvec_iter iter_in;
43+
struct bvec_iter iter_out;
4644
sector_t cc_sector;
4745
atomic_t cc_pending;
4846
};
@@ -826,10 +824,10 @@ static void crypt_convert_init(struct crypt_config *cc,
826824
{
827825
ctx->bio_in = bio_in;
828826
ctx->bio_out = bio_out;
829-
ctx->offset_in = 0;
830-
ctx->offset_out = 0;
831-
ctx->idx_in = bio_in ? bio_in->bi_iter.bi_idx : 0;
832-
ctx->idx_out = bio_out ? bio_out->bi_iter.bi_idx : 0;
827+
if (bio_in)
828+
ctx->iter_in = bio_in->bi_iter;
829+
if (bio_out)
830+
ctx->iter_out = bio_out->bi_iter;
833831
ctx->cc_sector = sector + cc->iv_offset;
834832
init_completion(&ctx->restart);
835833
}
@@ -857,8 +855,8 @@ static int crypt_convert_block(struct crypt_config *cc,
857855
struct convert_context *ctx,
858856
struct ablkcipher_request *req)
859857
{
860-
struct bio_vec *bv_in = bio_iovec_idx(ctx->bio_in, ctx->idx_in);
861-
struct bio_vec *bv_out = bio_iovec_idx(ctx->bio_out, ctx->idx_out);
858+
struct bio_vec bv_in = bio_iter_iovec(ctx->bio_in, ctx->iter_in);
859+
struct bio_vec bv_out = bio_iter_iovec(ctx->bio_out, ctx->iter_out);
862860
struct dm_crypt_request *dmreq;
863861
u8 *iv;
864862
int r;
@@ -869,24 +867,15 @@ static int crypt_convert_block(struct crypt_config *cc,
869867
dmreq->iv_sector = ctx->cc_sector;
870868
dmreq->ctx = ctx;
871869
sg_init_table(&dmreq->sg_in, 1);
872-
sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
873-
bv_in->bv_offset + ctx->offset_in);
870+
sg_set_page(&dmreq->sg_in, bv_in.bv_page, 1 << SECTOR_SHIFT,
871+
bv_in.bv_offset);
874872

875873
sg_init_table(&dmreq->sg_out, 1);
876-
sg_set_page(&dmreq->sg_out, bv_out->bv_page, 1 << SECTOR_SHIFT,
877-
bv_out->bv_offset + ctx->offset_out);
874+
sg_set_page(&dmreq->sg_out, bv_out.bv_page, 1 << SECTOR_SHIFT,
875+
bv_out.bv_offset);
878876

879-
ctx->offset_in += 1 << SECTOR_SHIFT;
880-
if (ctx->offset_in >= bv_in->bv_len) {
881-
ctx->offset_in = 0;
882-
ctx->idx_in++;
883-
}
884-
885-
ctx->offset_out += 1 << SECTOR_SHIFT;
886-
if (ctx->offset_out >= bv_out->bv_len) {
887-
ctx->offset_out = 0;
888-
ctx->idx_out++;
889-
}
877+
bio_advance_iter(ctx->bio_in, &ctx->iter_in, 1 << SECTOR_SHIFT);
878+
bio_advance_iter(ctx->bio_out, &ctx->iter_out, 1 << SECTOR_SHIFT);
890879

891880
if (cc->iv_gen_ops) {
892881
r = cc->iv_gen_ops->generator(cc, iv, dmreq);
@@ -937,8 +926,7 @@ static int crypt_convert(struct crypt_config *cc,
937926

938927
atomic_set(&ctx->cc_pending, 1);
939928

940-
while(ctx->idx_in < ctx->bio_in->bi_vcnt &&
941-
ctx->idx_out < ctx->bio_out->bi_vcnt) {
929+
while (ctx->iter_in.bi_size && ctx->iter_out.bi_size) {
942930

943931
crypt_alloc_req(cc, ctx);
944932

@@ -1207,7 +1195,7 @@ static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int async)
12071195
}
12081196

12091197
/* crypt_convert should have filled the clone bio */
1210-
BUG_ON(io->ctx.idx_out < clone->bi_vcnt);
1198+
BUG_ON(io->ctx.iter_out.bi_size);
12111199

12121200
clone->bi_iter.bi_sector = cc->start + io->sector;
12131201

@@ -1246,7 +1234,7 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
12461234
}
12471235

12481236
io->ctx.bio_out = clone;
1249-
io->ctx.idx_out = 0;
1237+
io->ctx.iter_out = clone->bi_iter;
12501238

12511239
remaining -= clone->bi_iter.bi_size;
12521240
sector += bio_sectors(clone);
@@ -1290,8 +1278,7 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
12901278
crypt_inc_pending(new_io);
12911279
crypt_convert_init(cc, &new_io->ctx, NULL,
12921280
io->base_bio, sector);
1293-
new_io->ctx.idx_in = io->ctx.idx_in;
1294-
new_io->ctx.offset_in = io->ctx.offset_in;
1281+
new_io->ctx.iter_in = io->ctx.iter_in;
12951282

12961283
/*
12971284
* Fragments after the first use the base_io

drivers/md/dm-io.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -201,26 +201,29 @@ static void list_dp_init(struct dpages *dp, struct page_list *pl, unsigned offse
201201
/*
202202
* Functions for getting the pages from a bvec.
203203
*/
204-
static void bvec_get_page(struct dpages *dp,
204+
static void bio_get_page(struct dpages *dp,
205205
struct page **p, unsigned long *len, unsigned *offset)
206206
{
207-
struct bio_vec *bvec = (struct bio_vec *) dp->context_ptr;
208-
*p = bvec->bv_page;
209-
*len = bvec->bv_len;
210-
*offset = bvec->bv_offset;
207+
struct bio *bio = dp->context_ptr;
208+
struct bio_vec bvec = bio_iovec(bio);
209+
*p = bvec.bv_page;
210+
*len = bvec.bv_len;
211+
*offset = bvec.bv_offset;
211212
}
212213

213-
static void bvec_next_page(struct dpages *dp)
214+
static void bio_next_page(struct dpages *dp)
214215
{
215-
struct bio_vec *bvec = (struct bio_vec *) dp->context_ptr;
216-
dp->context_ptr = bvec + 1;
216+
struct bio *bio = dp->context_ptr;
217+
struct bio_vec bvec = bio_iovec(bio);
218+
219+
bio_advance(bio, bvec.bv_len);
217220
}
218221

219-
static void bvec_dp_init(struct dpages *dp, struct bio_vec *bvec)
222+
static void bio_dp_init(struct dpages *dp, struct bio *bio)
220223
{
221-
dp->get_page = bvec_get_page;
222-
dp->next_page = bvec_next_page;
223-
dp->context_ptr = bvec;
224+
dp->get_page = bio_get_page;
225+
dp->next_page = bio_next_page;
226+
dp->context_ptr = bio;
224227
}
225228

226229
/*
@@ -457,8 +460,8 @@ static int dp_init(struct dm_io_request *io_req, struct dpages *dp,
457460
list_dp_init(dp, io_req->mem.ptr.pl, io_req->mem.offset);
458461
break;
459462

460-
case DM_IO_BVEC:
461-
bvec_dp_init(dp, io_req->mem.ptr.bvec);
463+
case DM_IO_BIO:
464+
bio_dp_init(dp, io_req->mem.ptr.bio);
462465
break;
463466

464467
case DM_IO_VMA:

drivers/md/dm-raid1.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -526,8 +526,8 @@ static void read_async_bio(struct mirror *m, struct bio *bio)
526526
struct dm_io_region io;
527527
struct dm_io_request io_req = {
528528
.bi_rw = READ,
529-
.mem.type = DM_IO_BVEC,
530-
.mem.ptr.bvec = bio->bi_io_vec + bio->bi_iter.bi_idx,
529+
.mem.type = DM_IO_BIO,
530+
.mem.ptr.bio = bio,
531531
.notify.fn = read_callback,
532532
.notify.context = bio,
533533
.client = m->ms->io_client,
@@ -629,8 +629,8 @@ static void do_write(struct mirror_set *ms, struct bio *bio)
629629
struct mirror *m;
630630
struct dm_io_request io_req = {
631631
.bi_rw = WRITE | (bio->bi_rw & WRITE_FLUSH_FUA),
632-
.mem.type = DM_IO_BVEC,
633-
.mem.ptr.bvec = bio->bi_io_vec + bio->bi_iter.bi_idx,
632+
.mem.type = DM_IO_BIO,
633+
.mem.ptr.bio = bio,
634634
.notify.fn = write_callback,
635635
.notify.context = bio,
636636
.client = ms->io_client,

0 commit comments

Comments
 (0)