diff options
author | Javier González <javier@cnexlabs.com> | 2017-10-13 08:46:18 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-10-13 10:34:57 -0400 |
commit | 875d94f3a4838f2243334e5ce55ac8153f9bbf5b (patch) | |
tree | 93577e6000070396c0c3b6e42e51fe4dd9d593df /drivers | |
parent | 6ca2f71f3e3d94d188000b420ce0529b07f3ce95 (diff) |
lightnvm: pblk: allocate bio size more accurately
Wait until we know the exact number of ppas to be sent to the device,
before allocating the bio.
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <m@bjorling.me>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/lightnvm/pblk-rb.c | 5 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-write.c | 20 | ||||
-rw-r--r-- | drivers/lightnvm/pblk.h | 4 |
3 files changed, 15 insertions, 14 deletions
diff --git a/drivers/lightnvm/pblk-rb.c b/drivers/lightnvm/pblk-rb.c index 05e6b2e9221d..1173e2380137 100644 --- a/drivers/lightnvm/pblk-rb.c +++ b/drivers/lightnvm/pblk-rb.c | |||
@@ -552,12 +552,13 @@ out: | |||
552 | * persist data on the write buffer to the media. | 552 | * persist data on the write buffer to the media. |
553 | */ | 553 | */ |
554 | unsigned int pblk_rb_read_to_bio(struct pblk_rb *rb, struct nvm_rq *rqd, | 554 | unsigned int pblk_rb_read_to_bio(struct pblk_rb *rb, struct nvm_rq *rqd, |
555 | struct bio *bio, unsigned int pos, | 555 | unsigned int pos, unsigned int nr_entries, |
556 | unsigned int nr_entries, unsigned int count) | 556 | unsigned int count) |
557 | { | 557 | { |
558 | struct pblk *pblk = container_of(rb, struct pblk, rwb); | 558 | struct pblk *pblk = container_of(rb, struct pblk, rwb); |
559 | struct request_queue *q = pblk->dev->q; | 559 | struct request_queue *q = pblk->dev->q; |
560 | struct pblk_c_ctx *c_ctx = nvm_rq_to_pdu(rqd); | 560 | struct pblk_c_ctx *c_ctx = nvm_rq_to_pdu(rqd); |
561 | struct bio *bio = rqd->bio; | ||
561 | struct pblk_rb_entry *entry; | 562 | struct pblk_rb_entry *entry; |
562 | struct page *page; | 563 | struct page *page; |
563 | unsigned int pad = 0, to_read = nr_entries; | 564 | unsigned int pad = 0, to_read = nr_entries; |
diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c index 0c0481cf9f5d..140a26edd1d3 100644 --- a/drivers/lightnvm/pblk-write.c +++ b/drivers/lightnvm/pblk-write.c | |||
@@ -534,24 +534,24 @@ static int pblk_submit_write(struct pblk *pblk) | |||
534 | if (!secs_to_flush && secs_avail < pblk->min_write_pgs) | 534 | if (!secs_to_flush && secs_avail < pblk->min_write_pgs) |
535 | return 1; | 535 | return 1; |
536 | 536 | ||
537 | bio = bio_alloc(GFP_KERNEL, pblk->max_write_pgs); | ||
538 | |||
539 | bio->bi_iter.bi_sector = 0; /* internal bio */ | ||
540 | bio_set_op_attrs(bio, REQ_OP_WRITE, 0); | ||
541 | |||
542 | rqd = pblk_alloc_rqd(pblk, WRITE); | ||
543 | rqd->bio = bio; | ||
544 | |||
545 | secs_to_sync = pblk_calc_secs_to_sync(pblk, secs_avail, secs_to_flush); | 537 | secs_to_sync = pblk_calc_secs_to_sync(pblk, secs_avail, secs_to_flush); |
546 | if (secs_to_sync > pblk->max_write_pgs) { | 538 | if (secs_to_sync > pblk->max_write_pgs) { |
547 | pr_err("pblk: bad buffer sync calculation\n"); | 539 | pr_err("pblk: bad buffer sync calculation\n"); |
548 | goto fail_put_bio; | 540 | return 1; |
549 | } | 541 | } |
550 | 542 | ||
551 | secs_to_com = (secs_to_sync > secs_avail) ? secs_avail : secs_to_sync; | 543 | secs_to_com = (secs_to_sync > secs_avail) ? secs_avail : secs_to_sync; |
552 | pos = pblk_rb_read_commit(&pblk->rwb, secs_to_com); | 544 | pos = pblk_rb_read_commit(&pblk->rwb, secs_to_com); |
553 | 545 | ||
554 | if (pblk_rb_read_to_bio(&pblk->rwb, rqd, bio, pos, secs_to_sync, | 546 | bio = bio_alloc(GFP_KERNEL, secs_to_sync); |
547 | |||
548 | bio->bi_iter.bi_sector = 0; /* internal bio */ | ||
549 | bio_set_op_attrs(bio, REQ_OP_WRITE, 0); | ||
550 | |||
551 | rqd = pblk_alloc_rqd(pblk, WRITE); | ||
552 | rqd->bio = bio; | ||
553 | |||
554 | if (pblk_rb_read_to_bio(&pblk->rwb, rqd, pos, secs_to_sync, | ||
555 | secs_avail)) { | 555 | secs_avail)) { |
556 | pr_err("pblk: corrupted write bio\n"); | 556 | pr_err("pblk: corrupted write bio\n"); |
557 | goto fail_put_bio; | 557 | goto fail_put_bio; |
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index 876b50f97234..9f162057d497 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h | |||
@@ -666,8 +666,8 @@ void pblk_rb_flush(struct pblk_rb *rb); | |||
666 | 666 | ||
667 | void pblk_rb_sync_l2p(struct pblk_rb *rb); | 667 | void pblk_rb_sync_l2p(struct pblk_rb *rb); |
668 | unsigned int pblk_rb_read_to_bio(struct pblk_rb *rb, struct nvm_rq *rqd, | 668 | unsigned int pblk_rb_read_to_bio(struct pblk_rb *rb, struct nvm_rq *rqd, |
669 | struct bio *bio, unsigned int pos, | 669 | unsigned int pos, unsigned int nr_entries, |
670 | unsigned int nr_entries, unsigned int count); | 670 | unsigned int count); |
671 | unsigned int pblk_rb_read_to_bio_list(struct pblk_rb *rb, struct bio *bio, | 671 | unsigned int pblk_rb_read_to_bio_list(struct pblk_rb *rb, struct bio *bio, |
672 | struct list_head *list, | 672 | struct list_head *list, |
673 | unsigned int max); | 673 | unsigned int max); |