aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-write.c
diff options
context:
space:
mode:
authorJavier González <javier@cnexlabs.com>2017-10-13 08:46:18 -0400
committerJens Axboe <axboe@kernel.dk>2017-10-13 10:34:57 -0400
commit875d94f3a4838f2243334e5ce55ac8153f9bbf5b (patch)
tree93577e6000070396c0c3b6e42e51fe4dd9d593df /drivers/lightnvm/pblk-write.c
parent6ca2f71f3e3d94d188000b420ce0529b07f3ce95 (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/lightnvm/pblk-write.c')
-rw-r--r--drivers/lightnvm/pblk-write.c20
1 files changed, 10 insertions, 10 deletions
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;