lightnvm: remove nvm_dev_ops->max_phys_sect
The value of max_phys_sect is always static. Instead of defining it in the nvm_dev_ops structure, declare it as a global value. Signed-off-by: Matias Bjørling <mb@lightnvm.io> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
af569398c3
commit
89a09c5643
@ -407,7 +407,8 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
|
|||||||
tdisk->private_data = targetdata;
|
tdisk->private_data = targetdata;
|
||||||
tqueue->queuedata = targetdata;
|
tqueue->queuedata = targetdata;
|
||||||
|
|
||||||
blk_queue_max_hw_sectors(tqueue, 8 * dev->ops->max_phys_sect);
|
blk_queue_max_hw_sectors(tqueue,
|
||||||
|
(dev->geo.sec_size >> 9) * NVM_MAX_VLBA);
|
||||||
|
|
||||||
set_capacity(tdisk, tt->capacity(targetdata));
|
set_capacity(tdisk, tt->capacity(targetdata));
|
||||||
add_disk(tdisk);
|
add_disk(tdisk);
|
||||||
@ -719,7 +720,7 @@ int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *ppas,
|
|||||||
struct nvm_rq rqd;
|
struct nvm_rq rqd;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (nr_ppas > dev->ops->max_phys_sect) {
|
if (nr_ppas > NVM_MAX_VLBA) {
|
||||||
pr_err("nvm: unable to update all blocks atomically\n");
|
pr_err("nvm: unable to update all blocks atomically\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
@ -740,14 +741,6 @@ int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *tgt_dev, struct ppa_addr *ppas,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(nvm_set_tgt_bb_tbl);
|
EXPORT_SYMBOL(nvm_set_tgt_bb_tbl);
|
||||||
|
|
||||||
int nvm_max_phys_sects(struct nvm_tgt_dev *tgt_dev)
|
|
||||||
{
|
|
||||||
struct nvm_dev *dev = tgt_dev->parent;
|
|
||||||
|
|
||||||
return dev->ops->max_phys_sect;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(nvm_max_phys_sects);
|
|
||||||
|
|
||||||
int nvm_submit_io(struct nvm_tgt_dev *tgt_dev, struct nvm_rq *rqd)
|
int nvm_submit_io(struct nvm_tgt_dev *tgt_dev, struct nvm_rq *rqd)
|
||||||
{
|
{
|
||||||
struct nvm_dev *dev = tgt_dev->parent;
|
struct nvm_dev *dev = tgt_dev->parent;
|
||||||
@ -965,17 +958,10 @@ int nvm_register(struct nvm_dev *dev)
|
|||||||
if (!dev->q || !dev->ops)
|
if (!dev->q || !dev->ops)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (dev->ops->max_phys_sect > 256) {
|
dev->dma_pool = dev->ops->create_dma_pool(dev, "ppalist");
|
||||||
pr_info("nvm: max sectors supported is 256.\n");
|
if (!dev->dma_pool) {
|
||||||
return -EINVAL;
|
pr_err("nvm: could not create dma pool\n");
|
||||||
}
|
return -ENOMEM;
|
||||||
|
|
||||||
if (dev->ops->max_phys_sect > 1) {
|
|
||||||
dev->dma_pool = dev->ops->create_dma_pool(dev, "ppalist");
|
|
||||||
if (!dev->dma_pool) {
|
|
||||||
pr_err("nvm: could not create dma pool\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvm_init(dev);
|
ret = nvm_init(dev);
|
||||||
|
@ -260,8 +260,7 @@ static int pblk_core_init(struct pblk *pblk)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* Internal bios can be at most the sectors signaled by the device. */
|
/* Internal bios can be at most the sectors signaled by the device. */
|
||||||
pblk->page_bio_pool = mempool_create_page_pool(nvm_max_phys_sects(dev),
|
pblk->page_bio_pool = mempool_create_page_pool(NVM_MAX_VLBA, 0);
|
||||||
0);
|
|
||||||
if (!pblk->page_bio_pool)
|
if (!pblk->page_bio_pool)
|
||||||
goto free_global_caches;
|
goto free_global_caches;
|
||||||
|
|
||||||
@ -716,12 +715,12 @@ static int pblk_lines_init(struct pblk *pblk)
|
|||||||
|
|
||||||
pblk->min_write_pgs = geo->sec_per_pl * (geo->sec_size / PAGE_SIZE);
|
pblk->min_write_pgs = geo->sec_per_pl * (geo->sec_size / PAGE_SIZE);
|
||||||
max_write_ppas = pblk->min_write_pgs * geo->all_luns;
|
max_write_ppas = pblk->min_write_pgs * geo->all_luns;
|
||||||
pblk->max_write_pgs = (max_write_ppas < nvm_max_phys_sects(dev)) ?
|
pblk->max_write_pgs = min_t(int, max_write_ppas, NVM_MAX_VLBA);
|
||||||
max_write_ppas : nvm_max_phys_sects(dev);
|
|
||||||
pblk_set_sec_per_write(pblk, pblk->min_write_pgs);
|
pblk_set_sec_per_write(pblk, pblk->min_write_pgs);
|
||||||
|
|
||||||
if (pblk->max_write_pgs > PBLK_MAX_REQ_ADDRS) {
|
if (pblk->max_write_pgs > PBLK_MAX_REQ_ADDRS) {
|
||||||
pr_err("pblk: cannot support device max_phys_sect\n");
|
pr_err("pblk: vector list too big(%u > %u)\n",
|
||||||
|
pblk->max_write_pgs, PBLK_MAX_REQ_ADDRS);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,17 +21,15 @@ void pblk_submit_rec(struct work_struct *work)
|
|||||||
struct pblk_rec_ctx *recovery =
|
struct pblk_rec_ctx *recovery =
|
||||||
container_of(work, struct pblk_rec_ctx, ws_rec);
|
container_of(work, struct pblk_rec_ctx, ws_rec);
|
||||||
struct pblk *pblk = recovery->pblk;
|
struct pblk *pblk = recovery->pblk;
|
||||||
struct nvm_tgt_dev *dev = pblk->dev;
|
|
||||||
struct nvm_rq *rqd = recovery->rqd;
|
struct nvm_rq *rqd = recovery->rqd;
|
||||||
struct pblk_c_ctx *c_ctx = nvm_rq_to_pdu(rqd);
|
struct pblk_c_ctx *c_ctx = nvm_rq_to_pdu(rqd);
|
||||||
int max_secs = nvm_max_phys_sects(dev);
|
|
||||||
struct bio *bio;
|
struct bio *bio;
|
||||||
unsigned int nr_rec_secs;
|
unsigned int nr_rec_secs;
|
||||||
unsigned int pgs_read;
|
unsigned int pgs_read;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
nr_rec_secs = bitmap_weight((unsigned long int *)&rqd->ppa_status,
|
nr_rec_secs = bitmap_weight((unsigned long int *)&rqd->ppa_status,
|
||||||
max_secs);
|
NVM_MAX_VLBA);
|
||||||
|
|
||||||
bio = bio_alloc(GFP_KERNEL, nr_rec_secs);
|
bio = bio_alloc(GFP_KERNEL, nr_rec_secs);
|
||||||
|
|
||||||
@ -74,8 +72,6 @@ int pblk_recov_setup_rq(struct pblk *pblk, struct pblk_c_ctx *c_ctx,
|
|||||||
struct pblk_rec_ctx *recovery, u64 *comp_bits,
|
struct pblk_rec_ctx *recovery, u64 *comp_bits,
|
||||||
unsigned int comp)
|
unsigned int comp)
|
||||||
{
|
{
|
||||||
struct nvm_tgt_dev *dev = pblk->dev;
|
|
||||||
int max_secs = nvm_max_phys_sects(dev);
|
|
||||||
struct nvm_rq *rec_rqd;
|
struct nvm_rq *rec_rqd;
|
||||||
struct pblk_c_ctx *rec_ctx;
|
struct pblk_c_ctx *rec_ctx;
|
||||||
int nr_entries = c_ctx->nr_valid + c_ctx->nr_padded;
|
int nr_entries = c_ctx->nr_valid + c_ctx->nr_padded;
|
||||||
@ -86,7 +82,7 @@ int pblk_recov_setup_rq(struct pblk *pblk, struct pblk_c_ctx *c_ctx,
|
|||||||
/* Copy completion bitmap, but exclude the first X completed entries */
|
/* Copy completion bitmap, but exclude the first X completed entries */
|
||||||
bitmap_shift_right((unsigned long int *)&rec_rqd->ppa_status,
|
bitmap_shift_right((unsigned long int *)&rec_rqd->ppa_status,
|
||||||
(unsigned long int *)comp_bits,
|
(unsigned long int *)comp_bits,
|
||||||
comp, max_secs);
|
comp, NVM_MAX_VLBA);
|
||||||
|
|
||||||
/* Save the context for the entries that need to be re-written and
|
/* Save the context for the entries that need to be re-written and
|
||||||
* update current context with the completed entries.
|
* update current context with the completed entries.
|
||||||
|
@ -612,8 +612,6 @@ static struct nvm_dev_ops nvme_nvm_dev_ops = {
|
|||||||
.destroy_dma_pool = nvme_nvm_destroy_dma_pool,
|
.destroy_dma_pool = nvme_nvm_destroy_dma_pool,
|
||||||
.dev_dma_alloc = nvme_nvm_dev_dma_alloc,
|
.dev_dma_alloc = nvme_nvm_dev_dma_alloc,
|
||||||
.dev_dma_free = nvme_nvm_dev_dma_free,
|
.dev_dma_free = nvme_nvm_dev_dma_free,
|
||||||
|
|
||||||
.max_phys_sect = 64,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int nvme_nvm_submit_user_cmd(struct request_queue *q,
|
static int nvme_nvm_submit_user_cmd(struct request_queue *q,
|
||||||
@ -932,8 +930,7 @@ static ssize_t nvm_dev_attr_show_12(struct device *dev,
|
|||||||
} else if (strcmp(attr->name, "media_capabilities") == 0) {
|
} else if (strcmp(attr->name, "media_capabilities") == 0) {
|
||||||
return scnprintf(page, PAGE_SIZE, "0x%08x\n", id->mccap);
|
return scnprintf(page, PAGE_SIZE, "0x%08x\n", id->mccap);
|
||||||
} else if (strcmp(attr->name, "max_phys_secs") == 0) {
|
} else if (strcmp(attr->name, "max_phys_secs") == 0) {
|
||||||
return scnprintf(page, PAGE_SIZE, "%u\n",
|
return scnprintf(page, PAGE_SIZE, "%u\n", NVM_MAX_VLBA);
|
||||||
ndev->ops->max_phys_sect);
|
|
||||||
} else {
|
} else {
|
||||||
return scnprintf(page,
|
return scnprintf(page,
|
||||||
PAGE_SIZE,
|
PAGE_SIZE,
|
||||||
|
@ -73,8 +73,6 @@ struct nvm_dev_ops {
|
|||||||
nvm_destroy_dma_pool_fn *destroy_dma_pool;
|
nvm_destroy_dma_pool_fn *destroy_dma_pool;
|
||||||
nvm_dev_dma_alloc_fn *dev_dma_alloc;
|
nvm_dev_dma_alloc_fn *dev_dma_alloc;
|
||||||
nvm_dev_dma_free_fn *dev_dma_free;
|
nvm_dev_dma_free_fn *dev_dma_free;
|
||||||
|
|
||||||
unsigned int max_phys_sect;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_NVM
|
#ifdef CONFIG_NVM
|
||||||
@ -228,6 +226,8 @@ struct nvm_target {
|
|||||||
#define NVM_VERSION_MINOR 0
|
#define NVM_VERSION_MINOR 0
|
||||||
#define NVM_VERSION_PATCH 0
|
#define NVM_VERSION_PATCH 0
|
||||||
|
|
||||||
|
#define NVM_MAX_VLBA (64) /* max logical blocks in a vector command */
|
||||||
|
|
||||||
struct nvm_rq;
|
struct nvm_rq;
|
||||||
typedef void (nvm_end_io_fn)(struct nvm_rq *);
|
typedef void (nvm_end_io_fn)(struct nvm_rq *);
|
||||||
|
|
||||||
@ -436,7 +436,6 @@ extern void nvm_unregister(struct nvm_dev *);
|
|||||||
|
|
||||||
extern int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *, struct ppa_addr *,
|
extern int nvm_set_tgt_bb_tbl(struct nvm_tgt_dev *, struct ppa_addr *,
|
||||||
int, int);
|
int, int);
|
||||||
extern int nvm_max_phys_sects(struct nvm_tgt_dev *);
|
|
||||||
extern int nvm_submit_io(struct nvm_tgt_dev *, struct nvm_rq *);
|
extern int nvm_submit_io(struct nvm_tgt_dev *, struct nvm_rq *);
|
||||||
extern int nvm_submit_io_sync(struct nvm_tgt_dev *, struct nvm_rq *);
|
extern int nvm_submit_io_sync(struct nvm_tgt_dev *, struct nvm_rq *);
|
||||||
extern void nvm_end_io(struct nvm_rq *);
|
extern void nvm_end_io(struct nvm_rq *);
|
||||||
|
Loading…
Reference in New Issue
Block a user