diff options
author | Matias Bjørling <matias@cnexlabs.com> | 2018-01-05 08:16:03 -0500 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-01-05 10:50:12 -0500 |
commit | fae7fae4077c24dc2be720b9f21f53adea98d7dd (patch) | |
tree | f77436958399d9caa2f4198f7aeeb706867ac24d /drivers/lightnvm | |
parent | bb27aa9ecd1f72e68b0fa2dffeb45bee3b1cb5ca (diff) |
lightnvm: make geometry structures 2.0 ready
Prepare for the 2.0 revision by adapting the geometry
structures to coexist with the 1.2 revision.
Signed-off-by: Matias Bjørling <m@bjorling.me>
Reviewed-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')
-rw-r--r-- | drivers/lightnvm/core.c | 91 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-core.c | 6 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-init.c | 62 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-recovery.c | 2 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-sysfs.c | 6 | ||||
-rw-r--r-- | drivers/lightnvm/pblk.h | 8 |
6 files changed, 87 insertions, 88 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index 52059dd0ed18..6d6d2c12ff5b 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c | |||
@@ -98,7 +98,7 @@ static void nvm_remove_tgt_dev(struct nvm_tgt_dev *tgt_dev, int clear) | |||
98 | if (clear) { | 98 | if (clear) { |
99 | for (j = 0; j < ch_map->nr_luns; j++) { | 99 | for (j = 0; j < ch_map->nr_luns; j++) { |
100 | int lun = j + lun_offs[j]; | 100 | int lun = j + lun_offs[j]; |
101 | int lunid = (ch * dev->geo.luns_per_chnl) + lun; | 101 | int lunid = (ch * dev->geo.nr_luns) + lun; |
102 | 102 | ||
103 | WARN_ON(!test_and_clear_bit(lunid, | 103 | WARN_ON(!test_and_clear_bit(lunid, |
104 | dev->lun_map)); | 104 | dev->lun_map)); |
@@ -124,10 +124,10 @@ static struct nvm_tgt_dev *nvm_create_tgt_dev(struct nvm_dev *dev, | |||
124 | struct ppa_addr *luns; | 124 | struct ppa_addr *luns; |
125 | int nr_luns = lun_end - lun_begin + 1; | 125 | int nr_luns = lun_end - lun_begin + 1; |
126 | int luns_left = nr_luns; | 126 | int luns_left = nr_luns; |
127 | int nr_chnls = nr_luns / dev->geo.luns_per_chnl; | 127 | int nr_chnls = nr_luns / dev->geo.nr_luns; |
128 | int nr_chnls_mod = nr_luns % dev->geo.luns_per_chnl; | 128 | int nr_chnls_mod = nr_luns % dev->geo.nr_luns; |
129 | int bch = lun_begin / dev->geo.luns_per_chnl; | 129 | int bch = lun_begin / dev->geo.nr_luns; |
130 | int blun = lun_begin % dev->geo.luns_per_chnl; | 130 | int blun = lun_begin % dev->geo.nr_luns; |
131 | int lunid = 0; | 131 | int lunid = 0; |
132 | int lun_balanced = 1; | 132 | int lun_balanced = 1; |
133 | int prev_nr_luns; | 133 | int prev_nr_luns; |
@@ -148,15 +148,15 @@ static struct nvm_tgt_dev *nvm_create_tgt_dev(struct nvm_dev *dev, | |||
148 | if (!luns) | 148 | if (!luns) |
149 | goto err_luns; | 149 | goto err_luns; |
150 | 150 | ||
151 | prev_nr_luns = (luns_left > dev->geo.luns_per_chnl) ? | 151 | prev_nr_luns = (luns_left > dev->geo.nr_luns) ? |
152 | dev->geo.luns_per_chnl : luns_left; | 152 | dev->geo.nr_luns : luns_left; |
153 | for (i = 0; i < nr_chnls; i++) { | 153 | for (i = 0; i < nr_chnls; i++) { |
154 | struct nvm_ch_map *ch_rmap = &dev_rmap->chnls[i + bch]; | 154 | struct nvm_ch_map *ch_rmap = &dev_rmap->chnls[i + bch]; |
155 | int *lun_roffs = ch_rmap->lun_offs; | 155 | int *lun_roffs = ch_rmap->lun_offs; |
156 | struct nvm_ch_map *ch_map = &dev_map->chnls[i]; | 156 | struct nvm_ch_map *ch_map = &dev_map->chnls[i]; |
157 | int *lun_offs; | 157 | int *lun_offs; |
158 | int luns_in_chnl = (luns_left > dev->geo.luns_per_chnl) ? | 158 | int luns_in_chnl = (luns_left > dev->geo.nr_luns) ? |
159 | dev->geo.luns_per_chnl : luns_left; | 159 | dev->geo.nr_luns : luns_left; |
160 | 160 | ||
161 | if (lun_balanced && prev_nr_luns != luns_in_chnl) | 161 | if (lun_balanced && prev_nr_luns != luns_in_chnl) |
162 | lun_balanced = 0; | 162 | lun_balanced = 0; |
@@ -193,8 +193,8 @@ static struct nvm_tgt_dev *nvm_create_tgt_dev(struct nvm_dev *dev, | |||
193 | memcpy(&tgt_dev->geo, &dev->geo, sizeof(struct nvm_geo)); | 193 | memcpy(&tgt_dev->geo, &dev->geo, sizeof(struct nvm_geo)); |
194 | /* Target device only owns a portion of the physical device */ | 194 | /* Target device only owns a portion of the physical device */ |
195 | tgt_dev->geo.nr_chnls = nr_chnls; | 195 | tgt_dev->geo.nr_chnls = nr_chnls; |
196 | tgt_dev->geo.nr_luns = nr_luns; | 196 | tgt_dev->geo.all_luns = nr_luns; |
197 | tgt_dev->geo.luns_per_chnl = (lun_balanced) ? prev_nr_luns : -1; | 197 | tgt_dev->geo.nr_luns = (lun_balanced) ? prev_nr_luns : -1; |
198 | tgt_dev->total_secs = nr_luns * tgt_dev->geo.sec_per_lun; | 198 | tgt_dev->total_secs = nr_luns * tgt_dev->geo.sec_per_lun; |
199 | tgt_dev->q = dev->q; | 199 | tgt_dev->q = dev->q; |
200 | tgt_dev->map = dev_map; | 200 | tgt_dev->map = dev_map; |
@@ -414,7 +414,7 @@ static int nvm_register_map(struct nvm_dev *dev) | |||
414 | for (i = 0; i < dev->geo.nr_chnls; i++) { | 414 | for (i = 0; i < dev->geo.nr_chnls; i++) { |
415 | struct nvm_ch_map *ch_rmap; | 415 | struct nvm_ch_map *ch_rmap; |
416 | int *lun_roffs; | 416 | int *lun_roffs; |
417 | int luns_in_chnl = dev->geo.luns_per_chnl; | 417 | int luns_in_chnl = dev->geo.nr_luns; |
418 | 418 | ||
419 | ch_rmap = &rmap->chnls[i]; | 419 | ch_rmap = &rmap->chnls[i]; |
420 | 420 | ||
@@ -717,10 +717,10 @@ int nvm_bb_tbl_fold(struct nvm_dev *dev, u8 *blks, int nr_blks) | |||
717 | struct nvm_geo *geo = &dev->geo; | 717 | struct nvm_geo *geo = &dev->geo; |
718 | int blk, offset, pl, blktype; | 718 | int blk, offset, pl, blktype; |
719 | 719 | ||
720 | if (nr_blks != geo->blks_per_lun * geo->plane_mode) | 720 | if (nr_blks != geo->nr_chks * geo->plane_mode) |
721 | return -EINVAL; | 721 | return -EINVAL; |
722 | 722 | ||
723 | for (blk = 0; blk < geo->blks_per_lun; blk++) { | 723 | for (blk = 0; blk < geo->nr_chks; blk++) { |
724 | offset = blk * geo->plane_mode; | 724 | offset = blk * geo->plane_mode; |
725 | blktype = blks[offset]; | 725 | blktype = blks[offset]; |
726 | 726 | ||
@@ -736,7 +736,7 @@ int nvm_bb_tbl_fold(struct nvm_dev *dev, u8 *blks, int nr_blks) | |||
736 | blks[blk] = blktype; | 736 | blks[blk] = blktype; |
737 | } | 737 | } |
738 | 738 | ||
739 | return geo->blks_per_lun; | 739 | return geo->nr_chks; |
740 | } | 740 | } |
741 | EXPORT_SYMBOL(nvm_bb_tbl_fold); | 741 | EXPORT_SYMBOL(nvm_bb_tbl_fold); |
742 | 742 | ||
@@ -758,43 +758,40 @@ static int nvm_core_init(struct nvm_dev *dev) | |||
758 | struct nvm_geo *geo = &dev->geo; | 758 | struct nvm_geo *geo = &dev->geo; |
759 | int ret; | 759 | int ret; |
760 | 760 | ||
761 | memcpy(&geo->ppaf, &id->ppaf, sizeof(struct nvm_addr_format)); | ||
762 | |||
763 | if (grp->mtype != 0) { | ||
764 | pr_err("nvm: memory type not supported\n"); | ||
765 | return -EINVAL; | ||
766 | } | ||
767 | |||
761 | /* Whole device values */ | 768 | /* Whole device values */ |
762 | geo->nr_chnls = grp->num_ch; | 769 | geo->nr_chnls = grp->num_ch; |
763 | geo->luns_per_chnl = grp->num_lun; | 770 | geo->nr_luns = grp->num_lun; |
764 | 771 | ||
765 | /* Generic device values */ | 772 | /* Generic device geometry values */ |
766 | geo->pgs_per_blk = grp->num_pg; | 773 | geo->ws_min = grp->ws_min; |
767 | geo->blks_per_lun = grp->num_blk; | 774 | geo->ws_opt = grp->ws_opt; |
768 | geo->nr_planes = grp->num_pln; | 775 | geo->ws_seq = grp->ws_seq; |
769 | geo->fpg_size = grp->fpg_sz; | 776 | geo->ws_per_chk = grp->ws_per_chk; |
770 | geo->pfpg_size = grp->fpg_sz * grp->num_pln; | 777 | geo->nr_chks = grp->num_chk; |
771 | geo->sec_size = grp->csecs; | 778 | geo->sec_size = grp->csecs; |
772 | geo->oob_size = grp->sos; | 779 | geo->oob_size = grp->sos; |
773 | geo->sec_per_pg = grp->fpg_sz / grp->csecs; | ||
774 | geo->mccap = grp->mccap; | 780 | geo->mccap = grp->mccap; |
775 | memcpy(&geo->ppaf, &id->ppaf, sizeof(struct nvm_addr_format)); | ||
776 | |||
777 | geo->plane_mode = NVM_PLANE_SINGLE; | ||
778 | geo->max_rq_size = dev->ops->max_phys_sect * geo->sec_size; | 781 | geo->max_rq_size = dev->ops->max_phys_sect * geo->sec_size; |
779 | 782 | ||
780 | if (grp->mpos & 0x020202) | 783 | geo->sec_per_chk = grp->clba; |
781 | geo->plane_mode = NVM_PLANE_DOUBLE; | 784 | geo->sec_per_lun = geo->sec_per_chk * geo->nr_chks; |
782 | if (grp->mpos & 0x040404) | 785 | geo->all_luns = geo->nr_luns * geo->nr_chnls; |
783 | geo->plane_mode = NVM_PLANE_QUAD; | ||
784 | |||
785 | if (grp->mtype != 0) { | ||
786 | pr_err("nvm: memory type not supported\n"); | ||
787 | return -EINVAL; | ||
788 | } | ||
789 | 786 | ||
790 | /* calculated values */ | 787 | /* 1.2 spec device geometry values */ |
788 | geo->plane_mode = 1 << geo->ws_seq; | ||
789 | geo->nr_planes = geo->ws_opt / geo->ws_min; | ||
790 | geo->sec_per_pg = geo->ws_min; | ||
791 | geo->sec_per_pl = geo->sec_per_pg * geo->nr_planes; | 791 | geo->sec_per_pl = geo->sec_per_pg * geo->nr_planes; |
792 | geo->sec_per_blk = geo->sec_per_pl * geo->pgs_per_blk; | ||
793 | geo->sec_per_lun = geo->sec_per_blk * geo->blks_per_lun; | ||
794 | geo->nr_luns = geo->luns_per_chnl * geo->nr_chnls; | ||
795 | 792 | ||
796 | dev->total_secs = geo->nr_luns * geo->sec_per_lun; | 793 | dev->total_secs = geo->all_luns * geo->sec_per_lun; |
797 | dev->lun_map = kcalloc(BITS_TO_LONGS(geo->nr_luns), | 794 | dev->lun_map = kcalloc(BITS_TO_LONGS(geo->all_luns), |
798 | sizeof(unsigned long), GFP_KERNEL); | 795 | sizeof(unsigned long), GFP_KERNEL); |
799 | if (!dev->lun_map) | 796 | if (!dev->lun_map) |
800 | return -ENOMEM; | 797 | return -ENOMEM; |
@@ -854,8 +851,8 @@ static int nvm_init(struct nvm_dev *dev) | |||
854 | 851 | ||
855 | pr_info("nvm: registered %s [%u/%u/%u/%u/%u/%u]\n", | 852 | pr_info("nvm: registered %s [%u/%u/%u/%u/%u/%u]\n", |
856 | dev->name, geo->sec_per_pg, geo->nr_planes, | 853 | dev->name, geo->sec_per_pg, geo->nr_planes, |
857 | geo->pgs_per_blk, geo->blks_per_lun, | 854 | geo->ws_per_chk, geo->nr_chks, |
858 | geo->nr_luns, geo->nr_chnls); | 855 | geo->all_luns, geo->nr_chnls); |
859 | return 0; | 856 | return 0; |
860 | err: | 857 | err: |
861 | pr_err("nvm: failed to initialize nvm\n"); | 858 | pr_err("nvm: failed to initialize nvm\n"); |
@@ -946,12 +943,12 @@ static int __nvm_configure_create(struct nvm_ioctl_create *create) | |||
946 | 943 | ||
947 | if (s->lun_begin == -1 && s->lun_end == -1) { | 944 | if (s->lun_begin == -1 && s->lun_end == -1) { |
948 | s->lun_begin = 0; | 945 | s->lun_begin = 0; |
949 | s->lun_end = dev->geo.nr_luns - 1; | 946 | s->lun_end = dev->geo.all_luns - 1; |
950 | } | 947 | } |
951 | 948 | ||
952 | if (s->lun_begin > s->lun_end || s->lun_end >= dev->geo.nr_luns) { | 949 | if (s->lun_begin > s->lun_end || s->lun_end >= dev->geo.all_luns) { |
953 | pr_err("nvm: lun out of bound (%u:%u > %u)\n", | 950 | pr_err("nvm: lun out of bound (%u:%u > %u)\n", |
954 | s->lun_begin, s->lun_end, dev->geo.nr_luns - 1); | 951 | s->lun_begin, s->lun_end, dev->geo.all_luns - 1); |
955 | return -EINVAL; | 952 | return -EINVAL; |
956 | } | 953 | } |
957 | 954 | ||
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index 76516ee84e9a..0849046b2a7a 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c | |||
@@ -979,7 +979,7 @@ static int pblk_line_init_metadata(struct pblk *pblk, struct pblk_line *line, | |||
979 | 979 | ||
980 | /* Start metadata */ | 980 | /* Start metadata */ |
981 | smeta_buf->seq_nr = cpu_to_le64(line->seq_nr); | 981 | smeta_buf->seq_nr = cpu_to_le64(line->seq_nr); |
982 | smeta_buf->window_wr_lun = cpu_to_le32(geo->nr_luns); | 982 | smeta_buf->window_wr_lun = cpu_to_le32(geo->all_luns); |
983 | 983 | ||
984 | /* Fill metadata among lines */ | 984 | /* Fill metadata among lines */ |
985 | if (cur) { | 985 | if (cur) { |
@@ -1032,7 +1032,7 @@ static int pblk_line_init_bb(struct pblk *pblk, struct pblk_line *line, | |||
1032 | lm->sec_per_line); | 1032 | lm->sec_per_line); |
1033 | bitmap_or(line->map_bitmap, line->map_bitmap, l_mg->bb_aux, | 1033 | bitmap_or(line->map_bitmap, line->map_bitmap, l_mg->bb_aux, |
1034 | lm->sec_per_line); | 1034 | lm->sec_per_line); |
1035 | line->sec_in_line -= geo->sec_per_blk; | 1035 | line->sec_in_line -= geo->sec_per_chk; |
1036 | if (bit >= lm->emeta_bb) | 1036 | if (bit >= lm->emeta_bb) |
1037 | nr_bb++; | 1037 | nr_bb++; |
1038 | } | 1038 | } |
@@ -1746,7 +1746,7 @@ void pblk_up_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas, | |||
1746 | struct nvm_tgt_dev *dev = pblk->dev; | 1746 | struct nvm_tgt_dev *dev = pblk->dev; |
1747 | struct nvm_geo *geo = &dev->geo; | 1747 | struct nvm_geo *geo = &dev->geo; |
1748 | struct pblk_lun *rlun; | 1748 | struct pblk_lun *rlun; |
1749 | int nr_luns = geo->nr_luns; | 1749 | int nr_luns = geo->all_luns; |
1750 | int bit = -1; | 1750 | int bit = -1; |
1751 | 1751 | ||
1752 | while ((bit = find_next_bit(lun_bitmap, nr_luns, bit + 1)) < nr_luns) { | 1752 | while ((bit = find_next_bit(lun_bitmap, nr_luns, bit + 1)) < nr_luns) { |
diff --git a/drivers/lightnvm/pblk-init.c b/drivers/lightnvm/pblk-init.c index 695826a06b5d..d13bb51f0e2f 100644 --- a/drivers/lightnvm/pblk-init.c +++ b/drivers/lightnvm/pblk-init.c | |||
@@ -169,8 +169,8 @@ static int pblk_set_ppaf(struct pblk *pblk) | |||
169 | } | 169 | } |
170 | ppaf.ch_len = power_len; | 170 | ppaf.ch_len = power_len; |
171 | 171 | ||
172 | power_len = get_count_order(geo->luns_per_chnl); | 172 | power_len = get_count_order(geo->nr_luns); |
173 | if (1 << power_len != geo->luns_per_chnl) { | 173 | if (1 << power_len != geo->nr_luns) { |
174 | pr_err("pblk: supports only power-of-two LUN config.\n"); | 174 | pr_err("pblk: supports only power-of-two LUN config.\n"); |
175 | return -EINVAL; | 175 | return -EINVAL; |
176 | } | 176 | } |
@@ -254,7 +254,7 @@ static int pblk_core_init(struct pblk *pblk) | |||
254 | struct nvm_geo *geo = &dev->geo; | 254 | struct nvm_geo *geo = &dev->geo; |
255 | 255 | ||
256 | pblk->pgs_in_buffer = NVM_MEM_PAGE_WRITE * geo->sec_per_pg * | 256 | pblk->pgs_in_buffer = NVM_MEM_PAGE_WRITE * geo->sec_per_pg * |
257 | geo->nr_planes * geo->nr_luns; | 257 | geo->nr_planes * geo->all_luns; |
258 | 258 | ||
259 | if (pblk_init_global_caches(pblk)) | 259 | if (pblk_init_global_caches(pblk)) |
260 | return -ENOMEM; | 260 | return -ENOMEM; |
@@ -270,21 +270,22 @@ static int pblk_core_init(struct pblk *pblk) | |||
270 | if (!pblk->gen_ws_pool) | 270 | if (!pblk->gen_ws_pool) |
271 | goto free_page_bio_pool; | 271 | goto free_page_bio_pool; |
272 | 272 | ||
273 | pblk->rec_pool = mempool_create_slab_pool(geo->nr_luns, pblk_rec_cache); | 273 | pblk->rec_pool = mempool_create_slab_pool(geo->all_luns, |
274 | pblk_rec_cache); | ||
274 | if (!pblk->rec_pool) | 275 | if (!pblk->rec_pool) |
275 | goto free_gen_ws_pool; | 276 | goto free_gen_ws_pool; |
276 | 277 | ||
277 | pblk->r_rq_pool = mempool_create_slab_pool(geo->nr_luns, | 278 | pblk->r_rq_pool = mempool_create_slab_pool(geo->all_luns, |
278 | pblk_g_rq_cache); | 279 | pblk_g_rq_cache); |
279 | if (!pblk->r_rq_pool) | 280 | if (!pblk->r_rq_pool) |
280 | goto free_rec_pool; | 281 | goto free_rec_pool; |
281 | 282 | ||
282 | pblk->e_rq_pool = mempool_create_slab_pool(geo->nr_luns, | 283 | pblk->e_rq_pool = mempool_create_slab_pool(geo->all_luns, |
283 | pblk_g_rq_cache); | 284 | pblk_g_rq_cache); |
284 | if (!pblk->e_rq_pool) | 285 | if (!pblk->e_rq_pool) |
285 | goto free_r_rq_pool; | 286 | goto free_r_rq_pool; |
286 | 287 | ||
287 | pblk->w_rq_pool = mempool_create_slab_pool(geo->nr_luns, | 288 | pblk->w_rq_pool = mempool_create_slab_pool(geo->all_luns, |
288 | pblk_w_rq_cache); | 289 | pblk_w_rq_cache); |
289 | if (!pblk->w_rq_pool) | 290 | if (!pblk->w_rq_pool) |
290 | goto free_e_rq_pool; | 291 | goto free_e_rq_pool; |
@@ -409,7 +410,7 @@ static int pblk_bb_discovery(struct nvm_tgt_dev *dev, struct pblk_lun *rlun) | |||
409 | u8 *blks; | 410 | u8 *blks; |
410 | int nr_blks, ret; | 411 | int nr_blks, ret; |
411 | 412 | ||
412 | nr_blks = geo->blks_per_lun * geo->plane_mode; | 413 | nr_blks = geo->nr_chks * geo->plane_mode; |
413 | blks = kmalloc(nr_blks, GFP_KERNEL); | 414 | blks = kmalloc(nr_blks, GFP_KERNEL); |
414 | if (!blks) | 415 | if (!blks) |
415 | return -ENOMEM; | 416 | return -ENOMEM; |
@@ -482,20 +483,21 @@ static int pblk_luns_init(struct pblk *pblk, struct ppa_addr *luns) | |||
482 | int i, ret; | 483 | int i, ret; |
483 | 484 | ||
484 | /* TODO: Implement unbalanced LUN support */ | 485 | /* TODO: Implement unbalanced LUN support */ |
485 | if (geo->luns_per_chnl < 0) { | 486 | if (geo->nr_luns < 0) { |
486 | pr_err("pblk: unbalanced LUN config.\n"); | 487 | pr_err("pblk: unbalanced LUN config.\n"); |
487 | return -EINVAL; | 488 | return -EINVAL; |
488 | } | 489 | } |
489 | 490 | ||
490 | pblk->luns = kcalloc(geo->nr_luns, sizeof(struct pblk_lun), GFP_KERNEL); | 491 | pblk->luns = kcalloc(geo->all_luns, sizeof(struct pblk_lun), |
492 | GFP_KERNEL); | ||
491 | if (!pblk->luns) | 493 | if (!pblk->luns) |
492 | return -ENOMEM; | 494 | return -ENOMEM; |
493 | 495 | ||
494 | for (i = 0; i < geo->nr_luns; i++) { | 496 | for (i = 0; i < geo->all_luns; i++) { |
495 | /* Stripe across channels */ | 497 | /* Stripe across channels */ |
496 | int ch = i % geo->nr_chnls; | 498 | int ch = i % geo->nr_chnls; |
497 | int lun_raw = i / geo->nr_chnls; | 499 | int lun_raw = i / geo->nr_chnls; |
498 | int lunid = lun_raw + ch * geo->luns_per_chnl; | 500 | int lunid = lun_raw + ch * geo->nr_luns; |
499 | 501 | ||
500 | rlun = &pblk->luns[i]; | 502 | rlun = &pblk->luns[i]; |
501 | rlun->bppa = luns[lunid]; | 503 | rlun->bppa = luns[lunid]; |
@@ -590,8 +592,8 @@ static void pblk_set_provision(struct pblk *pblk, long nr_free_blks) | |||
590 | * on user capacity consider only provisioned blocks | 592 | * on user capacity consider only provisioned blocks |
591 | */ | 593 | */ |
592 | pblk->rl.total_blocks = nr_free_blks; | 594 | pblk->rl.total_blocks = nr_free_blks; |
593 | pblk->rl.nr_secs = nr_free_blks * geo->sec_per_blk; | 595 | pblk->rl.nr_secs = nr_free_blks * geo->sec_per_chk; |
594 | pblk->capacity = provisioned * geo->sec_per_blk; | 596 | pblk->capacity = provisioned * geo->sec_per_chk; |
595 | atomic_set(&pblk->rl.free_blocks, nr_free_blks); | 597 | atomic_set(&pblk->rl.free_blocks, nr_free_blks); |
596 | } | 598 | } |
597 | 599 | ||
@@ -683,7 +685,7 @@ static int pblk_lines_init(struct pblk *pblk) | |||
683 | int i, ret; | 685 | int i, ret; |
684 | 686 | ||
685 | pblk->min_write_pgs = geo->sec_per_pl * (geo->sec_size / PAGE_SIZE); | 687 | pblk->min_write_pgs = geo->sec_per_pl * (geo->sec_size / PAGE_SIZE); |
686 | max_write_ppas = pblk->min_write_pgs * geo->nr_luns; | 688 | max_write_ppas = pblk->min_write_pgs * geo->all_luns; |
687 | pblk->max_write_pgs = (max_write_ppas < nvm_max_phys_sects(dev)) ? | 689 | pblk->max_write_pgs = (max_write_ppas < nvm_max_phys_sects(dev)) ? |
688 | max_write_ppas : nvm_max_phys_sects(dev); | 690 | max_write_ppas : nvm_max_phys_sects(dev); |
689 | pblk_set_sec_per_write(pblk, pblk->min_write_pgs); | 691 | pblk_set_sec_per_write(pblk, pblk->min_write_pgs); |
@@ -693,26 +695,26 @@ static int pblk_lines_init(struct pblk *pblk) | |||
693 | return -EINVAL; | 695 | return -EINVAL; |
694 | } | 696 | } |
695 | 697 | ||
696 | div_u64_rem(geo->sec_per_blk, pblk->min_write_pgs, &mod); | 698 | div_u64_rem(geo->sec_per_chk, pblk->min_write_pgs, &mod); |
697 | if (mod) { | 699 | if (mod) { |
698 | pr_err("pblk: bad configuration of sectors/pages\n"); | 700 | pr_err("pblk: bad configuration of sectors/pages\n"); |
699 | return -EINVAL; | 701 | return -EINVAL; |
700 | } | 702 | } |
701 | 703 | ||
702 | l_mg->nr_lines = geo->blks_per_lun; | 704 | l_mg->nr_lines = geo->nr_chks; |
703 | l_mg->log_line = l_mg->data_line = NULL; | 705 | l_mg->log_line = l_mg->data_line = NULL; |
704 | l_mg->l_seq_nr = l_mg->d_seq_nr = 0; | 706 | l_mg->l_seq_nr = l_mg->d_seq_nr = 0; |
705 | l_mg->nr_free_lines = 0; | 707 | l_mg->nr_free_lines = 0; |
706 | bitmap_zero(&l_mg->meta_bitmap, PBLK_DATA_LINES); | 708 | bitmap_zero(&l_mg->meta_bitmap, PBLK_DATA_LINES); |
707 | 709 | ||
708 | lm->sec_per_line = geo->sec_per_blk * geo->nr_luns; | 710 | lm->sec_per_line = geo->sec_per_chk * geo->all_luns; |
709 | lm->blk_per_line = geo->nr_luns; | 711 | lm->blk_per_line = geo->all_luns; |
710 | lm->blk_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long); | 712 | lm->blk_bitmap_len = BITS_TO_LONGS(geo->all_luns) * sizeof(long); |
711 | lm->sec_bitmap_len = BITS_TO_LONGS(lm->sec_per_line) * sizeof(long); | 713 | lm->sec_bitmap_len = BITS_TO_LONGS(lm->sec_per_line) * sizeof(long); |
712 | lm->lun_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long); | 714 | lm->lun_bitmap_len = BITS_TO_LONGS(geo->all_luns) * sizeof(long); |
713 | lm->mid_thrs = lm->sec_per_line / 2; | 715 | lm->mid_thrs = lm->sec_per_line / 2; |
714 | lm->high_thrs = lm->sec_per_line / 4; | 716 | lm->high_thrs = lm->sec_per_line / 4; |
715 | lm->meta_distance = (geo->nr_luns / 2) * pblk->min_write_pgs; | 717 | lm->meta_distance = (geo->all_luns / 2) * pblk->min_write_pgs; |
716 | 718 | ||
717 | /* Calculate necessary pages for smeta. See comment over struct | 719 | /* Calculate necessary pages for smeta. See comment over struct |
718 | * line_smeta definition | 720 | * line_smeta definition |
@@ -742,12 +744,12 @@ add_emeta_page: | |||
742 | goto add_emeta_page; | 744 | goto add_emeta_page; |
743 | } | 745 | } |
744 | 746 | ||
745 | lm->emeta_bb = geo->nr_luns > i ? geo->nr_luns - i : 0; | 747 | lm->emeta_bb = geo->all_luns > i ? geo->all_luns - i : 0; |
746 | 748 | ||
747 | lm->min_blk_line = 1; | 749 | lm->min_blk_line = 1; |
748 | if (geo->nr_luns > 1) | 750 | if (geo->all_luns > 1) |
749 | lm->min_blk_line += DIV_ROUND_UP(lm->smeta_sec + | 751 | lm->min_blk_line += DIV_ROUND_UP(lm->smeta_sec + |
750 | lm->emeta_sec[0], geo->sec_per_blk); | 752 | lm->emeta_sec[0], geo->sec_per_chk); |
751 | 753 | ||
752 | if (lm->min_blk_line > lm->blk_per_line) { | 754 | if (lm->min_blk_line > lm->blk_per_line) { |
753 | pr_err("pblk: config. not supported. Min. LUN in line:%d\n", | 755 | pr_err("pblk: config. not supported. Min. LUN in line:%d\n", |
@@ -772,7 +774,7 @@ add_emeta_page: | |||
772 | goto fail_free_bb_template; | 774 | goto fail_free_bb_template; |
773 | } | 775 | } |
774 | 776 | ||
775 | bb_distance = (geo->nr_luns) * geo->sec_per_pl; | 777 | bb_distance = (geo->all_luns) * geo->sec_per_pl; |
776 | for (i = 0; i < lm->sec_per_line; i += bb_distance) | 778 | for (i = 0; i < lm->sec_per_line; i += bb_distance) |
777 | bitmap_set(l_mg->bb_template, i, geo->sec_per_pl); | 779 | bitmap_set(l_mg->bb_template, i, geo->sec_per_pl); |
778 | 780 | ||
@@ -844,7 +846,7 @@ add_emeta_page: | |||
844 | pblk_set_provision(pblk, nr_free_blks); | 846 | pblk_set_provision(pblk, nr_free_blks); |
845 | 847 | ||
846 | /* Cleanup per-LUN bad block lists - managed within lines on run-time */ | 848 | /* Cleanup per-LUN bad block lists - managed within lines on run-time */ |
847 | for (i = 0; i < geo->nr_luns; i++) | 849 | for (i = 0; i < geo->all_luns; i++) |
848 | kfree(pblk->luns[i].bb_list); | 850 | kfree(pblk->luns[i].bb_list); |
849 | 851 | ||
850 | return 0; | 852 | return 0; |
@@ -858,7 +860,7 @@ fail_free_bb_template: | |||
858 | fail_free_meta: | 860 | fail_free_meta: |
859 | pblk_line_meta_free(pblk); | 861 | pblk_line_meta_free(pblk); |
860 | fail: | 862 | fail: |
861 | for (i = 0; i < geo->nr_luns; i++) | 863 | for (i = 0; i < geo->all_luns; i++) |
862 | kfree(pblk->luns[i].bb_list); | 864 | kfree(pblk->luns[i].bb_list); |
863 | 865 | ||
864 | return ret; | 866 | return ret; |
@@ -1041,13 +1043,13 @@ static void *pblk_init(struct nvm_tgt_dev *dev, struct gendisk *tdisk, | |||
1041 | 1043 | ||
1042 | blk_queue_write_cache(tqueue, true, false); | 1044 | blk_queue_write_cache(tqueue, true, false); |
1043 | 1045 | ||
1044 | tqueue->limits.discard_granularity = geo->pgs_per_blk * geo->pfpg_size; | 1046 | tqueue->limits.discard_granularity = geo->sec_per_chk * geo->sec_size; |
1045 | tqueue->limits.discard_alignment = 0; | 1047 | tqueue->limits.discard_alignment = 0; |
1046 | blk_queue_max_discard_sectors(tqueue, UINT_MAX >> 9); | 1048 | blk_queue_max_discard_sectors(tqueue, UINT_MAX >> 9); |
1047 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, tqueue); | 1049 | queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, tqueue); |
1048 | 1050 | ||
1049 | pr_info("pblk init: luns:%u, lines:%d, secs:%llu, buf entries:%u\n", | 1051 | pr_info("pblk init: luns:%u, lines:%d, secs:%llu, buf entries:%u\n", |
1050 | geo->nr_luns, pblk->l_mg.nr_lines, | 1052 | geo->all_luns, pblk->l_mg.nr_lines, |
1051 | (unsigned long long)pblk->rl.nr_secs, | 1053 | (unsigned long long)pblk->rl.nr_secs, |
1052 | pblk->rwb.nr_entries); | 1054 | pblk->rwb.nr_entries); |
1053 | 1055 | ||
diff --git a/drivers/lightnvm/pblk-recovery.c b/drivers/lightnvm/pblk-recovery.c index eadb3eb5d4dc..ceec12d26643 100644 --- a/drivers/lightnvm/pblk-recovery.c +++ b/drivers/lightnvm/pblk-recovery.c | |||
@@ -188,7 +188,7 @@ static int pblk_calc_sec_in_line(struct pblk *pblk, struct pblk_line *line) | |||
188 | int nr_bb = bitmap_weight(line->blk_bitmap, lm->blk_per_line); | 188 | int nr_bb = bitmap_weight(line->blk_bitmap, lm->blk_per_line); |
189 | 189 | ||
190 | return lm->sec_per_line - lm->smeta_sec - lm->emeta_sec[0] - | 190 | return lm->sec_per_line - lm->smeta_sec - lm->emeta_sec[0] - |
191 | nr_bb * geo->sec_per_blk; | 191 | nr_bb * geo->sec_per_chk; |
192 | } | 192 | } |
193 | 193 | ||
194 | struct pblk_recov_alloc { | 194 | struct pblk_recov_alloc { |
diff --git a/drivers/lightnvm/pblk-sysfs.c b/drivers/lightnvm/pblk-sysfs.c index cd49e8875d4e..5cee2ac49c72 100644 --- a/drivers/lightnvm/pblk-sysfs.c +++ b/drivers/lightnvm/pblk-sysfs.c | |||
@@ -28,7 +28,7 @@ static ssize_t pblk_sysfs_luns_show(struct pblk *pblk, char *page) | |||
28 | ssize_t sz = 0; | 28 | ssize_t sz = 0; |
29 | int i; | 29 | int i; |
30 | 30 | ||
31 | for (i = 0; i < geo->nr_luns; i++) { | 31 | for (i = 0; i < geo->all_luns; i++) { |
32 | int active = 1; | 32 | int active = 1; |
33 | 33 | ||
34 | rlun = &pblk->luns[i]; | 34 | rlun = &pblk->luns[i]; |
@@ -238,7 +238,7 @@ static ssize_t pblk_sysfs_lines(struct pblk *pblk, char *page) | |||
238 | 238 | ||
239 | sz = snprintf(page, PAGE_SIZE - sz, | 239 | sz = snprintf(page, PAGE_SIZE - sz, |
240 | "line: nluns:%d, nblks:%d, nsecs:%d\n", | 240 | "line: nluns:%d, nblks:%d, nsecs:%d\n", |
241 | geo->nr_luns, lm->blk_per_line, lm->sec_per_line); | 241 | geo->all_luns, lm->blk_per_line, lm->sec_per_line); |
242 | 242 | ||
243 | sz += snprintf(page + sz, PAGE_SIZE - sz, | 243 | sz += snprintf(page + sz, PAGE_SIZE - sz, |
244 | "lines:d:%d,l:%d-f:%d,m:%d/%d,c:%d,b:%d,co:%d(d:%d,l:%d)t:%d\n", | 244 | "lines:d:%d,l:%d-f:%d,m:%d/%d,c:%d,b:%d,co:%d(d:%d,l:%d)t:%d\n", |
@@ -287,7 +287,7 @@ static ssize_t pblk_sysfs_lines_info(struct pblk *pblk, char *page) | |||
287 | "blk_line:%d, sec_line:%d, sec_blk:%d\n", | 287 | "blk_line:%d, sec_line:%d, sec_blk:%d\n", |
288 | lm->blk_per_line, | 288 | lm->blk_per_line, |
289 | lm->sec_per_line, | 289 | lm->sec_per_line, |
290 | geo->sec_per_blk); | 290 | geo->sec_per_chk); |
291 | 291 | ||
292 | return sz; | 292 | return sz; |
293 | } | 293 | } |
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index 59a64d461a5d..c150728c3b49 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h | |||
@@ -907,7 +907,7 @@ static inline int pblk_pad_distance(struct pblk *pblk) | |||
907 | struct nvm_tgt_dev *dev = pblk->dev; | 907 | struct nvm_tgt_dev *dev = pblk->dev; |
908 | struct nvm_geo *geo = &dev->geo; | 908 | struct nvm_geo *geo = &dev->geo; |
909 | 909 | ||
910 | return NVM_MEM_PAGE_WRITE * geo->nr_luns * geo->sec_per_pl; | 910 | return NVM_MEM_PAGE_WRITE * geo->all_luns * geo->sec_per_pl; |
911 | } | 911 | } |
912 | 912 | ||
913 | static inline int pblk_dev_ppa_to_line(struct ppa_addr p) | 913 | static inline int pblk_dev_ppa_to_line(struct ppa_addr p) |
@@ -1212,10 +1212,10 @@ static inline int pblk_boundary_ppa_checks(struct nvm_tgt_dev *tgt_dev, | |||
1212 | 1212 | ||
1213 | if (!ppa->c.is_cached && | 1213 | if (!ppa->c.is_cached && |
1214 | ppa->g.ch < geo->nr_chnls && | 1214 | ppa->g.ch < geo->nr_chnls && |
1215 | ppa->g.lun < geo->luns_per_chnl && | 1215 | ppa->g.lun < geo->nr_luns && |
1216 | ppa->g.pl < geo->nr_planes && | 1216 | ppa->g.pl < geo->nr_planes && |
1217 | ppa->g.blk < geo->blks_per_lun && | 1217 | ppa->g.blk < geo->nr_chks && |
1218 | ppa->g.pg < geo->pgs_per_blk && | 1218 | ppa->g.pg < geo->ws_per_chk && |
1219 | ppa->g.sec < geo->sec_per_pg) | 1219 | ppa->g.sec < geo->sec_per_pg) |
1220 | continue; | 1220 | continue; |
1221 | 1221 | ||