Skip to content

Commit dab8ee9

Browse files
Matias Bjørlingaxboe
authored andcommitted
lightnvm: cleanup nvm transformation functions
Going from target specific ppa addresses to device was accomplished by first converting target to generic ppa addresses and generic to device addresses. The conversion was either open-coded or used the built-in nvm_trans_* and nvm_map_* functions for conversion. Simplify the interface and cleanup the calls to provide clean functions that now either take a list of ppas or a nvm_rq, and is exposed through: void nvm_ppa_* - target to/from device with a list of PPAs, void nvm_rq_* - target to/from device with a nvm_rq. Signed-off-by: Matias Bjørling <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 61a561d commit dab8ee9

File tree

2 files changed

+40
-89
lines changed

2 files changed

+40
-89
lines changed

drivers/lightnvm/core.c

Lines changed: 34 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,6 @@ struct nvm_area {
5050
sector_t end; /* end is excluded */
5151
};
5252

53-
enum {
54-
TRANS_TGT_TO_DEV = 0x0,
55-
TRANS_DEV_TO_TGT = 0x1,
56-
};
57-
5853
static struct nvm_target *nvm_find_target(struct nvm_dev *dev, const char *name)
5954
{
6055
struct nvm_target *tgt;
@@ -428,38 +423,46 @@ static void nvm_map_to_tgt(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *p)
428423
p->g.lun -= lun_roff;
429424
}
430425

