aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-read.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/lightnvm/pblk-read.c')
-rw-r--r--drivers/lightnvm/pblk-read.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c
index 829e92857289..f5fe01d3a07f 100644
--- a/drivers/lightnvm/pblk-read.c
+++ b/drivers/lightnvm/pblk-read.c
@@ -453,21 +453,13 @@ int pblk_submit_read(struct pblk *pblk, struct bio *bio)
453 */ 453 */
454 bio_init_idx = pblk_get_bi_idx(bio); 454 bio_init_idx = pblk_get_bi_idx(bio);
455 455
456 rqd->meta_list = nvm_dev_dma_alloc(dev->parent, GFP_KERNEL, 456 if (pblk_alloc_rqd_meta(pblk, rqd))
457 &rqd->dma_meta_list);
458 if (!rqd->meta_list) {
459 pblk_err(pblk, "not able to allocate ppa list\n");
460 goto fail_rqd_free; 457 goto fail_rqd_free;
461 }
462
463 if (nr_secs > 1) {
464 rqd->ppa_list = rqd->meta_list + pblk_dma_meta_size;
465 rqd->dma_ppa_list = rqd->dma_meta_list + pblk_dma_meta_size;
466 458
459 if (nr_secs > 1)
467 pblk_read_ppalist_rq(pblk, rqd, bio, blba, read_bitmap); 460 pblk_read_ppalist_rq(pblk, rqd, bio, blba, read_bitmap);
468 } else { 461 else
469 pblk_read_rq(pblk, rqd, bio, blba, read_bitmap); 462 pblk_read_rq(pblk, rqd, bio, blba, read_bitmap);
470 }
471 463
472 if (bitmap_full(read_bitmap, nr_secs)) { 464 if (bitmap_full(read_bitmap, nr_secs)) {
473 atomic_inc(&pblk->inflight_io); 465 atomic_inc(&pblk->inflight_io);
@@ -594,15 +586,11 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
594 586
595 memset(&rqd, 0, sizeof(struct nvm_rq)); 587 memset(&rqd, 0, sizeof(struct nvm_rq));
596 588
597 rqd.meta_list = nvm_dev_dma_alloc(dev->parent, GFP_KERNEL, 589 ret = pblk_alloc_rqd_meta(pblk, &rqd);
598 &rqd.dma_meta_list); 590 if (ret)
599 if (!rqd.meta_list) 591 return ret;
600 return -ENOMEM;
601 592
602 if (gc_rq->nr_secs > 1) { 593 if (gc_rq->nr_secs > 1) {
603 rqd.ppa_list = rqd.meta_list + pblk_dma_meta_size;
604 rqd.dma_ppa_list = rqd.dma_meta_list + pblk_dma_meta_size;
605
606 gc_rq->secs_to_gc = read_ppalist_rq_gc(pblk, &rqd, gc_rq->line, 594 gc_rq->secs_to_gc = read_ppalist_rq_gc(pblk, &rqd, gc_rq->line,
607 gc_rq->lba_list, 595 gc_rq->lba_list,
608 gc_rq->paddr_list, 596 gc_rq->paddr_list,
@@ -623,7 +611,8 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
623 PBLK_VMALLOC_META, GFP_KERNEL); 611 PBLK_VMALLOC_META, GFP_KERNEL);
624 if (IS_ERR(bio)) { 612 if (IS_ERR(bio)) {
625 pblk_err(pblk, "could not allocate GC bio (%lu)\n", 613 pblk_err(pblk, "could not allocate GC bio (%lu)\n",
626 PTR_ERR(bio)); 614 PTR_ERR(bio));
615 ret = PTR_ERR(bio);
627 goto err_free_dma; 616 goto err_free_dma;
628 } 617 }
629 618
@@ -658,12 +647,12 @@ int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq)
658#endif 647#endif
659 648
660out: 649out:
661 nvm_dev_dma_free(dev->parent, rqd.meta_list, rqd.dma_meta_list); 650 pblk_free_rqd_meta(pblk, &rqd);
662 return ret; 651 return ret;
663 652
664err_free_bio: 653err_free_bio:
665 bio_put(bio); 654 bio_put(bio);
666err_free_dma: 655err_free_dma:
667 nvm_dev_dma_free(dev->parent, rqd.meta_list, rqd.dma_meta_list); 656 pblk_free_rqd_meta(pblk, &rqd);
668 return ret; 657 return ret;
669} 658}