Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 69471513 authored by Javier González's avatar Javier González Committed by Jens Axboe
Browse files

lightnvm: add support for 2.0 address format



Add support for 2.0 address format. Also, align address bits for 1.2 and
2.0 to be able to operate on channel and luns without requiring a format
conversion. Use a generic address format for this purpose.

Also, convert the generic operations to the generic format in pblk.

Signed-off-by: default avatarJavier González <javier@cnexlabs.com>
Signed-off-by: default avatarMatias Bjørling <mb@lightnvm.io>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent a40afad9
Loading
Loading
Loading
Loading
+10 −10
Original line number Original line Diff line number Diff line
@@ -194,8 +194,8 @@ static struct nvm_tgt_dev *nvm_create_tgt_dev(struct nvm_dev *dev,


		for (j = 0; j < luns_in_chnl; j++) {
		for (j = 0; j < luns_in_chnl; j++) {
			luns[lunid].ppa = 0;
			luns[lunid].ppa = 0;
			luns[lunid].g.ch = i;
			luns[lunid].a.ch = i;
			luns[lunid++].g.lun = j;
			luns[lunid++].a.lun = j;


			lun_offs[j] = blun;
			lun_offs[j] = blun;
			lun_roffs[j + blun] = blun;
			lun_roffs[j + blun] = blun;
@@ -556,22 +556,22 @@ static void nvm_unregister_map(struct nvm_dev *dev)
static void nvm_map_to_dev(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *p)
static void nvm_map_to_dev(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *p)
{
{
	struct nvm_dev_map *dev_map = tgt_dev->map;
	struct nvm_dev_map *dev_map = tgt_dev->map;
	struct nvm_ch_map *ch_map = &dev_map->chnls[p->g.ch];
	struct nvm_ch_map *ch_map = &dev_map->chnls[p->a.ch];
	int lun_off = ch_map->lun_offs[p->g.lun];
	int lun_off = ch_map->lun_offs[p->a.lun];


	p->g.ch += ch_map->ch_off;
	p->a.ch += ch_map->ch_off;
	p->g.lun += lun_off;
	p->a.lun += lun_off;
}
}


static void nvm_map_to_tgt(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *p)
static void nvm_map_to_tgt(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *p)
{
{
	struct nvm_dev *dev = tgt_dev->parent;
	struct nvm_dev *dev = tgt_dev->parent;
	struct nvm_dev_map *dev_rmap = dev->rmap;
	struct nvm_dev_map *dev_rmap = dev->rmap;
	struct nvm_ch_map *ch_rmap = &dev_rmap->chnls[p->g.ch];
	struct nvm_ch_map *ch_rmap = &dev_rmap->chnls[p->a.ch];
	int lun_roff = ch_rmap->lun_offs[p->g.lun];
	int lun_roff = ch_rmap->lun_offs[p->a.lun];


	p->g.ch -= ch_rmap->ch_off;
	p->a.ch -= ch_rmap->ch_off;
	p->g.lun -= lun_roff;
	p->a.lun -= lun_roff;
}
}


static void nvm_ppa_tgt_to_dev(struct nvm_tgt_dev *tgt_dev,
static void nvm_ppa_tgt_to_dev(struct nvm_tgt_dev *tgt_dev,
+5 −5
Original line number Original line Diff line number Diff line
@@ -885,7 +885,7 @@ int pblk_line_erase(struct pblk *pblk, struct pblk_line *line)
		}
		}


		ppa = pblk->luns[bit].bppa; /* set ch and lun */
		ppa = pblk->luns[bit].bppa; /* set ch and lun */
		ppa.g.blk = line->id;
		ppa.a.blk = line->id;


		atomic_dec(&line->left_eblks);
		atomic_dec(&line->left_eblks);
		WARN_ON(test_and_set_bit(bit, line->erase_bitmap));
		WARN_ON(test_and_set_bit(bit, line->erase_bitmap));
@@ -1683,8 +1683,8 @@ static void __pblk_down_page(struct pblk *pblk, struct ppa_addr *ppa_list,
	int i;
	int i;


	for (i = 1; i < nr_ppas; i++)
	for (i = 1; i < nr_ppas; i++)
		WARN_ON(ppa_list[0].g.lun != ppa_list[i].g.lun ||
		WARN_ON(ppa_list[0].a.lun != ppa_list[i].a.lun ||
				ppa_list[0].g.ch != ppa_list[i].g.ch);
				ppa_list[0].a.ch != ppa_list[i].a.ch);
#endif
#endif


	ret = down_timeout(&rlun->wr_sem, msecs_to_jiffies(30000));
	ret = down_timeout(&rlun->wr_sem, msecs_to_jiffies(30000));
@@ -1728,8 +1728,8 @@ void pblk_up_page(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas)
	int i;
	int i;


	for (i = 1; i < nr_ppas; i++)
	for (i = 1; i < nr_ppas; i++)
		WARN_ON(ppa_list[0].g.lun != ppa_list[i].g.lun ||
		WARN_ON(ppa_list[0].a.lun != ppa_list[i].a.lun ||
				ppa_list[0].g.ch != ppa_list[i].g.ch);
				ppa_list[0].a.ch != ppa_list[i].a.ch);
#endif
#endif


	rlun = &pblk->luns[pos];
	rlun = &pblk->luns[pos];
+2 −2
Original line number Original line Diff line number Diff line
@@ -127,7 +127,7 @@ void pblk_map_erase_rq(struct pblk *pblk, struct nvm_rq *rqd,
			atomic_dec(&e_line->left_eblks);
			atomic_dec(&e_line->left_eblks);


			*erase_ppa = rqd->ppa_list[i];
			*erase_ppa = rqd->ppa_list[i];
			erase_ppa->g.blk = e_line->id;
			erase_ppa->a.blk = e_line->id;


			spin_unlock(&e_line->lock);
			spin_unlock(&e_line->lock);


@@ -168,6 +168,6 @@ void pblk_map_erase_rq(struct pblk *pblk, struct nvm_rq *rqd,
		set_bit(bit, e_line->erase_bitmap);
		set_bit(bit, e_line->erase_bitmap);
		atomic_dec(&e_line->left_eblks);
		atomic_dec(&e_line->left_eblks);
		*erase_ppa = pblk->luns[bit].bppa; /* set ch and lun */
		*erase_ppa = pblk->luns[bit].bppa; /* set ch and lun */
		erase_ppa->g.blk = e_line->id;
		erase_ppa->a.blk = e_line->id;
	}
	}
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -39,8 +39,8 @@ static ssize_t pblk_sysfs_luns_show(struct pblk *pblk, char *page)
		sz += snprintf(page + sz, PAGE_SIZE - sz,
		sz += snprintf(page + sz, PAGE_SIZE - sz,
				"pblk: pos:%d, ch:%d, lun:%d - %d\n",
				"pblk: pos:%d, ch:%d, lun:%d - %d\n",
					i,
					i,
					rlun->bppa.g.ch,
					rlun->bppa.a.ch,
					rlun->bppa.g.lun,
					rlun->bppa.a.lun,
					active);
					active);
	}
	}


+2 −2
Original line number Original line Diff line number Diff line
@@ -936,12 +936,12 @@ static inline int pblk_pad_distance(struct pblk *pblk)


static inline int pblk_ppa_to_line(struct ppa_addr p)
static inline int pblk_ppa_to_line(struct ppa_addr p)
{
{
	return p.g.blk;
	return p.a.blk;
}
}


static inline int pblk_ppa_to_pos(struct nvm_geo *geo, struct ppa_addr p)
static inline int pblk_ppa_to_pos(struct nvm_geo *geo, struct ppa_addr p)
{
{
	return p.g.lun * geo->num_ch + p.g.ch;
	return p.a.lun * geo->num_ch + p.a.ch;
}
}


static inline struct ppa_addr addr_to_gen_ppa(struct pblk *pblk, u64 paddr,
static inline struct ppa_addr addr_to_gen_ppa(struct pblk *pblk, u64 paddr,
Loading