431-
static void nvm_trans_rq(struct nvm_tgt_dev *tgt_dev, struct nvm_rq *rqd,
432-
int flag)
426+
static void nvm_ppa_tgt_to_dev(struct nvm_tgt_dev *tgt_dev,
427+
struct ppa_addr *ppa_list, int nr_ppas)
433428
{
434429
int i;
435430

436-
if (rqd->nr_ppas == 1) {
437-
if (flag == TRANS_TGT_TO_DEV)
438-
nvm_map_to_dev(tgt_dev, &rqd->ppa_addr);
439-
else
440-
nvm_map_to_tgt(tgt_dev, &rqd->ppa_addr);
441-
return;
431+
for (i = 0; i < nr_ppas; i++) {
432+
nvm_map_to_dev(tgt_dev, &ppa_list[i]);
433+
ppa_list[i] = generic_to_dev_addr(tgt_dev, ppa_list[i]);
442434
}
435+
}
443436

444-
for (i = 0; i < rqd->nr_ppas; i++) {
445-
if (flag == TRANS_TGT_TO_DEV)
446-
nvm_map_to_dev(tgt_dev, &rqd->ppa_list[i]);
447-
else
448-
nvm_map_to_tgt(tgt_dev, &rqd->ppa_list[i]);
437+
static void nvm_ppa_dev_to_tgt(struct nvm_tgt_dev *tgt_dev,
438+
struct ppa_addr *ppa_list, int nr_ppas)
439+
{
440+
int i;
441+
442+
for (i = 0; i < nr_ppas; i++) {
443+
ppa_list[i] = dev_to_generic_addr(tgt_dev, ppa_list[i]);
444+
nvm_map_to_tgt(tgt_dev, &ppa_list[i]);
449445
}
450446
}
451447

452-
static struct ppa_addr nvm_trans_ppa(struct nvm_tgt_dev *tgt_dev,
453-
struct ppa_addr p, int dir)
448+
static void nvm_rq_tgt_to_dev(struct nvm_tgt_dev *tgt_dev, struct nvm_rq *rqd)
454449
{
455-
struct ppa_addr ppa = p;
450+
if (rqd->nr_ppas == 1) {
451+
nvm_ppa_tgt_to_dev(tgt_dev, &rqd->ppa_addr, 1);
452+
return;
453+
}
456454

457-
if (dir == TRANS_TGT_TO_DEV)
458-
nvm_map_to_dev(tgt_dev, &ppa);
459-
else
460-
nvm_map_to_tgt(tgt_dev, &ppa);
455+
nvm_ppa_tgt_to_dev(tgt_dev, rqd->ppa_list, rqd->nr_ppas);
456+
}
457+
458+
static void nvm_rq_dev_to_tgt(struct nvm_tgt_dev *tgt_dev, struct nvm_rq *rqd)
459+
{
460+
if (rqd->nr_ppas == 1) {
461+
nvm_ppa_dev_to_tgt(tgt_dev, &rqd->ppa_addr, 1);
462+
return;
463+
}
461464

462-
return ppa;
465+
nvm_ppa_dev_to_tgt(tgt_dev, rqd->ppa_list, rqd->nr_ppas);
463466
}
464467

465468
void nvm_part_to_tgt(struct nvm_dev *dev, sector_t *entries,
@@ -564,26 +567,6 @@ static struct nvm_dev *nvm_find_nvm_dev(const char *name)
564567
return NULL;
565568
}
566569

567-
static void nvm_tgt_generic_to_addr_mode(struct nvm_tgt_dev *tgt_dev,
568-
struct nvm_rq *rqd)
569-
{
570-
struct nvm_dev *dev = tgt_dev->parent;
571-
int i;
572-
573-
if (rqd->nr_ppas > 1) {
574-
for (i = 0; i < rqd->nr_ppas; i++) {
575-
rqd->ppa_list[i] = nvm_trans_ppa(tgt_dev,
576-
rqd->ppa_list[i], TRANS_TGT_TO_DEV);
577-
rqd->ppa_list[i] = generic_to_dev_addr(dev,
578-
rqd->ppa_list[i]);
579-
}
580-
} else {
581-
rqd->ppa_addr = nvm_trans_ppa(tgt_dev, rqd->ppa_addr,
582-
TRANS_TGT_TO_DEV);
583-
rqd->ppa_addr = generic_to_dev_addr(dev, rqd->ppa_addr);
584-
}
585-
}
586-
587570
int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *ppas,
588571
int nr_ppas, int type)
589572
{
@@ -599,7 +582,7 @@ int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *ppas,
599582
memset(&rqd, 0, sizeof(struct nvm_rq));
600583

601584
nvm_set_rqd_ppalist(dev, &rqd, ppas, nr_ppas, 1);
602-
nvm_tgt_generic_to_addr_mode(tgt_dev, &rqd);
585+
nvm_rq_tgt_to_dev(tgt_dev, &rqd);
603586

604587
ret = dev->ops->set_bb_tbl(dev, &rqd.ppa_addr, rqd.nr_ppas, type);
605588
nvm_free_rqd_ppalist(dev, &rqd);
@@ -627,8 +610,7 @@ int nvm_submit_io(struct nvm_tgt_dev *tgt_dev, struct nvm_rq *rqd)
627610
if (!dev->ops->submit_io)
628611
return -ENODEV;
629612

630-
/* Convert address space */
631-
nvm_generic_to_addr_mode(dev, rqd);
613+
nvm_rq_tgt_to_dev(tgt_dev, rqd);
632614

633615
rqd->dev = tgt_dev;
634616
return dev->ops->submit_io(dev, rqd);
@@ -652,7 +634,7 @@ int nvm_erase_blk(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *ppas, int flags)
652634
if (ret)
653635
return ret;
654636

655-
nvm_generic_to_addr_mode(dev, &rqd);
637+
nvm_rq_tgt_to_dev(tgt_dev, &rqd);
656638

657639
rqd.flags = flags;
658640

@@ -741,34 +723,6 @@ void nvm_put_area(struct nvm_tgt_dev *tgt_dev, sector_t begin)
741723
}
742724
EXPORT_SYMBOL(nvm_put_area);
743725

744-
void nvm_addr_to_generic_mode(struct nvm_dev *dev, struct nvm_rq *rqd)
745-
{
746-
int i;
747-
748-
if (rqd->nr_ppas > 1) {
749-
for (i = 0; i < rqd->nr_ppas; i++)
750-
rqd->ppa_list[i] = dev_to_generic_addr(dev,
751-
rqd->ppa_list[i]);
752-
} else {
753-
rqd->ppa_addr = dev_to_generic_addr(dev, rqd->ppa_addr);
754-
}
755-
}
756-
EXPORT_SYMBOL(nvm_addr_to_generic_mode);
757-
758-
void nvm_generic_to_addr_mode(struct nvm_dev *dev, struct nvm_rq *rqd)
759-
{
760-
int i;
761-
762-
if (rqd->nr_ppas > 1) {
763-
for (i = 0; i < rqd->nr_ppas; i++)
764-
rqd->ppa_list[i] = generic_to_dev_addr(dev,
765-
rqd->ppa_list[i]);
766-
} else {
767-
rqd->ppa_addr = generic_to_dev_addr(dev, rqd->ppa_addr);
768-
}
769-
}
770-
EXPORT_SYMBOL(nvm_generic_to_addr_mode);
771-
772726
int nvm_set_rqd_ppalist(struct nvm_dev *dev, struct nvm_rq *rqd,
773727
const struct ppa_addr *ppas, int nr_ppas, int vblk)
774728
{
@@ -826,7 +780,7 @@ void nvm_end_io(struct nvm_rq *rqd, int error)
826780

827781
/* Convert address space */
828782
if (tgt_dev)
829-
nvm_trans_rq(tgt_dev, rqd, TRANS_DEV_TO_TGT);
783+
nvm_rq_dev_to_tgt(tgt_dev, rqd);
830784

831785
rqd->error = error;
832786
ins->tt->end_io(rqd);
@@ -874,8 +828,7 @@ int nvm_get_tgt_bb_tbl(struct nvm_tgt_dev *tgt_dev, struct ppa_addr ppa,
874828
{
875829
struct nvm_dev *dev = tgt_dev->parent;
876830

877-
ppa = nvm_trans_ppa(tgt_dev, ppa, TRANS_TGT_TO_DEV);
878-
ppa = generic_to_dev_addr(dev, ppa);
831+
nvm_ppa_tgt_to_dev(tgt_dev, &ppa, 1);
879832

880833
return dev->ops->get_bb_tbl(dev, ppa, blks);
881834
}

include/linux/lightnvm.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -378,10 +378,10 @@ static inline struct ppa_addr linear_to_generic_addr(struct nvm_geo *geo,
378378
return l;
379379
}
380380

381-
static inline struct ppa_addr generic_to_dev_addr(struct nvm_dev *dev,
382-
struct ppa_addr r)
381+
static inline struct ppa_addr generic_to_dev_addr(struct nvm_tgt_dev *tgt_dev,
382+
struct ppa_addr r)
383383
{
384-
struct nvm_geo *geo = &dev->geo;
384+
struct nvm_geo *geo = &tgt_dev->geo;
385385
struct ppa_addr l;
386386

387387
l.ppa = ((u64)r.g.blk) << geo->ppaf.blk_offset;
@@ -394,10 +394,10 @@ static inline struct ppa_addr generic_to_dev_addr(struct nvm_dev *dev,
394394
return l;
395395
}
396396

397-
static inline struct ppa_addr dev_to_generic_addr(struct nvm_dev *dev,
398-
struct ppa_addr r)
397+
static inline struct ppa_addr dev_to_generic_addr(struct nvm_tgt_dev *tgt_dev,
398+
struct ppa_addr r)
399399
{
400-
struct nvm_geo *geo = &dev->geo;
400+
struct nvm_geo *geo = &tgt_dev->geo;
401401
struct ppa_addr l;
402402

403403
l.ppa = 0;
@@ -477,8 +477,6 @@ extern int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *, struct ppa_addr *,
477477
int, int);
478478
extern int nvm_max_phys_sects(struct nvm_tgt_dev *);
479479
extern int nvm_submit_io(struct nvm_tgt_dev *, struct nvm_rq *);
480-
extern void nvm_generic_to_addr_mode(struct nvm_dev *, struct nvm_rq *);
481-
extern void nvm_addr_to_generic_mode(struct nvm_dev *, struct nvm_rq *);
482480
extern int nvm_set_rqd_ppalist(struct nvm_dev *, struct nvm_rq *,
483481
const struct ppa_addr *, int, int);
484482
extern void nvm_free_rqd_ppalist(struct nvm_dev *, struct nvm_rq *);

0 commit comments

Comments
 (0)