2016-04-27 17:29:08

by Javier González

[permalink] [raw]
Subject: [PATCH 1/3] lightnvm: do not free unused metadata on rrpc

rrpc does not save any metadata on a given request. Thus, do not attempt
to free the metadata dma region.

Signed-off-by: Javier González <[email protected]>
---
drivers/lightnvm/rrpc.c | 2 --
1 file changed, 2 deletions(-)

diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
index c7fef71..ffcfee6 100644
--- a/drivers/lightnvm/rrpc.c
+++ b/drivers/lightnvm/rrpc.c
@@ -711,8 +711,6 @@ static void rrpc_end_io(struct nvm_rq *rqd)

if (npages > 1)
nvm_dev_dma_free(rrpc->dev, rqd->ppa_list, rqd->dma_ppa_list);
- if (rqd->metadata)
- nvm_dev_dma_free(rrpc->dev, rqd->metadata, rqd->dma_metadata);

mempool_free(rqd, rrpc->rq_pool);
}
--
2.5.0


2016-04-27 17:29:11

by Javier González

[permalink] [raw]
Subject: [PATCH 3/3] lightnvm: rename dma helper functions

Until now, the dma pool have been exclusively used to allocate the ppa
list being sent to the device. In pblk (upcoming), we use these pools to
allocate metadata too. Thus, we generalize the names of some variables
on the dma helper functions to make the code more readable.

