All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: linux-nvme@lists.infradead.org
Cc: Jens Axboe <axboe@kernel.dk>, Keith Busch <keith.busch@intel.com>,
	Sagi Grimberg <sagi@grimberg.me>, Hannes Reinecke <hare@suse.de>,
	linux-block@vger.kernel.org
Subject: [PATCH 05/12] nvmet: split log page implementation
Date: Wed, 30 May 2018 18:45:53 +0200	[thread overview]
Message-ID: <20180530164600.26856-6-hch@lst.de> (raw)
In-Reply-To: <20180530164600.26856-1-hch@lst.de>

Remove the common code to allocate a buffer and copy it into the SGL.
Instead the two no-op implementations just zero the SGL directly, and
the smart log allocates a buffer on its own.  This prepares for the
more elaborate ANA log page.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
---
 drivers/nvme/target/admin-cmd.c | 99 ++++++++++++---------------------
 1 file changed, 36 insertions(+), 63 deletions(-)

diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
index 7f906e4ccc96..678a393f01de 100644
--- a/drivers/nvme/target/admin-cmd.c
+++ b/drivers/nvme/target/admin-cmd.c
@@ -32,6 +32,11 @@ u32 nvmet_get_log_page_len(struct nvme_command *cmd)
 	return len;
 }
 
