diff options
| author | Igor Konopko <igor.j.konopko@intel.com> | 2019-05-04 14:38:11 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2019-05-06 12:19:19 -0400 |
| commit | 45c5fcbb73416f367100a4bccd116fd2752e5940 (patch) | |
| tree | a639b328a9d5ccf9d2c447ca303af8daac017702 | |
| parent | a96de64a24e5035018c5a912f2b877da8797277e (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.c | 26 | ||||
| -rw-r--r-- | drivers/lightnvm/pblk-recovery.c | 13 |
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 | ||
| 563 | int pblk_submit_io_sync_sem(struct pblk *pblk, struct nvm_rq *rqd) | 563 | int 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 | ||
| 859 | next_rq: | 862 | next_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 | ||
| 1526 | void pblk_rq_to_line_put(struct pblk *pblk, struct nvm_rq *rqd) | 1530 | void 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; |
