All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Popuri, Sriram" <Sriram.Popuri@netapp.com>
To: Christoph Hellwig <hch@lst.de>,
	"linux-nvme@lists.infradead.org" <linux-nvme@lists.infradead.org>,
	"Knight, Frederick" <Frederick.Knight@netapp.com>
Cc: Jens Axboe <axboe@kernel.dk>, Keith Busch <keith.busch@intel.com>,
	"linux-block@vger.kernel.org" <linux-block@vger.kernel.org>,
	Sagi Grimberg <sagi@grimberg.me>, Hannes Reinecke <hare@suse.de>
Subject: RE: [PATCH 13/14] nvme: use the changed namespaces list log to clear ns data changed AENs
Date: Sat, 26 May 2018 12:05:02 +0000	[thread overview]
Message-ID: <BN7PR06MB403359D8914D0A17425C037E92680@BN7PR06MB4033.namprd06.prod.outlook.com> (raw)
In-Reply-To: <20180526102735.31404-14-hch@lst.de>

Reading the spec it looks like ns log is alternate approach:

"Namespace Attribute Changed: The Identify Namespace data structure for one=
 or more namespaces, as well as the Namespace List returned when the Identi=
fy command is issued with the CNS field set to 02h, have changed. Host soft=
ware may use this event as an indication that it should read the Identify N=
amespace data structures for each namespace to determine what has changed.

Alternatively, host software may request the Changed Namespace List (Log Id=
entifier 04h) to determine which namespaces in this controller have changed=
 Identify Namespace information since the last time the log page was read."

My question is: Does the target needs to implement log page 04h as this is =
an optional log page and the text above suggests its used in alternate way?

If target is not required to implement, then I guess your change should sti=
ll work because if log page 04h fails, it fails back to rescan. Correct?
I think you can optimize this by checking the "Log Page Identifier" field i=
n your result and accordingly setting EVENT_NS_CHANGED. I assume target wou=
ld clear this if log page 04h is not supported.

"23:16      Log Page Identifier: Indicates the log page associated with the=
 asynchronous event. This log page needs to be read by the host to clear th=
e event"

Regards,
~Sriram

-----Original Message-----
From: Linux-nvme <linux-nvme-bounces@lists.infradead.org> On Behalf Of Chri=
stoph Hellwig
Sent: Saturday, May 26, 2018 3:58 PM
To: linux-nvme@lists.infradead.org
Cc: Jens Axboe <axboe@kernel.dk>; Keith Busch <keith.busch@intel.com>; linu=
x-block@vger.kernel.org; Sagi Grimberg <sagi@grimberg.me>; Hannes Reinecke =
<hare@suse.de>
Subject: [PATCH 13/14] nvme: use the changed namespaces list log to clear n=
s data changed AENs

Per section 5.2 we need to issue the corresponding log page to clear an AEN=
, so for a namespace data changed AEN we need to read the changed namespace=
 list log.  And once we read that log anyway we might as well use it to opt=
imize the rescan.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/nvme/host/core.c | 51 ++++++++++++++++++++++++++++++++++++----
 drivers/nvme/host/nvme.h |  2 ++
 2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 06cd=
04dcffbc..1ae77428a1a5 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3194,6 +3194,42 @@ static void nvme_scan_ns_sequential(struct nvme_ctrl=
 *ctrl, unsigned nn)
 	nvme_remove_invalid_namespaces(ctrl, nn);  }