+static void nvmet_execute_get_log_page_noop(struct nvmet_req *req)
+{
+	nvmet_req_complete(req, nvmet_zero_sgl(req, 0, req->data_len));
+}
+
 static u16 nvmet_get_smart_log_nsid(struct nvmet_req *req,
 		struct nvme_smart_log *slog)
 {
@@ -97,74 +102,26 @@ static u16 nvmet_get_smart_log_all(struct nvmet_req *req,
 	return NVME_SC_SUCCESS;
 }
 
-static u16 nvmet_get_smart_log(struct nvmet_req *req,
-		struct nvme_smart_log *slog)
-{
-	u16 status;
-
-	WARN_ON(req == NULL || slog == NULL);
-	if (req->cmd->get_log_page.nsid == cpu_to_le32(NVME_NSID_ALL))
-		status = nvmet_get_smart_log_all(req, slog);
-	else
-		status = nvmet_get_smart_log_nsid(req, slog);
-	return status;
-}
-
-static void nvmet_execute_get_log_page(struct nvmet_req *req)
+static void nvmet_execute_get_log_page_smart(struct nvmet_req *req)
 {
-	struct nvme_smart_log *smart_log;
-	size_t data_len = nvmet_get_log_page_len(req->cmd);
-	void *buf;
-	u16 status = 0;
+	struct nvme_smart_log *log;
+	u16 status = NVME_SC_INTERNAL;
 
-	buf = kzalloc(data_len, GFP_KERNEL);
-	if (!buf) {
-		status = NVME_SC_INTERNAL;
+	if (req->data_len != sizeof(*log))
 		goto out;
-	}
 
-	switch (req->cmd->get_log_page.lid) {
-	case NVME_LOG_ERROR:
-		/*
-		 * We currently never set the More bit in the status field,
-		 * so all error log entries are invalid and can be zeroed out.
-		 * This is called a minum viable implementation (TM) of this
-		 * mandatory log page.
-		 */
-		break;
-	case NVME_LOG_SMART:
-		/*
-		 * XXX: fill out actual smart log
-		 *
-		 * We might have a hard time coming up with useful values for
-		 * many of the fields, and even when we have useful data
-		 * available (e.g. units or commands read/written) those aren't
-		 * persistent over power loss.
-		 */
-		if (data_len != sizeof(*smart_log)) {
-			status = NVME_SC_INTERNAL;
-			goto err;
-		}
-		smart_log = buf;
-		status = nvmet_get_smart_log(req, smart_log);
-		if (status)
-			goto err;
-		break;
-	case NVME_LOG_FW_SLOT:
-		/*
-		 * We only support a single firmware slot which always is
-		 * active, so we can zero out the whole firmware slot log and
-		 * still claim to fully implement this mandatory log page.
-		 */
-		break;
-	default:
-		BUG();
-	}
+	log = kzalloc(sizeof(*log), GFP_KERNEL);
+	if (!log)
+		goto out;
 
-	status = nvmet_copy_to_sgl(req, 0, buf, data_len);
+	if (req->cmd->get_log_page.nsid == cpu_to_le32(NVME_NSID_ALL))
+		status = nvmet_get_smart_log_all(req, log);
+	else
+		status = nvmet_get_smart_log_nsid(req, log);
+	if (status)
+		goto out;
 
-err:
-	kfree(buf);
+	status = nvmet_copy_to_sgl(req, 0, log, sizeof(*log));
 out:
 	nvmet_req_complete(req, status);
 }
@@ -572,9 +529,25 @@ u16 nvmet_parse_admin_cmd(struct nvmet_req *req)
 
 		switch (cmd->get_log_page.lid) {
 		case NVME_LOG_ERROR:
+			/*
+			 * We currently never set the More bit in the status
+			 * field, so all error log entries are invalid and can
+			 * be zeroed out.  This is called a minum viable
+			 * implementation (TM) of this mandatory log page.
+			 */
+			req->execute = nvmet_execute_get_log_page_noop;
+			return 0;
 		case NVME_LOG_SMART:
+			req->execute = nvmet_execute_get_log_page_smart;
+			return 0;
 		case NVME_LOG_FW_SLOT:
-			req->execute = nvmet_execute_get_log_page;
+			/*
+			 * We only support a single firmware slot which always
+			 * is active, so we can zero out the whole firmware slot
+			 * log and still claim to fully implement this mandatory
+			 * log page.
+			 */
+			req->execute = nvmet_execute_get_log_page_noop;
 			return 0;
 		}
 		break;
-- 
2.17.0

WARNING: multiple messages have this Message-ID (diff)
From: hch@lst.de (Christoph Hellwig)
Subject: [PATCH 05/12] nvmet: split log page implementation
Date: Wed, 30 May 2018 18:45:53 +0200	[thread overview]
Message-ID: <20180530164600.26856-6-hch@lst.de> (raw)
In-Reply-To: <20180530164600.26856-1-hch@lst.de>

Remove the common code to allocate a buffer and copy it into the SGL.
Instead the two no-op implementations just zero the SGL directly, and
the smart log allocates a buffer on its own.  This prepares for the
more elaborate ANA log page.

Signed-off-by: Christoph Hellwig <hch at lst.de>
Reviewed-by: Johannes Thumshirn <jthumshirn at suse.de>
---
 drivers/nvme/target/admin-cmd.c | 99 ++++++++++++---------------------
 1 file changed, 36 insertions(+), 63 deletions(-)

diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c
index 7f906e4ccc96..678a393f01de 100644
--- a/drivers/nvme/target/admin-cmd.c
+++ b/drivers/nvme/target/admin-cmd.c
@@ -32,6 +32,11 @@ u32 nvmet_get_log_page_len(struct nvme_command *cmd)
 	return len;
 }
 
