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, Hannes Reinecke <hare@suse.com> Subject: [PATCH 07/12] nvmet: Add AEN configuration support Date: Wed, 30 May 2018 18:45:55 +0200 [thread overview] Message-ID: <20180530164600.26856-8-hch@lst.de> (raw) In-Reply-To: <20180530164600.26856-1-hch@lst.de> AEN configuration via the 'Get Features' and 'Set Features' admin command is mandatory, so we should be implemeting handling for it. Signed-off-by: Hannes Reinecke <hare@suse.com> [hch: use WRITE_ONCE, check for invalid values] Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/nvme/target/admin-cmd.c | 15 +++++++++++++-- drivers/nvme/target/core.c | 3 +++ drivers/nvme/target/nvmet.h | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c index 453d76db1647..4e269a8c8dbe 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -189,7 +189,7 @@ static void nvmet_execute_identify_ctrl(struct nvmet_req *req) id->ver = cpu_to_le32(ctrl->subsys->ver); /* XXX: figure out what to do about RTD3R/RTD3 */ - id->oaes = cpu_to_le32(1 << 8); + id->oaes = cpu_to_le32(NVMET_AEN_CFG_OPTIONAL); id->ctratt = cpu_to_le32(1 << 0); id->oacs = 0; @@ -441,6 +441,16 @@ static void nvmet_execute_set_features(struct nvmet_req *req) req->sq->ctrl->kato = DIV_ROUND_UP(val32, 1000); nvmet_set_result(req, req->sq->ctrl->kato); break; + case NVME_FEAT_ASYNC_EVENT: + val32 = le32_to_cpu(req->cmd->common.cdw10[1]); + if (val32 & ~NVMET_AEN_CFG_ALL) { + status = NVME_SC_INVALID_FIELD | NVME_SC_DNR; + break; + } + + WRITE_ONCE(req->sq->ctrl->aen_enabled, val32); + nvmet_set_result(req, val32); + break; case NVME_FEAT_HOST_ID: status = NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR; break; @@ -479,9 +489,10 @@ static void nvmet_execute_get_features(struct nvmet_req *req) break; case NVME_FEAT_WRITE_ATOMIC: break; +#endif case NVME_FEAT_ASYNC_EVENT: + nvmet_set_result(req, READ_ONCE(req->sq->ctrl->aen_enabled)); break; -#endif case NVME_FEAT_VOLATILE_WC: nvmet_set_result(req, 1); break; diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 99fcff757608..b2da65aec8b7 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -168,6 +168,8 @@ static void nvmet_ns_changed(struct nvmet_subsys *subsys, u32 nsid) list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry) { nvmet_add_to_changed_ns_log(ctrl, cpu_to_le32(nsid)); + if (!(READ_ONCE(ctrl->aen_enabled) & NVME_AEN_CFG_NS_ATTR)) + continue; nvmet_add_async_event(ctrl, NVME_AER_TYPE_NOTICE, NVME_AER_NOTICE_NS_CHANGED, NVME_LOG_CHANGED_NS); @@ -855,6 +857,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, kref_init(&ctrl->ref); ctrl->subsys = subsys; + WRITE_ONCE(ctrl->aen_enabled, NVMET_AEN_CFG_OPTIONAL); ctrl->changed_ns_list = kmalloc_array(NVME_MAX_CHANGED_NAMESPACES, sizeof(__le32), GFP_KERNEL); diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h index 8cdc1e550396..f4d16d9b3582 100644 --- a/drivers/nvme/target/nvmet.h +++ b/drivers/nvme/target/nvmet.h @@ -30,6 +30,21 @@ #define NVMET_ASYNC_EVENTS 4 #define NVMET_ERROR_LOG_SLOTS 128 + +/* + * Supported optional AENs: + */ +#define NVMET_AEN_CFG_OPTIONAL \ + NVME_AEN_CFG_NS_ATTR + +/* + * Plus mandatory SMART AENs (we'll never send them, but allow enabling them): + */ +#define NVMET_AEN_CFG_ALL \ + (NVME_SMART_CRIT_SPARE | NVME_SMART_CRIT_TEMPERATURE | \ + NVME_SMART_CRIT_RELIABILITY | NVME_SMART_CRIT_MEDIA | \ + NVME_SMART_CRIT_VOLATILE_MEMORY | NVMET_AEN_CFG_OPTIONAL) + /* Helper Macros when NVMe error is NVME_SC_CONNECT_INVALID_PARAM * The 16 bit shift is to set IATTR bit to 1, which means offending * offset starts in the data section of connect() @@ -123,6 +138,7 @@ struct nvmet_ctrl { u16 cntlid; u32 kato; + u32 aen_enabled; struct nvmet_req *async_event_cmds[NVMET_ASYNC_EVENTS]; unsigned int nr_async_event_cmds; struct list_head async_events; -- 2.17.0
WARNING: multiple messages have this Message-ID (diff)
From: hch@lst.de (Christoph Hellwig) Subject: [PATCH 07/12] nvmet: Add AEN configuration support Date: Wed, 30 May 2018 18:45:55 +0200 [thread overview] Message-ID: <20180530164600.26856-8-hch@lst.de> (raw) In-Reply-To: <20180530164600.26856-1-hch@lst.de> AEN configuration via the 'Get Features' and 'Set Features' admin command is mandatory, so we should be implemeting handling for it. Signed-off-by: Hannes Reinecke <hare at suse.com> [hch: use WRITE_ONCE, check for invalid values] Signed-off-by: Christoph Hellwig <hch at lst.de> --- drivers/nvme/target/admin-cmd.c | 15 +++++++++++++-- drivers/nvme/target/core.c | 3 +++ drivers/nvme/target/nvmet.h | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/nvme/target/admin-cmd.c b/drivers/nvme/target/admin-cmd.c index 453d76db1647..4e269a8c8dbe 100644 --- a/drivers/nvme/target/admin-cmd.c +++ b/drivers/nvme/target/admin-cmd.c @@ -189,7 +189,7 @@ static void nvmet_execute_identify_ctrl(struct nvmet_req *req) id->ver = cpu_to_le32(ctrl->subsys->ver); /* XXX: figure out what to do about RTD3R/RTD3 */ - id->oaes = cpu_to_le32(1 << 8); + id->oaes = cpu_to_le32(NVMET_AEN_CFG_OPTIONAL); id->ctratt = cpu_to_le32(1 << 0); id->oacs = 0; @@ -441,6 +441,16 @@ static void nvmet_execute_set_features(struct nvmet_req *req) req->sq->ctrl->kato = DIV_ROUND_UP(val32, 1000); nvmet_set_result(req, req->sq->ctrl->kato); break; + case NVME_FEAT_ASYNC_EVENT: + val32 = le32_to_cpu(req->cmd->common.cdw10[1]); + if (val32 & ~NVMET_AEN_CFG_ALL) { + status = NVME_SC_INVALID_FIELD | NVME_SC_DNR; + break; + } + + WRITE_ONCE(req->sq->ctrl->aen_enabled, val32); + nvmet_set_result(req, val32); + break; case NVME_FEAT_HOST_ID: status = NVME_SC_CMD_SEQ_ERROR | NVME_SC_DNR; break; @@ -479,9 +489,10 @@ static void nvmet_execute_get_features(struct nvmet_req *req) break; case NVME_FEAT_WRITE_ATOMIC: break; +#endif case NVME_FEAT_ASYNC_EVENT: + nvmet_set_result(req, READ_ONCE(req->sq->ctrl->aen_enabled)); break; -#endif case NVME_FEAT_VOLATILE_WC: nvmet_set_result(req, 1); break; diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 99fcff757608..b2da65aec8b7 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -168,6 +168,8 @@ static void nvmet_ns_changed(struct nvmet_subsys *subsys, u32 nsid) list_for_each_entry(ctrl, &subsys->ctrls, subsys_entry) { nvmet_add_to_changed_ns_log(ctrl, cpu_to_le32(nsid)); + if (!(READ_ONCE(ctrl->aen_enabled) & NVME_AEN_CFG_NS_ATTR)) + continue; nvmet_add_async_event(ctrl, NVME_AER_TYPE_NOTICE, NVME_AER_NOTICE_NS_CHANGED, NVME_LOG_CHANGED_NS); @@ -855,6 +857,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn, kref_init(&ctrl->ref); ctrl->subsys = subsys; + WRITE_ONCE(ctrl->aen_enabled, NVMET_AEN_CFG_OPTIONAL); ctrl->changed_ns_list = kmalloc_array(NVME_MAX_CHANGED_NAMESPACES, sizeof(__le32), GFP_KERNEL); diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h index 8cdc1e550396..f4d16d9b3582 100644 --- a/drivers/nvme/target/nvmet.h +++ b/drivers/nvme/target/nvmet.h @@ -30,6 +30,21 @@ #define NVMET_ASYNC_EVENTS 4 #define NVMET_ERROR_LOG_SLOTS 128 + +/* + * Supported optional AENs: + */ +#define NVMET_AEN_CFG_OPTIONAL \ + NVME_AEN_CFG_NS_ATTR + +/* + * Plus mandatory SMART AENs (we'll never send them, but allow enabling them): + */ +#define NVMET_AEN_CFG_ALL \ + (NVME_SMART_CRIT_SPARE | NVME_SMART_CRIT_TEMPERATURE | \ + NVME_SMART_CRIT_RELIABILITY | NVME_SMART_CRIT_MEDIA | \ + NVME_SMART_CRIT_VOLATILE_MEMORY | NVMET_AEN_CFG_OPTIONAL) + /* Helper Macros when NVMe error is NVME_SC_CONNECT_INVALID_PARAM * The 16 bit shift is to set IATTR bit to 1, which means offending * offset starts in the data section of connect() @@ -123,6 +138,7 @@ struct nvmet_ctrl { u16 cntlid; u32 kato; + u32 aen_enabled; struct nvmet_req *async_event_cmds[NVMET_ASYNC_EVENTS]; unsigned int nr_async_event_cmds; struct list_head async_events; -- 2.17.0
next prev 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 ` [PATCH 05/12] nvmet: split log page implementation Christoph Hellwig 2018-05-30 16:45 ` 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 ` Christoph Hellwig [this message] 2018-05-30 16:45 ` [PATCH 07/12] nvmet: Add AEN configuration support 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-8-hch@lst.de \ --to=hch@lst.de \ --cc=axboe@kernel.dk \ --cc=hare@suse.com \ --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.