From: "Javier González" <jg@lightnvm.io>
To: mb@lightnvm.io
Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org,
"Javier González" <jg@lightnvm.io>,
"Javier González" <javier@cnexlabs.com>,
"Matias Bjørling" <m@bjorling.me>
Subject: [PATCH 01/20] lightnvm: enable to send hint to erase command
Date: Fri, 18 Nov 2016 15:43:23 +0100 [thread overview]
Message-ID: <1479480222-18790-2-git-send-email-javier@cnexlabs.com> (raw)
In-Reply-To: <1479480222-18790-1-git-send-email-javier@cnexlabs.com>
From: Javier González <jg@lightnvm.io>
Erases might be subject to host hints. An example is multi-plane
programming to erase blocks in parallel. Enable targets to specify this
hints.
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <m@bjorling.me>
---
drivers/lightnvm/core.c | 9 ++++++---
drivers/lightnvm/gennvm.c | 5 ++---
drivers/lightnvm/rrpc.c | 2 +-
drivers/lightnvm/sysblk.c | 4 ++--
drivers/nvme/host/lightnvm.c | 1 +
include/linux/lightnvm.h | 7 +++----
6 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 1111740..8664fe0 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -202,9 +202,9 @@ int nvm_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
}
EXPORT_SYMBOL(nvm_submit_io);
-int nvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk)
+int nvm_erase_blk(struct nvm_dev *dev, struct nvm_block *blk, int flags)
{
- return dev->mt->erase_blk(dev, blk, 0);
+ return dev->mt->erase_blk(dev, blk, flags);
}
EXPORT_SYMBOL(nvm_erase_blk);
@@ -285,7 +285,8 @@ void nvm_free_rqd_ppalist(struct nvm_dev *dev, struct nvm_rq *rqd)
}
EXPORT_SYMBOL(nvm_free_rqd_ppalist);
-int nvm_erase_ppa(struct nvm_dev *dev, struct ppa_addr *ppas, int nr_ppas)
+int nvm_erase_ppa(struct nvm_dev *dev, struct ppa_addr *ppas, int nr_ppas,
+ int flags)
{
struct nvm_rq rqd;
int ret;
@@ -301,6 +302,8 @@ int nvm_erase_ppa(struct nvm_dev *dev, struct ppa_addr *ppas, int nr_ppas)
nvm_generic_to_addr_mode(dev, &rqd);
+ rqd.flags = flags;
+
ret = dev->ops->erase_block(dev, &rqd);
nvm_free_rqd_ppalist(dev, &rqd);
diff --git a/drivers/lightnvm/gennvm.c b/drivers/lightnvm/gennvm.c
index b74174c..730d736 100644
--- a/drivers/lightnvm/gennvm.c
+++ b/drivers/lightnvm/gennvm.c
@@ -593,12 +593,11 @@ static int gen_submit_io(struct nvm_dev *dev, struct nvm_rq *rqd)
return dev->ops->submit_io(dev, rqd);
}
-static int gen_erase_blk(struct nvm_dev *dev, struct nvm_block *blk,
- unsigned long flags)
+static int gen_erase_blk(struct nvm_dev *dev, struct nvm_block *blk, int flags)
{
struct ppa_addr addr = block_to_ppa(dev, blk);
- return nvm_erase_ppa(dev, &addr, 1);
+ return nvm_erase_ppa(dev, &addr, 1, flags);
}
static int gen_reserve_lun(struct nvm_dev *dev, int lunid)
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index 37fcaad..067e890 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -404,7 +404,7 @@ static void rrpc_block_gc(struct work_struct *work)
if (rrpc_move_valid_pages(rrpc, rblk))
goto put_back;
- if (nvm_erase_blk(dev, rblk->parent))
+ if (nvm_erase_blk(dev, rblk->parent, 0))
goto put_back;
rrpc_put_blk(rrpc, rblk);
diff --git a/drivers/lightnvm/sysblk.c b/drivers/lightnvm/sysblk.c
index a75bd28..d229067 100644
--- a/drivers/lightnvm/sysblk.c
+++ b/drivers/lightnvm/sysblk.c
@@ -379,7 +379,7 @@ static int nvm_prepare_new_sysblks(struct nvm_dev *dev, struct sysblk_scan *s)
ppa = &s->ppas[scan_ppa_idx(i, nxt_blk)];
ppa->g.pg = ppa_to_slc(dev, 0);
- ret = nvm_erase_ppa(dev, ppa, 1);
+ ret = nvm_erase_ppa(dev, ppa, 1, 0);
if (ret)
return ret;
@@ -725,7 +725,7 @@ int nvm_dev_factory(struct nvm_dev *dev, int flags)
/* continue to erase until list of blks until empty */
while ((ppa_cnt =
nvm_fact_get_blks(dev, ppas, max_ppas, blk_bitmap)) > 0)
- nvm_erase_ppa(dev, ppas, ppa_cnt);
+ nvm_erase_ppa(dev, ppas, ppa_cnt, 0);
/* mark host reserved blocks free */
if (flags & NVM_FACTORY_RESET_HOST_BLKS) {
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index f23e6fe..037dff5 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -526,6 +526,7 @@ static int nvme_nvm_erase_block(struct nvm_dev *dev, struct nvm_rq *rqd)
c.erase.nsid = cpu_to_le32(ns->ns_id);
c.erase.spba = cpu_to_le64(rqd->ppa_addr.ppa);
c.erase.length = cpu_to_le16(rqd->nr_ppas - 1);
+ c.erase.control = cpu_to_le16(rqd->flags);
return nvme_submit_sync_cmd(q, (struct nvme_command *)&c, NULL, 0);
}
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index fb2e601..d87be02 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -470,8 +470,7 @@ typedef int (nvmm_open_blk_fn)(struct nvm_dev *, struct nvm_block *);
typedef int (nvmm_close_blk_fn)(struct nvm_dev *, struct nvm_block *);
typedef void (nvmm_flush_blk_fn)(struct nvm_dev *, struct nvm_block *);
typedef int (nvmm_submit_io_fn)(struct nvm_dev *, struct nvm_rq *);
-typedef int (nvmm_erase_blk_fn)(struct nvm_dev *, struct nvm_block *,
- unsigned long);
+typedef int (nvmm_erase_blk_fn)(struct nvm_dev *, struct nvm_block *, int);
typedef void (nvmm_mark_blk_fn)(struct nvm_dev *, struct ppa_addr, int);
typedef struct nvm_lun *(nvmm_get_lun_fn)(struct nvm_dev *, int);
typedef int (nvmm_reserve_lun)(struct nvm_dev *, int);
@@ -537,8 +536,8 @@ extern void nvm_addr_to_generic_mode(struct nvm_dev *, struct nvm_rq *);
extern int nvm_set_rqd_ppalist(struct nvm_dev *, struct nvm_rq *,
const struct ppa_addr *, int, int);
extern void nvm_free_rqd_ppalist(struct nvm_dev *, struct nvm_rq *);
-extern int nvm_erase_ppa(struct nvm_dev *, struct ppa_addr *, int);
-extern int nvm_erase_blk(struct nvm_dev *, struct nvm_block *);
+extern int nvm_erase_ppa(struct nvm_dev *, struct ppa_addr *, int, int);
+extern int nvm_erase_blk(struct nvm_dev *, struct nvm_block *, int);
extern void nvm_end_io(struct nvm_rq *, int);
extern int nvm_submit_ppa(struct nvm_dev *, struct ppa_addr *, int, int, int,
void *, int);
--
2.7.4
next prev parent reply other threads:[~2016-11-18 14:52 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-18 14:43 [PATCH 00/20] lightnvm: simplify media manager Javier González
2016-11-18 14:43 ` Javier González [this message]
2016-11-18 14:43 ` [PATCH 02/20] lightnvm: do not protect block 0 Javier González
2016-11-18 14:43 ` [PATCH 03/20] lightnvm: export set bad block table Javier González
2016-11-18 14:43 ` [PATCH 04/20] lightnvm: add ECC error codes Javier González
2016-11-18 14:43 ` [PATCH 05/20] lightnvm: rrpc: split bios of size > 256kb Javier González
2016-11-18 14:43 ` [PATCH 06/20] lightnvm: remove sysfs configuration interface Javier González
2016-11-18 14:43 ` [PATCH 07/20] lightnvm: cleanup unused target operations Javier González
2016-11-18 14:43 ` [PATCH 08/20] lightnvm: make address conversion functions global Javier González
2016-11-18 14:43 ` [PATCH 09/20] lightnvm: remove unnecessary variables in rrpc Javier González
2016-11-18 14:43 ` [PATCH 10/20] lightnvm: use constant name instead of value Javier González
2016-11-18 14:43 ` [PATCH 11/20] lightnvm: remove gen_lun abstraction Javier González
2016-11-18 14:43 ` [PATCH 12/20] lightnvm: manage lun partitions internally in mm Javier González
2016-11-18 14:43 ` [PATCH 13/20] lightnvm: move block provisioning to targets Javier González
2016-11-18 18:20 ` kbuild test robot
2016-11-18 14:43 ` [PATCH 14/20] lightnvm: remove get_lun operation on gennvm Javier González
2016-11-18 14:43 ` [PATCH 15/20] lightnvm: remove debug lun statistics from gennvm Javier González
2016-11-18 14:43 ` [PATCH 16/20] lightnvm: eliminate nvm_block abstraction on mm Javier González
2016-11-18 18:45 ` kbuild test robot
2016-11-18 14:43 ` [PATCH 17/20] lightnvm: eliminate nvm_lun abstraction in mm Javier González
2016-11-18 14:43 ` [PATCH 18/20] lightnvm: introduce helpers for generic ops in rrpc Javier González
2016-11-18 14:43 ` [PATCH 19/20] lightnvm: introduce max_phys_sects helper function Javier González
2016-11-18 14:43 ` [PATCH 20/20] lightnvm: use target nvm on target-specific ops Javier González
2016-11-21 11:29 ` [PATCH 00/20] lightnvm: simplify media manager Matias Bjørling
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1479480222-18790-2-git-send-email-javier@cnexlabs.com \
--to=jg@lightnvm.io \
--cc=javier@cnexlabs.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=m@bjorling.me \
--cc=mb@lightnvm.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).