aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Konopko <igor.j.konopko@intel.com>2019-05-04 14:38:11 -0400
committerJens Axboe <axboe@kernel.dk>2019-05-06 12:19:19 -0400
commit45c5fcbb73416f367100a4bccd116fd2752e5940 (patch)
treea639b328a9d5ccf9d2c447ca303af8daac017702
parenta96de64a24e5035018c5a912f2b877da8797277e (diff)
lightnvm: pblk: use nvm_rq_to_ppa_list()
This patch replaces few remaining usages of rqd->ppa_list[] with existing nvm_rq_to_ppa_list() helpers. This is needed for theoretical devices with ws_min/ws_opt equal to 1. Signed-off-by: Igor Konopko <igor.j.konopko@intel.com> Reviewed-by: Javier González <javier@javigon.com> Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--drivers/lightnvm/pblk-core.c26
-rw-r--r--drivers/lightnvm/pblk-recovery.c13
2 files changed, 22 insertions, 17 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 07270ba1e95f..773537804319 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -562,11 +562,9 @@ int pblk_submit_io_sync(struct pblk *pblk, struct nvm_rq *rqd)
562 562
563int pblk_submit_io_sync_sem(struct pblk *pblk, struct nvm_rq *rqd) 563int pblk_submit_io_sync_sem(struct pblk *pblk, struct nvm_rq *rqd)
564{ 564{
565 struct ppa_addr *ppa_list; 565 struct ppa_addr *ppa_list = nvm_rq_to_ppa_list(rqd);
566 int ret; 566 int ret;
567 567
568 ppa_list = (rqd->nr_ppas > 1) ? rqd->ppa_list : &rqd->ppa_addr;
569
570 pblk_down_chunk(pblk, ppa_list[0]); 568 pblk_down_chunk(pblk, ppa_list[0]);
571 ret = pblk_submit_io_sync(pblk, rqd); 569 ret = pblk_submit_io_sync(pblk, rqd);
572 pblk_up_chunk(pblk, ppa_list[0]); 570 pblk_up_chunk(pblk, ppa_list[0]);
@@ -725,6 +723,7 @@ int pblk_line_smeta_read(struct pblk *pblk, struct pblk_line *line)
725 struct nvm_tgt_dev *dev = pblk->dev; 723 struct nvm_tgt_dev *dev = pblk->dev;
726 struct pblk_line_meta *lm = &pblk->lm; 724 struct pblk_line_meta *lm = &pblk->lm;
727 struct bio *bio; 725 struct bio *bio;
726 struct ppa_addr *ppa_list;
728 struct nvm_rq rqd; 727 struct nvm_rq rqd;
729 u64 paddr = pblk_line_smeta_start(pblk, line); 728 u64 paddr = pblk_line_smeta_start(pblk, line);
730 int i, ret; 729 int i, ret;
@@ -748,9 +747,10 @@ int pblk_line_smeta_read(struct pblk *pblk, struct pblk_line *line)
748 rqd.opcode = NVM_OP_PREAD; 747 rqd.opcode = NVM_OP_PREAD;
749 rqd.nr_ppas = lm->smeta_sec; 748 rqd.nr_ppas = lm->smeta_sec;
750 rqd.is_seq = 1; 749 rqd.is_seq = 1;
750 ppa_list = nvm_rq_to_ppa_list(&rqd);
751 751
752 for (i = 0; i < lm->smeta_sec; i++, paddr++) 752 for (i = 0; i < lm->smeta_sec; i++, paddr++)
753 rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id); 753 ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);
754 754
755 ret = pblk_submit_io_sync(pblk, &rqd); 755 ret = pblk_submit_io_sync(pblk, &rqd);
756 if (ret) { 756 if (ret) {
@@ -777,6 +777,7 @@ static int pblk_line_smeta_write(struct pblk *pblk, struct pblk_line *line,
777 struct nvm_tgt_dev *dev = pblk->dev; 777 struct nvm_tgt_dev *dev = pblk->dev;
778 struct pblk_line_meta *lm = &pblk->lm; 778 struct pblk_line_meta *lm = &pblk->lm;
779 struct bio *bio; 779 struct bio *bio;
780 struct ppa_addr *ppa_list;
780 struct nvm_rq rqd; 781 struct nvm_rq rqd;
781 __le64 *lba_list = emeta_to_lbas(pblk, line->emeta->buf); 782 __le64 *lba_list = emeta_to_lbas(pblk, line->emeta->buf);
782 __le64 addr_empty = cpu_to_le64(ADDR_EMPTY); 783 __le64 addr_empty = cpu_to_le64(ADDR_EMPTY);
@@ -801,12 +802,13 @@ static int pblk_line_smeta_write(struct pblk *pblk, struct pblk_line *line,
801 rqd.opcode = NVM_OP_PWRITE; 802 rqd.opcode = NVM_OP_PWRITE;
802 rqd.nr_ppas = lm->smeta_sec; 803 rqd.nr_ppas = lm->smeta_sec;
803 rqd.is_seq = 1; 804 rqd.is_seq = 1;
805 ppa_list = nvm_rq_to_ppa_list(&rqd);
804 806
805 for (i = 0; i < lm->smeta_sec; i++, paddr++) { 807 for (i = 0; i < lm->smeta_sec; i++, paddr++) {
806 struct pblk_sec_meta *meta = pblk_get_meta(pblk, 808 struct pblk_sec_meta *meta = pblk_get_meta(pblk,
807 rqd.meta_list, i); 809 rqd.meta_list, i);
808 810
809 rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id); 811 ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id);
810 meta->lba = lba_list[paddr] = addr_empty; 812 meta->lba = lba_list[paddr] = addr_empty;
811 } 813 }
812 814
@@ -836,8 +838,9 @@ int pblk_line_emeta_read(struct pblk *pblk, struct pblk_line *line,
836 struct nvm_geo *geo = &dev->geo; 838 struct nvm_geo *geo = &dev->geo;
837 struct pblk_line_mgmt *l_mg = &pblk->l_mg; 839 struct pblk_line_mgmt *l_mg = &pblk->l_mg;
838 struct pblk_line_meta *lm = &pblk->lm; 840 struct pblk_line_meta *lm = &pblk->lm;
839 void *ppa_list, *meta_list; 841 void *ppa_list_buf, *meta_list;
840 struct bio *bio; 842 struct bio *bio;
843 struct ppa_addr *ppa_list;
841 struct nvm_rq rqd; 844 struct nvm_rq rqd;
842 u64 paddr = line->emeta_ssec; 845 u64 paddr = line->emeta_ssec;
843 dma_addr_t dma_ppa_list, dma_meta_list; 846 dma_addr_t dma_ppa_list, dma_meta_list;
@@ -853,7 +856,7 @@ int pblk_line_emeta_read(struct pblk *pblk, struct pblk_line *line,
853 if (!meta_list) 856 if (!meta_list)
854 return -ENOMEM; 857 return -ENOMEM;
855 858
856 ppa_list = meta_list + pblk_dma_meta_size(pblk); 859 ppa_list_buf = meta_list + pblk_dma_meta_size(pblk);
857 dma_ppa_list = dma_meta_list + pblk_dma_meta_size(pblk); 860 dma_ppa_list = dma_meta_list + pblk_dma_meta_size(pblk);
858 861
859next_rq: 862next_rq:
@@ -874,11 +877,12 @@ next_rq:
874 877
875 rqd.bio = bio; 878 rqd.bio = bio;
876 rqd.meta_list = meta_list; 879 rqd.meta_list = meta_list;
877 rqd.ppa_list = ppa_list; 880 rqd.ppa_list = ppa_list_buf;
878 rqd.dma_meta_list = dma_meta_list; 881 rqd.dma_meta_list = dma_meta_list;
879 rqd.dma_ppa_list = dma_ppa_list; 882 rqd.dma_ppa_list = dma_ppa_list;
880 rqd.opcode = NVM_OP_PREAD; 883 rqd.opcode = NVM_OP_PREAD;
881 rqd.nr_ppas = rq_ppas; 884 rqd.nr_ppas = rq_ppas;
885 ppa_list = nvm_rq_to_ppa_list(&rqd);
882 886
883 for (i = 0; i < rqd.nr_ppas; ) { 887 for (i = 0; i < rqd.nr_ppas; ) {
884 struct ppa_addr ppa = addr_to_gen_ppa(pblk, paddr, line_id); 888 struct ppa_addr ppa = addr_to_gen_ppa(pblk, paddr, line_id);
@@ -906,7 +910,7 @@ next_rq:
906 } 910 }
907 911
908 for (j = 0; j < min; j++, i++, paddr++) 912 for (j = 0; j < min; j++, i++, paddr++)
909 rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line_id); 913 ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line_id);
910 } 914 }
911 915
912 ret = pblk_submit_io_sync(pblk, &rqd); 916 ret = pblk_submit_io_sync(pblk, &rqd);
@@ -1525,11 +1529,9 @@ void pblk_ppa_to_line_put(struct pblk *pblk, struct ppa_addr ppa)
1525 1529
1526void pblk_rq_to_line_put(struct pblk *pblk, struct nvm_rq *rqd) 1530void pblk_rq_to_line_put(struct pblk *pblk, struct nvm_rq *rqd)
1527{ 1531{
1528 struct ppa_addr *ppa_list; 1532 struct ppa_addr *ppa_list = nvm_rq_to_ppa_list(rqd);
1529 int i; 1533 int i;
1530 1534
1531 ppa_list = (rqd->nr_ppas > 1) ? rqd->ppa_list : &rqd->ppa_addr;
1532
1533 for (i = 0; i < rqd->nr_ppas; i++) 1535 for (i = 0; i < rqd->nr_ppas; i++)
1534 pblk_ppa_to_line_put(pblk, ppa_list[i]); 1536 pblk_ppa_to_line_put(pblk, ppa_list[i]);
1535} 1537}
diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c
index a9085b0e6611..e6dda04de144 100644
--- a/drivers/lightnvm/pblk-recovery.c
+++ b/drivers/lightnvm/pblk-recovery.c
@@ -179,6 +179,7 @@ static int pblk_recov_pad_line(struct pblk *pblk, struct pblk_line *line,
179 struct pblk_pad_rq *pad_rq; 179 struct pblk_pad_rq *pad_rq;
180 struct nvm_rq *rqd; 180 struct nvm_rq *rqd;
181 struct bio *bio; 181 struct bio *bio;
182 struct ppa_addr *ppa_list;
182 void *data; 183 void *data;
183 __le64 *lba_list = emeta_to_lbas(pblk, line->emeta->buf); 184 __le64 *lba_list = emeta_to_lbas(pblk, line->emeta->buf);
184 u64 w_ptr = line->cur_sec; 185 u64 w_ptr = line->cur_sec;
@@ -239,6 +240,7 @@ next_pad_rq:
239 rqd->end_io = pblk_end_io_recov; 240 rqd->end_io = pblk_end_io_recov;
240 rqd->private = pad_rq; 241 rqd->private = pad_rq;
241 242
243 ppa_list = nvm_rq_to_ppa_list(rqd);
242 meta_list = rqd->meta_list; 244 meta_list = rqd->meta_list;
243 245
244 for (i = 0; i < rqd->nr_ppas; ) { 246 for (i = 0; i < rqd->nr_ppas; ) {
@@ -266,17 +268,17 @@ next_pad_rq:
266 lba_list[w_ptr] = addr_empty; 268 lba_list[w_ptr] = addr_empty;
267 meta = pblk_get_meta(pblk, meta_list, i); 269 meta = pblk_get_meta(pblk, meta_list, i);
268 meta->lba = addr_empty; 270 meta->lba = addr_empty;
269 rqd->ppa_list[i] = dev_ppa; 271 ppa_list[i] = dev_ppa;
270 } 272 }
271 } 273 }
272 274
273 kref_get(&pad_rq->ref); 275 kref_get(&pad_rq->ref);
274 pblk_down_chunk(pblk, rqd->ppa_list[0]); 276 pblk_down_chunk(pblk, ppa_list[0]);
275 277
276 ret = pblk_submit_io(pblk, rqd); 278 ret = pblk_submit_io(pblk, rqd);
277 if (ret) { 279 if (ret) {
278 pblk_err(pblk, "I/O submission failed: %d\n", ret); 280 pblk_err(pblk, "I/O submission failed: %d\n", ret);
279 pblk_up_chunk(pblk, rqd->ppa_list[0]); 281 pblk_up_chunk(pblk, ppa_list[0]);
280 kref_put(&pad_rq->ref, pblk_recov_complete); 282 kref_put(&pad_rq->ref, pblk_recov_complete);
281 pblk_free_rqd(pblk, rqd, PBLK_WRITE_INT); 283 pblk_free_rqd(pblk, rqd, PBLK_WRITE_INT);
282 bio_put(bio); 284 bio_put(bio);
@@ -420,6 +422,7 @@ retry_rq:
420 rqd->ppa_list = ppa_list; 422 rqd->ppa_list = ppa_list;
421 rqd->dma_ppa_list = dma_ppa_list; 423 rqd->dma_ppa_list = dma_ppa_list;
422 rqd->dma_meta_list = dma_meta_list; 424 rqd->dma_meta_list = dma_meta_list;
425 ppa_list = nvm_rq_to_ppa_list(rqd);
423 426
424 if (pblk_io_aligned(pblk, rq_ppas)) 427 if (pblk_io_aligned(pblk, rq_ppas))
425 rqd->is_seq = 1; 428 rqd->is_seq = 1;
@@ -438,7 +441,7 @@ retry_rq:
438 } 441 }
439 442
440 for (j = 0; j < pblk->min_write_pgs; j++, i++) 443 for (j = 0; j < pblk->min_write_pgs; j++, i++)
441 rqd->ppa_list[i] = 444 ppa_list[i] =
442 addr_to_gen_ppa(pblk, paddr + j, line->id); 445 addr_to_gen_ppa(pblk, paddr + j, line->id);
443 } 446 }
444 447
@@ -486,7 +489,7 @@ retry_rq:
486 continue; 489 continue;
487 490
488 line->nr_valid_lbas++; 491 line->nr_valid_lbas++;
489 pblk_update_map(pblk, lba, rqd->ppa_list[i]); 492 pblk_update_map(pblk, lba, ppa_list[i]);
490 } 493 }
491 494
492 left_ppas -= rq_ppas; 495 left_ppas -= rq_ppas;