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, 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

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