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 07/14] nvmet: split log page implementation Date: Sat, 26 May 2018 12:27:28 +0200 [thread overview] Message-ID: <20180526102735.31404-8-hch@lst.de> (raw) In-Reply-To: <20180526102735.31404-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> --- 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 b2ba95b2eef7..e96bb02c4f2c 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); } @@ -566,9 +523,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 07/14] nvmet: split log page implementation Date: Sat, 26 May 2018 12:27:28 +0200 [thread overview] Message-ID: <20180526102735.31404-8-hch@lst.de> (raw) In-Reply-To: <20180526102735.31404-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> --- 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 b2ba95b2eef7..e96bb02c4f2c 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); } @@ -566,9 +523,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
next prev parent reply other threads:[~2018-05-26 10:27 UTC|newest] Thread overview: 91+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-26 10:27 nvme/nvmet AEN and log page fixups Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-26 10:27 ` [PATCH 01/14] block: unexport check_disk_size_change Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:33 ` Johannes Thumshirn 2018-05-28 6:33 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 02/14] block: don't print a message when the device went away Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:34 ` Johannes Thumshirn 2018-05-28 6:34 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 03/14] nvme.h: untangle AEN notice definitions Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:35 ` Johannes Thumshirn 2018-05-28 6:35 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 04/14] nvme.h: add the changed namespace list log Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:35 ` Johannes Thumshirn 2018-05-28 6:35 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 05/14] nvme.h: add AER configuration symbols Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:35 ` Johannes Thumshirn 2018-05-28 6:35 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 06/14] nvmet: add a new nvmet_zero_sgl helper Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:36 ` Johannes Thumshirn 2018-05-28 6:36 ` Johannes Thumshirn 2018-05-29 8:13 ` Christoph Hellwig 2018-05-29 8:13 ` Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig [this message] 2018-05-26 10:27 ` [PATCH 07/14] nvmet: split log page implementation Christoph Hellwig 2018-05-28 6:38 ` Johannes Thumshirn 2018-05-28 6:38 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 08/14] nvmet: implement the changed namespaces log Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:53 ` Johannes Thumshirn 2018-05-28 6:53 ` Johannes Thumshirn 2018-05-29 8:17 ` Christoph Hellwig 2018-05-29 8:17 ` Christoph Hellwig 2018-05-29 8:16 ` Johannes Thumshirn 2018-05-29 8:16 ` Johannes Thumshirn 2018-05-29 8:24 ` Christoph Hellwig 2018-05-29 8:24 ` Christoph Hellwig 2018-05-29 16:59 ` Verkamp, Daniel 2018-05-29 16:59 ` Verkamp, Daniel 2018-05-29 17:24 ` Christoph Hellwig 2018-05-29 17:24 ` Christoph Hellwig 2018-05-29 20:44 ` Daniel Verkamp 2018-05-29 20:44 ` Daniel Verkamp 2018-05-26 10:27 ` [PATCH 09/14] nvmet: Add AEN configuration support Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:54 ` Johannes Thumshirn 2018-05-28 6:54 ` Johannes Thumshirn 2018-05-29 17:15 ` Verkamp, Daniel 2018-05-29 17:15 ` Verkamp, Daniel 2018-05-29 17:29 ` Christoph Hellwig 2018-05-29 17:29 ` Christoph Hellwig 2018-05-29 17:35 ` Verkamp, Daniel 2018-05-29 17:35 ` Verkamp, Daniel 2018-05-29 17:45 ` Christoph Hellwig 2018-05-29 17:45 ` Christoph Hellwig 2018-05-26 10:27 ` [PATCH 10/14] nvmet: mask pending AERs Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:56 ` Johannes Thumshirn 2018-05-28 6:56 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 11/14] nvme: submit AEN event configuration on startup Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:56 ` Johannes Thumshirn 2018-05-28 6:56 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 12/14] nvme: mark nvme_queue_scan static Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 6:57 ` Johannes Thumshirn 2018-05-28 6:57 ` Johannes Thumshirn 2018-05-26 10:27 ` [PATCH 13/14] nvme: use the changed namespaces list log to clear ns data changed AENs Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-26 12:05 ` Popuri, Sriram 2018-05-26 12:05 ` Popuri, Sriram 2018-05-26 12:21 ` Christoph Hellwig 2018-05-26 12:21 ` Christoph Hellwig 2018-05-26 13:02 ` Knight, Frederick 2018-05-28 6:59 ` Johannes Thumshirn 2018-05-28 6:59 ` Johannes Thumshirn 2018-06-04 19:59 ` Keith Busch 2018-06-04 19:59 ` Keith Busch 2018-06-05 4:47 ` Christoph Hellwig 2018-06-05 4:47 ` Christoph Hellwig 2018-06-05 14:37 ` Keith Busch 2018-06-05 14:37 ` Keith Busch 2018-05-26 10:27 ` [PATCH 14/14] nvme: limit warnings from nvme_identify_ns Christoph Hellwig 2018-05-26 10:27 ` Christoph Hellwig 2018-05-28 7:00 ` Johannes Thumshirn 2018-05-28 7:00 ` Johannes Thumshirn
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=20180526102735.31404-8-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: linkBe 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.