=20
+static bool nvme_scan_changed_ns_log(struct nvme_ctrl *ctrl) {
+	size_t log_size =3D NVME_MAX_CHANGED_NAMESPACES * sizeof(__le32);
+	__le32 *log;
+	int error, i;
+	bool ret =3D false;
+
+	log =3D kzalloc(log_size, GFP_KERNEL);
+	if (!log)
+		return false;
+
+	error =3D nvme_get_log(ctrl, NVME_LOG_CHANGED_NS, log, log_size);
+	if (error) {
+		dev_warn(ctrl->device,
+			"reading changed ns log failed: %d\n", error);
+		goto out_free_log;
+	}
+
+	if (log[0] =3D=3D cpu_to_le32(0xffffffff))
+		goto out_free_log;
+
+	for (i =3D 0; i < NVME_MAX_CHANGED_NAMESPACES; i++) {
+		u32 nsid =3D le32_to_cpu(log[i]);
+
+		if (nsid =3D=3D 0)
+			break;
+		dev_info(ctrl->device, "rescanning namespace %d.\n", nsid);
+		nvme_validate_ns(ctrl, nsid);
+	}
+	ret =3D true;
+
+out_free_log:
+	kfree(log);
+	return ret;
+}
+
 static void nvme_scan_work(struct work_struct *work)  {
 	struct nvme_ctrl *ctrl =3D
@@ -3206,6 +3242,12 @@ static void nvme_scan_work(struct work_struct *work)
=20
 	WARN_ON_ONCE(!ctrl->tagset);
=20
+	if (test_and_clear_bit(EVENT_NS_CHANGED, &ctrl->events)) {
+		if (nvme_scan_changed_ns_log(ctrl))
+			goto out_sort_namespaces;
+		dev_info(ctrl->device, "rescanning namespaces.\n");
+	}
+
 	if (nvme_identify_ctrl(ctrl, &id))
 		return;
=20
@@ -3213,14 +3255,15 @@ static void nvme_scan_work(struct work_struct *work=
)
 	if (ctrl->vs >=3D NVME_VS(1, 1, 0) &&
 	    !(ctrl->quirks & NVME_QUIRK_IDENTIFY_CNS)) {
 		if (!nvme_scan_ns_list(ctrl, nn))
-			goto done;
+			goto out_free_id;
 	}
 	nvme_scan_ns_sequential(ctrl, nn);
- done:
+out_free_id:
+	kfree(id);
+out_sort_namespaces:
 	down_write(&ctrl->namespaces_rwsem);
 	list_sort(NULL, &ctrl->namespaces, ns_cmp);
 	up_write(&ctrl->namespaces_rwsem);
-	kfree(id);
 }
=20
 /*
@@ -3340,7 +3383,7 @@ static void nvme_handle_aen_notice(struct nvme_ctrl *=
ctrl, u32 result)  {
 	switch ((result & 0xff00) >> 8) {
 	case NVME_AER_NOTICE_NS_CHANGED:
-		dev_info(ctrl->device, "rescanning\n");
+		set_bit(EVENT_NS_CHANGED, &ctrl->events);
 		nvme_queue_scan(ctrl);
 		break;
 	case NVME_AER_NOTICE_FW_ACT_STARTING:
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 1168=
1278fdf6..07e8bfe705c6 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -189,6 +189,8 @@ struct nvme_ctrl {
 	struct delayed_work ka_work;
 	struct nvme_command ka_cmd;
 	struct work_struct fw_act_work;
+#define EVENT_NS_CHANGED		(1 << 0)
+	unsigned long events;
=20
 	/* Power saving configuration */
 	u64 ps_max_latency_us;
--
2.17.0


_______________________________________________
Linux-nvme mailing list
Linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

WARNING: multiple messages have this Message-ID (diff)
From: Sriram.Popuri@netapp.com (Popuri, Sriram)
Subject: [PATCH 13/14] nvme: use the changed namespaces list log to clear ns data changed AENs
Date: Sat, 26 May 2018 12:05:02 +0000	[thread overview]
Message-ID: <BN7PR06MB403359D8914D0A17425C037E92680@BN7PR06MB4033.namprd06.prod.outlook.com> (raw)
In-Reply-To: <20180526102735.31404-14-hch@lst.de>

Reading the spec it looks like ns log is alternate approach:

"Namespace Attribute Changed: The Identify Namespace data structure for one or more namespaces, as well as the Namespace List returned when the Identify command is issued with the CNS field set to 02h, have changed. Host software may use this event as an indication that it should read the Identify Namespace data structures for each namespace to determine what has changed.

Alternatively, host software may request the Changed Namespace List (Log Identifier 04h) to determine which namespaces in this controller have changed Identify Namespace information since the last time the log page was read."

My question is: Does the target needs to implement log page 04h as this is an optional log page and the text above suggests its used in alternate way?

If target is not required to implement, then I guess your change should still work because if log page 04h fails, it fails back to rescan. Correct?
I think you can optimize this by checking the "Log Page Identifier" field in your result and accordingly setting EVENT_NS_CHANGED. I assume target would clear this if log page 04h is not supported.

"23:16      Log Page Identifier: Indicates the log page associated with the asynchronous event. This log page needs to be read by the host to clear the event"

Regards,
~Sriram

-----Original Message-----
From: Linux-nvme <linux-nvme-bounces@lists.infradead.org> On Behalf Of Christoph Hellwig
Sent: Saturday, May 26, 2018 3:58 PM
To: linux-nvme at lists.infradead.org
Cc: Jens Axboe <axboe at kernel.dk>; Keith Busch <keith.busch at intel.com>; linux-block at vger.kernel.org; Sagi Grimberg <sagi at grimberg.me>; Hannes Reinecke <hare at suse.de>
Subject: [PATCH 13/14] nvme: use the changed namespaces list log to clear ns data changed AENs

Per section 5.2 we need to issue the corresponding log page to clear an AEN, so for a namespace data changed AEN we need to read the changed namespace list log.  And once we read that log anyway we might as well use it to optimize the rescan.