Signed-off-by: Javier González <[email protected]>
---
drivers/lightnvm/core.c | 14 +++++++-------
drivers/nvme/host/lightnvm.c | 4 ++--
include/linux/lightnvm.h | 2 +-
3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 9b6c1c9..cb21331 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -87,15 +87,15 @@ EXPORT_SYMBOL(nvm_unregister_tgt_type);
void *nvm_dev_dma_alloc(struct nvm_dev *dev, gfp_t mem_flags,
dma_addr_t *dma_handler)
{
- return dev->ops->dev_dma_alloc(dev, dev->ppalist_pool, mem_flags,
+ return dev->ops->dev_dma_alloc(dev, dev->dma_page_pool, mem_flags,
dma_handler);
}
EXPORT_SYMBOL(nvm_dev_dma_alloc);

-void nvm_dev_dma_free(struct nvm_dev *dev, void *ppa_list,
+void nvm_dev_dma_free(struct nvm_dev *dev, void *addr,
dma_addr_t dma_handler)
{
- dev->ops->dev_dma_free(dev->ppalist_pool, ppa_list, dma_handler);
+ dev->ops->dev_dma_free(dev->dma_page_pool, addr, dma_handler);
}
EXPORT_SYMBOL(nvm_dev_dma_free);

@@ -653,8 +653,8 @@ err:

static void nvm_exit(struct nvm_dev *dev)
{
- if (dev->ppalist_pool)
- dev->ops->destroy_dma_pool(dev->ppalist_pool);
+ if (dev->dma_page_pool)
+ dev->ops->destroy_dma_pool(dev->dma_page_pool);
nvm_free(dev);

pr_info("nvm: successfully unloaded\n");
@@ -688,8 +688,8 @@ int nvm_register(struct request_queue *q, char *disk_name,
}

if (dev->ops->max_phys_sect > 1) {
- dev->ppalist_pool = dev->ops->create_dma_pool(dev, "ppalist");
- if (!dev->ppalist_pool) {
+ dev->dma_page_pool = dev->ops->create_dma_pool(dev, "ppalist");
+ if (!dev->dma_page_pool) {
pr_err("nvm: could not create ppa pool\n");
ret = -ENOMEM;
goto err_init;
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index 76f1199..33f2315 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -565,10 +565,10 @@ static void *nvme_nvm_dev_dma_alloc(struct nvm_dev *dev, void *pool,
return dma_pool_alloc(pool, mem_flags, dma_handler);
}

-static void nvme_nvm_dev_dma_free(void *pool, void *ppa_list,
+static void nvme_nvm_dev_dma_free(void *pool, void *addr,
dma_addr_t dma_handler)
{
- dma_pool_free(pool, ppa_list, dma_handler);
+ dma_pool_free(pool, addr, dma_handler);
}

static struct nvm_dev_ops nvme_nvm_dev_ops = {
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 9d8a350..7c615b0 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -368,7 +368,7 @@ struct nvm_dev {
unsigned max_pages_per_blk;

unsigned long *lun_map;
- void *ppalist_pool;
+ void *dma_page_pool;

struct nvm_id identity;

--
2.5.0

2016-04-27 17:29:09

by Javier González

[permalink] [raw]
Subject: [PATCH 2/3] lightnvm: enable metadata to be sent to device

Enable metadata to be sent to the device through the metadata field on
the physical rw nvme command. When a single ppa is sent to the device, a
64-bit integer can be sent as metadata; when a ppa list is sent, a
64-bit integer list mapping to the ppa list can be used to send
metadata.

Signed-off-by: Javier González <[email protected]>
---
drivers/nvme/host/lightnvm.c | 1 +
include/linux/lightnvm.h | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index b1a0d8b..92da28d 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -467,6 +467,7 @@ static inline void nvme_nvm_rqtocmd(struct request *rq, struct nvm_rq *rqd,
c->ph_rw.opcode = rqd->opcode;
c->ph_rw.nsid = cpu_to_le32(ns->ns_id);
c->ph_rw.spba = cpu_to_le64(rqd->ppa_addr.ppa);
+ c->ph_rw.metadata = cpu_to_le64(rqd->meta_list);
c->ph_rw.control = cpu_to_le16(rqd->flags);
c->ph_rw.length = cpu_to_le16(rqd->nr_pages - 1);

diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
index 1e3b53e..9768bae 100644
--- a/include/linux/lightnvm.h
+++ b/include/linux/lightnvm.h
@@ -239,8 +239,8 @@ struct nvm_rq {

struct ppa_addr *ppa_list;

- void *metadata;
- dma_addr_t dma_metadata;
+ void *meta_list;
+ dma_addr_t dma_meta_list;

struct completion *wait;
nvm_end_io_fn *end_io;
--
2.5.0

2016-04-27 18:54:40

by Matias Bjørling

[permalink] [raw]
Subject: Re: [PATCH 3/3] lightnvm: rename dma helper functions

On 04/27/2016 07:28 PM, Javier González wrote:
> Until now, the dma pool have been exclusively used to allocate the ppa
> list being sent to the device. In pblk (upcoming), we use these pools to
> allocate metadata too. Thus, we generalize the names of some variables
> on the dma helper functions to make the code more readable.
>
> Signed-off-by: Javier González <[email protected]>
> ---
> drivers/lightnvm/core.c | 14 +++++++-------
> drivers/nvme/host/lightnvm.c | 4 ++--
> include/linux/lightnvm.h | 2 +-
> 3 files changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
> index 9b6c1c9..cb21331 100644
> --- a/drivers/lightnvm/core.c
> +++ b/drivers/lightnvm/core.c
> @@ -87,15 +87,15 @@ EXPORT_SYMBOL(nvm_unregister_tgt_type);
> void *nvm_dev_dma_alloc(struct nvm_dev *dev, gfp_t mem_flags,
> dma_addr_t *dma_handler)
> {
> - return dev->ops->dev_dma_alloc(dev, dev->ppalist_pool, mem_flags,
> + return dev->ops->dev_dma_alloc(dev, dev->dma_page_pool, mem_flags,
> dma_handler);
> }
> EXPORT_SYMBOL(nvm_dev_dma_alloc);
>
> -void nvm_dev_dma_free(struct nvm_dev *dev, void *ppa_list,
> +void nvm_dev_dma_free(struct nvm_dev *dev, void *addr,
> dma_addr_t dma_handler)
> {
> - dev->ops->dev_dma_free(dev->ppalist_pool, ppa_list, dma_handler);
> + dev->ops->dev_dma_free(dev->dma_page_pool, addr, dma_handler);
> }
> EXPORT_SYMBOL(nvm_dev_dma_free);
>
> @@ -653,8 +653,8 @@ err:
>
> static void nvm_exit(struct nvm_dev *dev)
> {
> - if (dev->ppalist_pool)
> - dev->ops->destroy_dma_pool(dev->ppalist_pool);
> + if (dev->dma_page_pool)
> + dev->ops->destroy_dma_pool(dev->dma_page_pool);
> nvm_free(dev);
>
> pr_info("nvm: successfully unloaded\n");
> @@ -688,8 +688,8 @@ int nvm_register(struct request_queue *q, char *disk_name,
> }
>
> if (dev->ops->max_phys_sect > 1) {
> - dev->ppalist_pool = dev->ops->create_dma_pool(dev, "ppalist");
> - if (!dev->ppalist_pool) {
> + dev->dma_page_pool = dev->ops->create_dma_pool(dev, "ppalist");

rename to dmapool or something similar?

> + if (!dev->dma_page_pool) {
> pr_err("nvm: could not create ppa pool\n");

Make sure to fix up the text here as well. Else it looks good.

> ret = -ENOMEM;
> goto err_init;
> diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
> index 76f1199..33f2315 100644
> --- a/drivers/nvme/host/lightnvm.c
> +++ b/drivers/nvme/host/lightnvm.c
> @@ -565,10 +565,10 @@ static void *nvme_nvm_dev_dma_alloc(struct nvm_dev *dev, void *pool,
> return dma_pool_alloc(pool, mem_flags, dma_handler);
> }
>
> -static void nvme_nvm_dev_dma_free(void *pool, void *ppa_list,
> +static void nvme_nvm_dev_dma_free(void *pool, void *addr,
> dma_addr_t dma_handler)
> {
> - dma_pool_free(pool, ppa_list, dma_handler);
> + dma_pool_free(pool, addr, dma_handler);
> }
>
> static struct nvm_dev_ops nvme_nvm_dev_ops = {
> diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
> index 9d8a350..7c615b0 100644
> --- a/include/linux/lightnvm.h
> +++ b/include/linux/lightnvm.h
> @@ -368,7 +368,7 @@ struct nvm_dev {
> unsigned max_pages_per_blk;
>
> unsigned long *lun_map;
> - void *ppalist_pool;
> + void *dma_page_pool;
>
> struct nvm_id identity;
>
>

2016-04-27 18:56:43

by Matias Bjørling

[permalink] [raw]
Subject: Re: [PATCH 1/3] lightnvm: do not free unused metadata on rrpc

On 04/27/2016 07:28 PM, Javier González wrote:
> rrpc does not save any metadata on a given request. Thus, do not attempt
> to free the metadata dma region.
>
> Signed-off-by: Javier González <[email protected]>
> ---
> drivers/lightnvm/rrpc.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
> index c7fef71..ffcfee6 100644
> --- a/drivers/lightnvm/rrpc.c
> +++ b/drivers/lightnvm/rrpc.c
> @@ -711,8 +711,6 @@ static void rrpc_end_io(struct nvm_rq *rqd)
>
> if (npages > 1)
> nvm_dev_dma_free(rrpc->dev, rqd->ppa_list, rqd->dma_ppa_list);
> - if (rqd->metadata)
> - nvm_dev_dma_free(rrpc->dev, rqd->metadata, rqd->dma_metadata);
>
> mempool_free(rqd, rrpc->rq_pool);
> }
>

Thanks. Applied for 4.7.

2016-04-27 20:17:18

by Javier González

[permalink] [raw]
Subject: Re: [PATCH 3/3] lightnvm: rename dma helper functions


>> if (dev->ops->max_phys_sect > 1) {
>> - dev->ppalist_pool = dev->ops->create_dma_pool(dev, "ppalist");
>> - if (!dev->ppalist_pool) {
>> + dev->dma_page_pool = dev->ops->create_dma_pool(dev, "ppalist");
>
> rename to dmapool or something similar?
>
>> + if (!dev->dma_page_pool) {
>> pr_err("nvm: could not create ppa pool\n");
>
> Make sure to fix up the text here as well. Else it looks good.
>
>> ret = -ENOMEM;
>

Thanks. I'll fix it and resubmit tomorrow.

Javier.

2016-04-28 13:41:47

by Matias Bjørling

[permalink] [raw]
Subject: Re: [PATCH 1/3] lightnvm: do not free unused metadata on rrpc

On 04/27/2016 07:28 PM, Javier González wrote:
> rrpc does not save any metadata on a given request. Thus, do not attempt
> to free the metadata dma region.
>
> Signed-off-by: Javier González <[email protected]>
> ---
> drivers/lightnvm/rrpc.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c
> index c7fef71..ffcfee6 100644
> --- a/drivers/lightnvm/rrpc.c
> +++ b/drivers/lightnvm/rrpc.c
> @@ -711,8 +711,6 @@ static void rrpc_end_io(struct nvm_rq *rqd)
>
> if (npages > 1)
> nvm_dev_dma_free(rrpc->dev, rqd->ppa_list, rqd->dma_ppa_list);
> - if (rqd->metadata)
> - nvm_dev_dma_free(rrpc->dev, rqd->metadata, rqd->dma_metadata);
>
> mempool_free(rqd, rrpc->rq_pool);
> }
>

Thanks Javier. Applied for 4.7.

2016-04-28 13:47:48

by Matias Bjørling

[permalink] [raw]
Subject: Re: [PATCH 2/3] lightnvm: enable metadata to be sent to device

On 04/27/2016 07:28 PM, Javier González wrote:
> Enable metadata to be sent to the device through the metadata field on
> the physical rw nvme command. When a single ppa is sent to the device, a
> 64-bit integer can be sent as metadata; when a ppa list is sent, a
> 64-bit integer list mapping to the ppa list can be used to send
> metadata.
>
> Signed-off-by: Javier González <[email protected]>
> ---
> drivers/nvme/host/lightnvm.c | 1 +
> include/linux/lightnvm.h | 4 ++--
> 2 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
> index b1a0d8b..92da28d 100644
> --- a/drivers/nvme/host/lightnvm.c
> +++ b/drivers/nvme/host/lightnvm.c
> @@ -467,6 +467,7 @@ static inline void nvme_nvm_rqtocmd(struct request *rq, struct nvm_rq *rqd,
> c->ph_rw.opcode = rqd->opcode;
> c->ph_rw.nsid = cpu_to_le32(ns->ns_id);
> c->ph_rw.spba = cpu_to_le64(rqd->ppa_addr.ppa);
> + c->ph_rw.metadata = cpu_to_le64(rqd->meta_list);
> c->ph_rw.control = cpu_to_le16(rqd->flags);
> c->ph_rw.length = cpu_to_le16(rqd->nr_pages - 1);
>
> diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h
> index 1e3b53e..9768bae 100644
> --- a/include/linux/lightnvm.h
> +++ b/include/linux/lightnvm.h
> @@ -239,8 +239,8 @@ struct nvm_rq {
>
> struct ppa_addr *ppa_list;
>
> - void *metadata;
> - dma_addr_t dma_metadata;
> + void *meta_list;
> + dma_addr_t dma_meta_list;
>
> struct completion *wait;
> nvm_end_io_fn *end_io;
>

Thanks Javier. Applied for 4.7.