+static void nvmet_execute_get_log_page_noop(struct nvmet_req *req)
+{
+	nvmet_req_complete(req, nvmet_zero_sgl(req, 0, req->data_len));
+}
+
 static u16 nvmet_get_smart_log_nsid(struct nvmet_req *req,
 		struct nvme_smart_log *slog)
 {
@@ -97,74 +102,26 @@ static u16 nvmet_get_smart_log_all(struct nvmet_req *req,
 	return NVME_SC_SUCCESS;
 }
 
-static u16 nvmet_get_smart_log(struct nvmet_req *req,
-		struct nvme_smart_log *slog)
-{
-	u16 status;
-
-	WARN_ON(req == NULL || slog == NULL);
-	if (req->cmd->get_log_page.nsid == cpu_to_le32(NVME_NSID_ALL))
-		status = nvmet_get_smart_log_all(req, slog);
-	else
-		status = nvmet_get_smart_log_nsid(req, slog);
-	return status;
-}
-
-static void nvmet_execute_get_log_page(struct nvmet_req *req)
+static void nvmet_execute_get_log_page_smart(struct nvmet_req *req)
 {
-	struct nvme_smart_log *smart_log;
-	size_t data_len = nvmet_get_log_page_len(req->cmd);
-	void *buf;
-	u16 status = 0;
+	struct nvme_smart_log *log;
+	u16 status = NVME_SC_INTERNAL;
 
-	buf = kzalloc(data_len, GFP_KERNEL);
-	if (!buf) {
-		status = NVME_SC_INTERNAL;
+	if (req->data_len != sizeof(*log))
 		goto out;
-	}
 
-	switch (req->cmd->get_log_page.lid) {
-	case NVME_LOG_ERROR:
-		/*
-		 * We currently never set the More bit in the status field,
-		 * so all error log entries are invalid and can be zeroed out.
-		 * This is called a minum viable implementation (TM) of this
-		 * mandatory log page.
-		 */
-		break;
-	case NVME_LOG_SMART:
-		/*
-		 * XXX: fill out actual smart log
-		 *
-		 * We might have a hard time coming up with useful values for
-		 * many of the fields, and even when we have useful data
-		 * available (e.g. units or commands read/written) those aren't
-		 * persistent over power loss.
-		 */
-		if (data_len != sizeof(*smart_log)) {
-			status = NVME_SC_INTERNAL;
-			goto err;
-		}
-		smart_log = buf;
-		status = nvmet_get_smart_log(req, smart_log);
-		if (status)
-			goto err;
-		break;
-	case NVME_LOG_FW_SLOT:
-		/*
-		 * We only support a single firmware slot which always is
-		 * active, so we can zero out the whole firmware slot log and
-		 * still claim to fully implement this mandatory log page.
-		 */
-		break;
-	default:
-		BUG();
-	}
+	log = kzalloc(sizeof(*log), GFP_KERNEL);
+	if (!log)
+		goto out;
 
-	status = nvmet_copy_to_sgl(req, 0, buf, data_len);
+	if (req->cmd->get_log_page.nsid == cpu_to_le32(NVME_NSID_ALL))
+		status = nvmet_get_smart_log_all(req, log);
+	else
+		status = nvmet_get_smart_log_nsid(req, log);
+	if (status)
+		goto out;
 
-err:
-	kfree(buf);
+	status = nvmet_copy_to_sgl(req, 0, log, sizeof(*log));
 out:
 	nvmet_req_complete(req, status);
 }
@@ -572,9 +529,25 @@ u16 nvmet_parse_admin_cmd(struct nvmet_req *req)
 
 		switch (cmd->get_log_page.lid) {
 		case NVME_LOG_ERROR:
+			/*
+			 * We currently never set the More bit in the status
+			 * field, so all error log entries are invalid and can
+			 * be zeroed out.  This is called a minum viable
+			 * implementation (TM) of this mandatory log page.
+			 */
+			req->execute = nvmet_execute_get_log_page_noop;
+			return 0;
 		case NVME_LOG_SMART:
+			req->execute = nvmet_execute_get_log_page_smart;
+			return 0;
 		case NVME_LOG_FW_SLOT:
-			req->execute = nvmet_execute_get_log_page;
+			/*
+			 * We only support a single firmware slot which always
+			 * is active, so we can zero out the whole firmware slot
+			 * log and still claim to fully implement this mandatory
+			 * log page.
+			 */
+			req->execute = nvmet_execute_get_log_page_noop;
 			return 0;
 		}
 		break;
-- 
2.17.0

  parent reply	other threads:[~2018-05-30 16:45 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-30 16:45 nvme/nvmet AEN and log page fixups v2 Christoph Hellwig
2018-05-30 16:45 ` Christoph Hellwig
2018-05-30 16:45 ` [PATCH 01/12] nvme.h: untangle AEN notice definitions Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:21   ` Sagi Grimberg
2018-05-30 21:21     ` Sagi Grimberg
2018-06-04  6:13   ` Hannes Reinecke
2018-06-04  6:13     ` Hannes Reinecke
2018-06-04  6:13   ` Hannes Reinecke
2018-06-04  6:13     ` Hannes Reinecke
2018-05-30 16:45 ` [PATCH 02/12] nvme.h: add the changed namespace list log Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:22   ` Sagi Grimberg
2018-05-30 21:22     ` Sagi Grimberg
2018-06-04  6:13   ` Hannes Reinecke
2018-06-04  6:13     ` Hannes Reinecke
2018-05-30 16:45 ` [PATCH 03/12] nvme.h: add AER configuration symbols Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:23   ` Sagi Grimberg
2018-05-30 21:23     ` Sagi Grimberg
2018-05-30 16:45 ` [PATCH 04/12] nvmet: add a new nvmet_zero_sgl helper Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:24   ` Sagi Grimberg
2018-05-30 21:24     ` Sagi Grimberg
2018-06-04  6:14   ` Hannes Reinecke
2018-06-04  6:14     ` Hannes Reinecke
2018-05-30 16:45 ` Christoph Hellwig [this message]
2018-05-30 16:45   ` [PATCH 05/12] nvmet: split log page implementation Christoph Hellwig
2018-05-30 21:25   ` Sagi Grimberg
2018-05-30 21:25     ` Sagi Grimberg
2018-06-04  6:14   ` Hannes Reinecke
2018-06-04  6:14     ` Hannes Reinecke
2018-05-30 16:45 ` [PATCH 06/12] nvmet: implement the changed namespaces log Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 17:33   ` Daniel Verkamp
2018-05-30 17:33     ` Daniel Verkamp
2018-05-31 16:25     ` Christoph Hellwig
2018-05-31 16:25       ` Christoph Hellwig
2018-05-31 16:36       ` Daniel Verkamp
2018-05-31 16:36         ` Daniel Verkamp
2018-05-30 21:28   ` Sagi Grimberg
2018-05-30 21:28     ` Sagi Grimberg
2018-06-04  6:15   ` Hannes Reinecke
2018-06-04  6:15     ` Hannes Reinecke
2018-05-30 16:45 ` [PATCH 07/12] nvmet: Add AEN configuration support Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:30   ` Sagi Grimberg
2018-05-30 21:30     ` Sagi Grimberg
2018-05-30 16:45 ` [PATCH 08/12] nvmet: mask pending AERs Christoph Hellwig
2018-05-30 21:31   ` Sagi Grimberg
2018-06-04  6:15   ` Hannes Reinecke
2018-06-12 15:41   ` Israel Rukshin
2018-06-13  7:42     ` Christoph Hellwig
2018-06-13  8:23       ` Max Gurtovoy
2018-06-13 11:26         ` Christoph Hellwig
2018-06-19 14:03       ` Sagi Grimberg
2018-05-30 16:45 ` [PATCH 09/12] nvme: submit AEN event configuration on startup Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:31   ` Sagi Grimberg
2018-05-30 21:31     ` Sagi Grimberg
2018-05-30 16:45 ` [PATCH 10/12] nvme: mark nvme_queue_scan static Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:31   ` Sagi Grimberg
2018-05-30 21:31     ` Sagi Grimberg
2018-06-04  6:16   ` Hannes Reinecke
2018-06-04  6:16     ` Hannes Reinecke
2018-05-30 16:45 ` [PATCH 11/12] nvme: use the changed namespaces list log to clear ns data changed AENs Christoph Hellwig
2018-05-30 16:45   ` Christoph Hellwig
2018-05-30 21:34   ` Sagi Grimberg
2018-05-30 21:34     ` Sagi Grimberg
2018-06-04  6:16   ` Hannes Reinecke
2018-06-04  6:16     ` Hannes Reinecke
2018-05-30 16:46 ` [PATCH 12/12] nvme: limit warnings from nvme_identify_ns Christoph Hellwig
2018-05-30 16:46   ` Christoph Hellwig
2018-05-30 21:35   ` Sagi Grimberg
2018-05-30 21:35     ` Sagi Grimberg
2018-06-04  6:17   ` Hannes Reinecke
2018-06-04  6:17     ` Hannes Reinecke

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=20180530164600.26856-6-hch@lst.de \
    --to=hch@lst.de \
    --cc=axboe@kernel.dk \
    --cc=hare@suse.de \
    --cc=keith.busch@intel.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-nvme@lists.infradead.org \
    --cc=sagi@grimberg.me \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.