Signed-off-by: Christoph Hellwig <hch at lst.de>
---
 drivers/nvme/host/core.c | 51 ++++++++++++++++++++++++++++++++++++----
 drivers/nvme/host/nvme.h |  2 ++
 2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 06cd04dcffbc..1ae77428a1a5 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -3194,6 +3194,42 @@ static void nvme_scan_ns_sequential(struct nvme_ctrl *ctrl, unsigned nn)
 	nvme_remove_invalid_namespaces(ctrl, nn);  }
 
+static bool nvme_scan_changed_ns_log(struct nvme_ctrl *ctrl) {
+	size_t log_size = NVME_MAX_CHANGED_NAMESPACES * sizeof(__le32);
+	__le32 *log;
+	int error, i;
+	bool ret = false;
+
+	log = kzalloc(log_size, GFP_KERNEL);
+	if (!log)
+		return false;
+
+	error = nvme_get_log(ctrl, NVME_LOG_CHANGED_NS, log, log_size);
+	if (error) {
+		dev_warn(ctrl->device,
+			"reading changed ns log failed: %d\n", error);
+		goto out_free_log;
+	}
+
+	if (log[0] == cpu_to_le32(0xffffffff))
+		goto out_free_log;
+
+	for (i = 0; i < NVME_MAX_CHANGED_NAMESPACES; i++) {
+		u32 nsid = le32_to_cpu(log[i]);
+
+		if (nsid == 0)
+			break;
+		dev_info(ctrl->device, "rescanning namespace %d.\n", nsid);
+		nvme_validate_ns(ctrl, nsid);
+	}
+	ret = true;
+
+out_free_log:
+	kfree(log);
+	return ret;
+}
+
 static void nvme_scan_work(struct work_struct *work)  {
 	struct nvme_ctrl *ctrl =
@@ -3206,6 +3242,12 @@ static void nvme_scan_work(struct work_struct *work)
 
 	WARN_ON_ONCE(!ctrl->tagset);
 
+	if (test_and_clear_bit(EVENT_NS_CHANGED, &ctrl->events)) {
+		if (nvme_scan_changed_ns_log(ctrl))
+			goto out_sort_namespaces;
+		dev_info(ctrl->device, "rescanning namespaces.\n");
+	}
+
 	if (nvme_identify_ctrl(ctrl, &id))
 		return;
 
@@ -3213,14 +3255,15 @@ static void nvme_scan_work(struct work_struct *work)
 	if (ctrl->vs >= NVME_VS(1, 1, 0) &&
 	    !(ctrl->quirks & NVME_QUIRK_IDENTIFY_CNS)) {
 		if (!nvme_scan_ns_list(ctrl, nn))
-			goto done;
+			goto out_free_id;
 	}
 	nvme_scan_ns_sequential(ctrl, nn);
- done:
+out_free_id:
+	kfree(id);
+out_sort_namespaces:
 	down_write(&ctrl->namespaces_rwsem);
 	list_sort(NULL, &ctrl->namespaces, ns_cmp);
 	up_write(&ctrl->namespaces_rwsem);
-	kfree(id);
 }
 
 /*
@@ -3340,7 +3383,7 @@ static void nvme_handle_aen_notice(struct nvme_ctrl *ctrl, u32 result)  {
 	switch ((result & 0xff00) >> 8) {
 	case NVME_AER_NOTICE_NS_CHANGED:
-		dev_info(ctrl->device, "rescanning\n");
+		set_bit(EVENT_NS_CHANGED, &ctrl->events);
 		nvme_queue_scan(ctrl);
 		break;
 	case NVME_AER_NOTICE_FW_ACT_STARTING:
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 11681278fdf6..07e8bfe705c6 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -189,6 +189,8 @@ struct nvme_ctrl {
 	struct delayed_work ka_work;
 	struct nvme_command ka_cmd;
 	struct work_struct fw_act_work;
+#define EVENT_NS_CHANGED		(1 << 0)
+	unsigned long events;
 
 	/* Power saving configuration */
 	u64 ps_max_latency_us;
--
2.17.0


_______________________________________________
Linux-nvme mailing list
Linux-nvme at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme

  reply	other threads:[~2018-05-26 12:05 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 ` [PATCH 07/14] nvmet: split log page implementation Christoph Hellwig
2018-05-26 10:27   ` 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 [this message]
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=BN7PR06MB403359D8914D0A17425C037E92680@BN7PR06MB4033.namprd06.prod.outlook.com \
    --to=sriram.popuri@netapp.com \
    --cc=Frederick.Knight@netapp.com \
    --cc=axboe@kernel.dk \
    --cc=hare@suse.de \
    --cc=hch@lst.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.