nvdimm.lists.linux.dev archive mirror
 help / color / mirror / Atom feed
From: Alexander Duyck <alexander.h.duyck@linux.intel.com>
To: dan.j.williams@intel.com, linux-nvdimm@lists.01.org
Cc: alexander.h.duyck@linux.intel.com, zwisler@kernel.org
Subject: [nvdimm PATCH 1/6] libnvdimm, dimm: Maximize label transfer size
Date: Wed, 10 Oct 2018 16:38:24 -0700	[thread overview]
Message-ID: <20181010233621.12228.61818.stgit@localhost.localdomain> (raw)
In-Reply-To: <20181010233428.12228.26106.stgit@localhost.localdomain>

From: Dan Williams <dan.j.williams@intel.com>

Use kvzalloc() to bypass the arbitrary PAGE_SIZE limit of label transfer
operations. Given the expense of calling into firmware, maximize the
amount of label data we transfer per call to be up to the total label
space if allowed by the firmware.

Instead of limiting based on PAGE_SIZE we can instead simply limit the
maximum size based on either the config_size int he case of the get
operation, or the length of the write based on the set operation.

On a system with 24 NVDIMM modules each with a config_size of 128K and a
maximum transfer size of 64K - 4, this patch reduces the init time for the
label data from around 24 seconds down to between 4-5 seconds.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com>

I think I only did a few minor tweaks on this so I thought I would leave
Dan as the author and just add my Signed-off-by.

 drivers/nvdimm/dimm_devs.c |   13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/nvdimm/dimm_devs.c b/drivers/nvdimm/dimm_devs.c
index 863cabc35215..75ac78017b15 100644
--- a/drivers/nvdimm/dimm_devs.c
+++ b/drivers/nvdimm/dimm_devs.c
@@ -111,8 +111,8 @@ int nvdimm_init_config_data(struct nvdimm_drvdata *ndd)
 	if (!ndd->data)
 		return -ENOMEM;
-	max_cmd_size = min_t(u32, PAGE_SIZE, ndd->nsarea.max_xfer);
-	cmd = kzalloc(max_cmd_size + sizeof(*cmd), GFP_KERNEL);
+	max_cmd_size = min_t(u32, ndd->nsarea.config_size, ndd->nsarea.max_xfer);
+	cmd = kvzalloc(max_cmd_size + sizeof(*cmd), GFP_KERNEL);
 	if (!cmd)
 		return -ENOMEM;
@@ -134,7 +134,7 @@ int nvdimm_init_config_data(struct nvdimm_drvdata *ndd)
 		memcpy(ndd->data + offset, cmd->out_buf, cmd->in_length);
 	dev_dbg(ndd->dev, "len: %zu rc: %d\n", offset, rc);
-	kfree(cmd);
+	kvfree(cmd);
 	return rc;
@@ -157,9 +157,8 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset,
 	if (offset + len > ndd->nsarea.config_size)
 		return -ENXIO;
-	max_cmd_size = min_t(u32, PAGE_SIZE, len);
-	max_cmd_size = min_t(u32, max_cmd_size, ndd->nsarea.max_xfer);
-	cmd = kzalloc(max_cmd_size + sizeof(*cmd) + sizeof(u32), GFP_KERNEL);
+	max_cmd_size = min_t(u32, len, ndd->nsarea.max_xfer);
+	cmd = kvzalloc(max_cmd_size + sizeof(*cmd) + sizeof(u32), GFP_KERNEL);
 	if (!cmd)
 		return -ENOMEM;
@@ -183,7 +182,7 @@ int nvdimm_set_config_data(struct nvdimm_drvdata *ndd, size_t offset,
-	kfree(cmd);
+	kvfree(cmd);
 	return rc;

Linux-nvdimm mailing list

  reply	other threads:[~2018-10-10 23:38 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-10 23:36 [nvdimm PATCH 0/6] Label initialization time optimizations Alexander Duyck
2018-10-10 23:38 ` Alexander Duyck [this message]
2018-10-10 23:38 ` [nvdimm PATCH 2/6] nvdimm: Sanity check labeloff Alexander Duyck
2018-10-10 23:38 ` [nvdimm PATCH 3/6] nvdimm: Clarify comment in sizeof_namespace_index Alexander Duyck
2018-10-10 23:39 ` [nvdimm PATCH 4/6] nvdimm: Remove empty if statement Alexander Duyck
2018-10-10 23:39 ` [nvdimm PATCH 5/6] nvdimm: Split label init out from the logic for getting config data Alexander Duyck
2018-10-10 23:39 ` [nvdimm PATCH 6/6] nvdimm: Use namespace index data to reduce number of label reads needed Alexander Duyck
2018-10-12  1:35   ` Dan Williams
2018-10-11  4:48 ` [nvdimm PATCH 0/6] Label initialization time optimizations Dan Williams
2018-10-12 15:36 ` Kani, Toshi

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:

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181010233621.12228.61818.stgit@localhost.localdomain \
    --to=alexander.h.duyck@linux.intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=linux-nvdimm@lists.01.org \
    --cc=zwisler@kernel.org \
    --subject='Re: [nvdimm PATCH 1/6] libnvdimm, dimm: Maximize label transfer size' \


* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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).