* [PATCHv3 0/8] nvmet: debugfs support
@ 2024-03-22 7:03 Hannes Reinecke
2024-03-22 7:03 ` [PATCH 1/8] nvmet: add " Hannes Reinecke
` (7 more replies)
0 siblings, 8 replies; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
Hi all,
taking up the original patchset for nvmet debugfs
I've improved upon that submission by modifying
the layout:
/dev/kernel/debug/nvmet
<subsysnqn>
ctrl<cntlid>
port
state
hostnqn
kato
host_traddr
queue<qnum>
sqsize
sqhead
The 'state' attribute is the value of the
CSTS register; one can trigger a controller reset
by writing 'fatal' into it (to set CSTS.CFS).
As usual, comments and reviews are welcome.
Changes to v2:
- Move the 'host_traddr' attribute to the
controller directory
- Rename callback to 'host_traddr'
Hannes Reinecke (8):
nvmet: add debugfs support
nvmet: add 'host_traddr' callback for debugfs
nvmet-tcp: implement host_traddr()
nvmet-rdma: implement host_traddr()
nvmet-fc: implement host_traddr()
nvme-fcloop: implement 'host_traddr'
lpfc_nvmet: implement 'host_traddr'
nvmet: add debugfs support for queues
drivers/nvme/target/Kconfig | 9 ++
drivers/nvme/target/Makefile | 1 +
drivers/nvme/target/core.c | 32 ++++-
drivers/nvme/target/debugfs.c | 250 +++++++++++++++++++++++++++++++++
drivers/nvme/target/debugfs.h | 50 +++++++
drivers/nvme/target/fc.c | 33 +++++
drivers/nvme/target/fcloop.c | 11 ++
drivers/nvme/target/nvmet.h | 15 +-
drivers/nvme/target/rdma.c | 12 ++
drivers/nvme/target/tcp.c | 14 ++
drivers/scsi/lpfc/lpfc_nvmet.c | 11 ++
include/linux/nvme-fc-driver.h | 4 +
12 files changed, 439 insertions(+), 3 deletions(-)
create mode 100644 drivers/nvme/target/debugfs.c
create mode 100644 drivers/nvme/target/debugfs.h
--
2.35.3
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH 1/8] nvmet: add debugfs support
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-23 20:25 ` Sagi Grimberg
2024-03-25 18:18 ` Daniel Wagner
2024-03-22 7:03 ` [PATCH 2/8] nvmet: add 'host_traddr' callback for debugfs Hannes Reinecke
` (6 subsequent siblings)
7 siblings, 2 replies; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig
Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke,
Redouane BOUFENGHOUR
Add a debugfs hierarchy to display the configured subsystems
and the controllers attached to the subsystems.
Suggested-by: Redouane BOUFENGHOUR <redouane.boufenghour@shadow.tech>
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/Kconfig | 9 ++
drivers/nvme/target/Makefile | 1 +
drivers/nvme/target/core.c | 22 +++-
drivers/nvme/target/debugfs.c | 182 ++++++++++++++++++++++++++++++++++
drivers/nvme/target/debugfs.h | 42 ++++++++
drivers/nvme/target/nvmet.h | 8 +-
6 files changed, 261 insertions(+), 3 deletions(-)
create mode 100644 drivers/nvme/target/debugfs.c
create mode 100644 drivers/nvme/target/debugfs.h
diff --git a/drivers/nvme/target/Kconfig b/drivers/nvme/target/Kconfig
index 872dd1a0acd8..5740893ace6d 100644
--- a/drivers/nvme/target/Kconfig
+++ b/drivers/nvme/target/Kconfig
@@ -18,6 +18,15 @@ config NVME_TARGET
To configure the NVMe target you probably want to use the nvmetcli
tool from http://git.infradead.org/users/hch/nvmetcli.git.
+config NVME_TARGET_DEBUGFS
+ bool "NVMe Target debugfs support"
+ depends on NVME_TARGET
+ help
+ This enables debugfs support to display the connected controllers
+ to each subsystem
+
+ If unsure, say N.
+
config NVME_TARGET_PASSTHRU
bool "NVMe Target Passthrough support"
depends on NVME_TARGET
diff --git a/drivers/nvme/target/Makefile b/drivers/nvme/target/Makefile
index c66820102493..c402c44350b2 100644
--- a/drivers/nvme/target/Makefile
+++ b/drivers/nvme/target/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_NVME_TARGET_TCP) += nvmet-tcp.o
nvmet-y += core.o configfs.o admin-cmd.o fabrics-cmd.o \
discovery.o io-cmd-file.o io-cmd-bdev.o
+nvmet-$(CONFIG_NVME_TARGET_DEBUGFS) += debugfs.o
nvmet-$(CONFIG_NVME_TARGET_PASSTHRU) += passthru.o
nvmet-$(CONFIG_BLK_DEV_ZONED) += zns.o
nvmet-$(CONFIG_NVME_TARGET_AUTH) += fabrics-cmd-auth.o auth.o
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index 1d1a7026e817..6cd1b92fc500 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -16,6 +16,7 @@
#include "trace.h"
#include "nvmet.h"
+#include "debugfs.h"
struct kmem_cache *nvmet_bvec_cache;
struct workqueue_struct *buffered_io_wq;
@@ -1463,6 +1464,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
mutex_lock(&subsys->lock);
list_add_tail(&ctrl->subsys_entry, &subsys->ctrls);
nvmet_setup_p2p_ns_map(ctrl, req);
+ nvmet_debugfs_ctrl_setup(ctrl);
mutex_unlock(&subsys->lock);
*ctrlp = ctrl;
@@ -1497,6 +1499,8 @@ static void nvmet_ctrl_free(struct kref *ref)
nvmet_destroy_auth(ctrl);
+ nvmet_debugfs_ctrl_free(ctrl);
+
ida_free(&cntlid_ida, ctrl->cntlid);
nvmet_async_events_free(ctrl);
@@ -1610,8 +1614,14 @@ struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn,
INIT_LIST_HEAD(&subsys->ctrls);
INIT_LIST_HEAD(&subsys->hosts);
+ ret = nvmet_debugfs_subsys_setup(subsys);
+ if (ret)
+ goto free_subsysnqn;
+
return subsys;
+free_subsysnqn:
+ kfree(subsys->subsysnqn);
free_fr:
kfree(subsys->firmware_rev);
free_mn:
@@ -1628,6 +1638,8 @@ static void nvmet_subsys_free(struct kref *ref)
WARN_ON_ONCE(!xa_empty(&subsys->namespaces));
+ nvmet_debugfs_subsys_free(subsys);
+
xa_destroy(&subsys->namespaces);
nvmet_passthru_subsys_free(subsys);
@@ -1681,11 +1693,18 @@ static int __init nvmet_init(void)
if (error)
goto out_free_nvmet_work_queue;
- error = nvmet_init_configfs();
+ error = nvmet_init_debugfs();
if (error)
goto out_exit_discovery;
+
+ error = nvmet_init_configfs();
+ if (error)
+ goto out_exit_debugfs;
+
return 0;
+out_exit_debugfs:
+ nvmet_exit_debugfs();
out_exit_discovery:
nvmet_exit_discovery();
out_free_nvmet_work_queue:
@@ -1702,6 +1721,7 @@ static int __init nvmet_init(void)
static void __exit nvmet_exit(void)
{
nvmet_exit_configfs();
+ nvmet_exit_debugfs();
nvmet_exit_discovery();
ida_destroy(&cntlid_ida);
destroy_workqueue(nvmet_wq);
diff --git a/drivers/nvme/target/debugfs.c b/drivers/nvme/target/debugfs.c
new file mode 100644
index 000000000000..4b9451ad0db9
--- /dev/null
+++ b/drivers/nvme/target/debugfs.c
@@ -0,0 +1,182 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * DebugFS interface for the NVMe target.
+ * Copyright (c) 2022-2024 Shadow
+ */
+
+#include <linux/debugfs.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include "nvmet.h"
+#include "debugfs.h"
+
+struct dentry *nvmet_debugfs;
+
+#define NVMET_DEBUGFS_ATTR(field) \
+ static int field##_open(struct inode *inode, struct file *file) \
+ { return single_open(file, field##_show, inode->i_private); } \
+ \
+ static const struct file_operations field##_fops = { \
+ .open = field##_open, \
+ .read = seq_read, \
+ .release = single_release, \
+ }
+
+#define NVMET_DEBUGFS_RW_ATTR(field) \
+ static int field##_open(struct inode *inode, struct file *file) \
+ { return single_open(file, field##_show, inode->i_private); } \
+ \
+ static const struct file_operations field##_fops = { \
+ .open = field##_open, \
+ .read = seq_read, \
+ .write = field##_write, \
+ .release = single_release, \
+ }
+
+static int nvmet_ctrl_hostnqn_show(struct seq_file *m, void *p)
+{
+ struct nvmet_ctrl *ctrl = (struct nvmet_ctrl *)m->private;
+
+ seq_printf(m, "%s\n", ctrl->hostnqn);
+ return 0;
+}
+NVMET_DEBUGFS_ATTR(nvmet_ctrl_hostnqn);
+
+static int nvmet_ctrl_kato_show(struct seq_file *m, void *p)
+{
+ struct nvmet_ctrl *ctrl = (struct nvmet_ctrl *)m->private;
+
+ seq_printf(m, "%d\n", ctrl->kato);
+ return 0;
+}
+NVMET_DEBUGFS_ATTR(nvmet_ctrl_kato);
+
+static int nvmet_ctrl_port_show(struct seq_file *m, void *p)
+{
+ struct nvmet_ctrl *ctrl = (struct nvmet_ctrl *)m->private;
+
+ seq_printf(m, "%d\n", le16_to_cpu(ctrl->port->disc_addr.portid));
+ return 0;
+}
+NVMET_DEBUGFS_ATTR(nvmet_ctrl_port);
+
+static const char *const csts_state_names[] = {
+ [NVME_CSTS_RDY] = "ready",
+ [NVME_CSTS_CFS] = "fatal",
+ [NVME_CSTS_NSSRO] = "reset",
+ [NVME_CSTS_SHST_OCCUR] = "shutdown",
+ [NVME_CSTS_SHST_CMPLT] = "completed",
+ [NVME_CSTS_PP] = "paused",
+};
+
+static int nvmet_ctrl_state_show(struct seq_file *m, void *p)
+{
+ struct nvmet_ctrl *ctrl = (struct nvmet_ctrl *)m->private;
+ bool sep = false;
+ int i;
+
+ for (i = 0; i < 7; i++) {
+ int state = BIT(i);
+
+ if (!(ctrl->csts & state))
+ continue;
+ if (sep)
+ seq_puts(m, "|");
+ sep = true;
+ if (csts_state_names[state])
+ seq_puts(m, csts_state_names[state]);
+ else
+ seq_printf(m, "%d", state);
+ }
+ if (sep)
+ seq_printf(m, "\n");
+ return 0;
+}
+
+static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
+ size_t count, loff_t *ppos)
+{
+ struct seq_file *m = file->private_data;
+ struct nvmet_ctrl *ctrl = m->private;
+ char reset[16];
+
+ if (count >= sizeof(reset))
+ return -EINVAL;
+ if (copy_from_user(reset, buf, count))
+ return -EFAULT;
+ if (!memcmp(reset, "fatal", 5))
+ nvmet_ctrl_fatal_error(ctrl);
+ else
+ return -EINVAL;
+ return count;
+}
+NVMET_DEBUGFS_RW_ATTR(nvmet_ctrl_state);
+
+int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl)
+{
+ char name[32];
+ struct dentry *parent = ctrl->subsys->debugfs_dir;
+ int ret;
+
+ if (!parent)
+ return -ENODEV;
+ snprintf(name, sizeof(name), "ctrl%d", ctrl->cntlid);
+ ctrl->debugfs_dir = debugfs_create_dir(name, parent);
+ if (IS_ERR(ctrl->debugfs_dir)) {
+ ret = PTR_ERR(ctrl->debugfs_dir);
+ ctrl->debugfs_dir = NULL;
+ return ret;
+ }
+ debugfs_create_file("port", S_IRUSR, ctrl->debugfs_dir, ctrl,
+ &nvmet_ctrl_port_fops);
+ debugfs_create_file("hostnqn", S_IRUSR, ctrl->debugfs_dir, ctrl,
+ &nvmet_ctrl_hostnqn_fops);
+ debugfs_create_file("kato", S_IRUSR, ctrl->debugfs_dir, ctrl,
+ &nvmet_ctrl_kato_fops);
+ debugfs_create_file("state", S_IRUSR | S_IWUSR, ctrl->debugfs_dir, ctrl,
+ &nvmet_ctrl_state_fops);
+ return 0;
+}
+
+void nvmet_debugfs_ctrl_free(struct nvmet_ctrl *ctrl)
+{
+ debugfs_remove_recursive(ctrl->debugfs_dir);
+}
+
+int nvmet_debugfs_subsys_setup(struct nvmet_subsys *subsys)
+{
+ int ret = 0;
+
+ subsys->debugfs_dir = debugfs_create_dir(subsys->subsysnqn,
+ nvmet_debugfs);
+ if (IS_ERR(subsys->debugfs_dir)) {
+ ret = PTR_ERR(subsys->debugfs_dir);
+ subsys->debugfs_dir = NULL;
+ }
+ return ret;
+}
+
+void nvmet_debugfs_subsys_free(struct nvmet_subsys *subsys)
+{
+ debugfs_remove_recursive(subsys->debugfs_dir);
+}
+
+int __init nvmet_init_debugfs(void)
+{
+ struct dentry *parent;
+
+ parent = debugfs_create_dir("nvmet", NULL);
+ if (IS_ERR(parent)) {
+ pr_warn("%s: failed to create debugfs directory\n", "nvmet");
+ return PTR_ERR(parent);
+ }
+ nvmet_debugfs = parent;
+ return 0;
+}
+
+void nvmet_exit_debugfs(void)
+{
+ debugfs_remove_recursive(nvmet_debugfs);
+}
diff --git a/drivers/nvme/target/debugfs.h b/drivers/nvme/target/debugfs.h
new file mode 100644
index 000000000000..ff09e5597614
--- /dev/null
+++ b/drivers/nvme/target/debugfs.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * DebugFS interface for the NVMe target.
+ * Copyright (c) 2022-2024 Shadow
+ * Copyright (c) 2024 SUSE LLC
+ */
+#ifndef NVMET_DEBUGFS_H
+#define NVMET_DEBUGFS_H
+
+#include <linux/types.h>
+
+#ifdef CONFIG_NVME_TARGET_DEBUGFS
+int nvmet_debugfs_subsys_setup(struct nvmet_subsys *subsys);
+void nvmet_debugfs_subsys_free(struct nvmet_subsys *subsys);
+int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl);
+void nvmet_debugfs_ctrl_free(struct nvmet_ctrl *ctrl);
+
+int __init nvmet_init_debugfs(void);
+void nvmet_exit_debugfs(void);
+#else
+static inline int nvmet_debugfs_subsys_setup(struct nvmet_subsys *subsys)
+{
+ return 0;
+}
+static inline void nvmet_debugfs_subsys_free(struct nvmet_subsys *subsys){}
+
+static inline int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl)
+{
+ return 0;
+}
+static inline void nvmet_debugfs_ctrl_free(struct nvmet_ctrl *ctrl) {}
+
+static inline int __init nvmet_init_debugfs(void)
+{
+ return 0;
+}
+
+static inline void nvmet_exit_debugfs(void) {}
+
+#endif
+
+#endif // NVMET_DEBUGFS_H
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
index 765da2b932c5..f0371163cb26 100644
--- a/drivers/nvme/target/nvmet.h
+++ b/drivers/nvme/target/nvmet.h
@@ -233,7 +233,9 @@ struct nvmet_ctrl {
struct device *p2p_client;
struct radix_tree_root p2p_ns_map;
-
+#ifdef CONFIG_NVME_TARGET_DEBUGFS
+ struct dentry *debugfs_dir;
+#endif
spinlock_t error_lock;
u64 err_counter;
struct nvme_error_slot slots[NVMET_ERROR_LOG_SLOTS];
@@ -269,7 +271,9 @@ struct nvmet_subsys {
struct list_head hosts;
bool allow_any_host;
-
+#ifdef CONFIG_NVME_TARGET_DEBUGFS
+ struct dentry *debugfs_dir;
+#endif
u16 max_qid;
u64 ver;
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 2/8] nvmet: add 'host_traddr' callback for debugfs
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
2024-03-22 7:03 ` [PATCH 1/8] nvmet: add " Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-23 20:27 ` Sagi Grimberg
2024-03-22 7:03 ` [PATCH 3/8] nvmet-tcp: implement host_traddr() Hannes Reinecke
` (5 subsequent siblings)
7 siblings, 1 reply; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
We want to display the transport address of the connected host
in debugfs, but this is a property of the transport.
So add a callback 'host_traddr' to allow the transport drivers
to fill in the data.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/core.c | 8 ++++++++
drivers/nvme/target/debugfs.c | 19 +++++++++++++++++++
drivers/nvme/target/nvmet.h | 4 ++++
3 files changed, 31 insertions(+)
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index 6cd1b92fc500..4955819e4f5f 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -1527,6 +1527,14 @@ void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl)
}
EXPORT_SYMBOL_GPL(nvmet_ctrl_fatal_error);
+ssize_t nvmet_ctrl_host_traddr(struct nvmet_ctrl *ctrl,
+ char *traddr, size_t traddr_len)
+{
+ if (!ctrl->ops->host_traddr)
+ return -EOPNOTSUPP;
+ return ctrl->ops->host_traddr(ctrl, traddr, traddr_len);
+}
+
static struct nvmet_subsys *nvmet_find_get_subsys(struct nvmet_port *port,
const char *subsysnqn)
{
diff --git a/drivers/nvme/target/debugfs.c b/drivers/nvme/target/debugfs.c
index 4b9451ad0db9..40eeac97157a 100644
--- a/drivers/nvme/target/debugfs.c
+++ b/drivers/nvme/target/debugfs.c
@@ -114,6 +114,23 @@ static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
}
NVMET_DEBUGFS_RW_ATTR(nvmet_ctrl_state);
+static int nvmet_ctrl_host_traddr_show(struct seq_file *m, void *p)
+{
+ struct nvmet_ctrl *ctrl = (struct nvmet_ctrl *)m->private;
+ ssize_t size;
+ char buf[NVMF_TRADDR_SIZE + 1];
+
+ size = nvmet_ctrl_host_traddr(ctrl, buf, NVMF_TRADDR_SIZE);
+ if (size < 0) {
+ buf[0] = '\0';
+ size = 0;
+ }
+ buf[size] = '\0';
+ seq_printf(m, "%s\n", buf);
+ return 0;
+}
+NVMET_DEBUGFS_ATTR(nvmet_ctrl_host_traddr);
+
int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl)
{
char name[32];
@@ -137,6 +154,8 @@ int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl)
&nvmet_ctrl_kato_fops);
debugfs_create_file("state", S_IRUSR | S_IWUSR, ctrl->debugfs_dir, ctrl,
&nvmet_ctrl_state_fops);
+ debugfs_create_file("host_traddr", S_IRUSR, ctrl->debugfs_dir, ctrl,
+ &nvmet_ctrl_host_traddr_fops);
return 0;
}
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
index f0371163cb26..3b7ba6d656cf 100644
--- a/drivers/nvme/target/nvmet.h
+++ b/drivers/nvme/target/nvmet.h
@@ -361,6 +361,8 @@ struct nvmet_fabrics_ops {
void (*delete_ctrl)(struct nvmet_ctrl *ctrl);
void (*disc_traddr)(struct nvmet_req *req,
struct nvmet_port *port, char *traddr);
+ ssize_t (*host_traddr)(struct nvmet_ctrl *ctrl,
+ char *traddr, size_t traddr_len);
u16 (*install_queue)(struct nvmet_sq *nvme_sq);
void (*discovery_chg)(struct nvmet_port *port);
u8 (*get_mdts)(const struct nvmet_ctrl *ctrl);
@@ -509,6 +511,8 @@ struct nvmet_ctrl *nvmet_ctrl_find_get(const char *subsysnqn,
struct nvmet_req *req);
void nvmet_ctrl_put(struct nvmet_ctrl *ctrl);
u16 nvmet_check_ctrl_status(struct nvmet_req *req);
+ssize_t nvmet_ctrl_host_traddr(struct nvmet_ctrl *ctrl,
+ char *traddr, size_t traddr_len);
struct nvmet_subsys *nvmet_subsys_alloc(const char *subsysnqn,
enum nvme_subsys_type type);
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 3/8] nvmet-tcp: implement host_traddr()
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
2024-03-22 7:03 ` [PATCH 1/8] nvmet: add " Hannes Reinecke
2024-03-22 7:03 ` [PATCH 2/8] nvmet: add 'host_traddr' callback for debugfs Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-23 20:27 ` Sagi Grimberg
2024-03-22 7:03 ` [PATCH 4/8] nvmet-rdma: " Hannes Reinecke
` (4 subsequent siblings)
7 siblings, 1 reply; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
Implement callback to display the host transport address.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/tcp.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
index 4718d4d87a85..d890c1a393d8 100644
--- a/drivers/nvme/target/tcp.c
+++ b/drivers/nvme/target/tcp.c
@@ -2201,6 +2201,19 @@ static void nvmet_tcp_disc_port_addr(struct nvmet_req *req,
}
}
+static ssize_t nvmet_tcp_host_port_addr(struct nvmet_ctrl *ctrl,
+ char *traddr, size_t traddr_len)
+{
+ struct nvmet_sq *sq = ctrl->sqs[0];
+ struct nvmet_tcp_queue *queue =
+ container_of(sq, struct nvmet_tcp_queue, nvme_sq);
+
+ if (queue->sockaddr_peer.ss_family == AF_UNSPEC)
+ return -EINVAL;
+ return snprintf(traddr, traddr_len, "%pISc",
+ (struct sockaddr *)&queue->sockaddr_peer);
+}
+
static const struct nvmet_fabrics_ops nvmet_tcp_ops = {
.owner = THIS_MODULE,
.type = NVMF_TRTYPE_TCP,
@@ -2211,6 +2224,7 @@ static const struct nvmet_fabrics_ops nvmet_tcp_ops = {
.delete_ctrl = nvmet_tcp_delete_ctrl,
.install_queue = nvmet_tcp_install_queue,
.disc_traddr = nvmet_tcp_disc_port_addr,
+ .host_traddr = nvmet_tcp_host_port_addr,
};
static int __init nvmet_tcp_init(void)
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 4/8] nvmet-rdma: implement host_traddr()
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
` (2 preceding siblings ...)
2024-03-22 7:03 ` [PATCH 3/8] nvmet-tcp: implement host_traddr() Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-23 20:27 ` Sagi Grimberg
2024-03-22 7:03 ` [PATCH 5/8] nvmet-fc: " Hannes Reinecke
` (3 subsequent siblings)
7 siblings, 1 reply; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
Implement callback to display the host transport address.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/rdma.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c
index f2bb9d95ecf4..99d98296d0ba 100644
--- a/drivers/nvme/target/rdma.c
+++ b/drivers/nvme/target/rdma.c
@@ -2014,6 +2014,17 @@ static void nvmet_rdma_disc_port_addr(struct nvmet_req *req,
}
}
+static ssize_t nvmet_rdma_host_port_addr(struct nvmet_ctrl *ctrl,
+ char *traddr, size_t traddr_len)
+{
+ struct nvmet_sq *nvme_sq = ctrl->sqs[0];
+ struct nvmet_rdma_queue *queue =
+ container_of(nvme_sq, struct nvmet_rdma_queue, nvme_sq);
+
+ return snprintf(traddr, traddr_len, "%pISc",
+ (struct sockaddr *)&queue->cm_id->route.addr.dst_addr);
+}
+
static u8 nvmet_rdma_get_mdts(const struct nvmet_ctrl *ctrl)
{
if (ctrl->pi_support)
@@ -2038,6 +2049,7 @@ static const struct nvmet_fabrics_ops nvmet_rdma_ops = {
.queue_response = nvmet_rdma_queue_response,
.delete_ctrl = nvmet_rdma_delete_ctrl,
.disc_traddr = nvmet_rdma_disc_port_addr,
+ .host_traddr = nvmet_rdma_host_port_addr,
.get_mdts = nvmet_rdma_get_mdts,
.get_max_queue_size = nvmet_rdma_get_max_queue_size,
};
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 5/8] nvmet-fc: implement host_traddr()
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
` (3 preceding siblings ...)
2024-03-22 7:03 ` [PATCH 4/8] nvmet-rdma: " Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-22 7:03 ` [PATCH 6/8] nvme-fcloop: implement 'host_traddr' Hannes Reinecke
` (2 subsequent siblings)
7 siblings, 0 replies; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
Implement callback to display the host transport address by
adding a callback 'host_traddr' for nvmet_fc_target_template.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/fc.c | 33 +++++++++++++++++++++++++++++++++
include/linux/nvme-fc-driver.h | 4 ++++
2 files changed, 37 insertions(+)
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
index fd229f310c93..b4706a8a9837 100644
--- a/drivers/nvme/target/fc.c
+++ b/drivers/nvme/target/fc.c
@@ -2931,6 +2931,38 @@ nvmet_fc_discovery_chg(struct nvmet_port *port)
tgtport->ops->discovery_event(&tgtport->fc_target_port);
}
+static ssize_t
+nvmet_fc_host_traddr(struct nvmet_ctrl *ctrl,
+ char *traddr, size_t traddr_size)
+{
+ struct nvmet_sq *sq = ctrl->sqs[0];
+ struct nvmet_fc_tgt_queue *queue =
+ container_of(sq, struct nvmet_fc_tgt_queue, nvme_sq);
+ struct nvmet_fc_tgtport *tgtport = queue->assoc ? queue->assoc->tgtport : NULL;
+ struct nvmet_fc_hostport *hostport = queue->assoc ? queue->assoc->hostport : NULL;
+ u64 wwnn, wwpn;
+ ssize_t ret = 0;
+
+ if (!tgtport || !nvmet_fc_tgtport_get(tgtport))
+ return -ENODEV;
+ if (!hostport || !nvmet_fc_hostport_get(hostport)) {
+ ret = -ENODEV;
+ goto out_put;
+ }
+
+ if (tgtport->ops->host_traddr) {
+ ret = tgtport->ops->host_traddr(hostport->hosthandle, &wwnn, &wwpn);
+ if (ret)
+ goto out_put_host;
+ ret = snprintf(traddr, traddr_size, "nn-0x%llx:pn-0x%llx", wwnn, wwpn);
+ }
+out_put_host:
+ nvmet_fc_hostport_put(hostport);
+out_put:
+ nvmet_fc_tgtport_put(tgtport);
+ return ret;
+}
+
static const struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops = {
.owner = THIS_MODULE,
.type = NVMF_TRTYPE_FC,
@@ -2940,6 +2972,7 @@ static const struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops = {
.queue_response = nvmet_fc_fcp_nvme_cmd_done,
.delete_ctrl = nvmet_fc_delete_ctrl,
.discovery_chg = nvmet_fc_discovery_chg,
+ .host_traddr = nvmet_fc_host_traddr,
};
static int __init nvmet_fc_init_module(void)
diff --git a/include/linux/nvme-fc-driver.h b/include/linux/nvme-fc-driver.h
index 4109f1bd6128..89ea1ebd975a 100644
--- a/include/linux/nvme-fc-driver.h
+++ b/include/linux/nvme-fc-driver.h
@@ -920,6 +920,9 @@ struct nvmet_fc_target_port {
* further references to hosthandle.
* Entrypoint is Mandatory if the lldd calls nvmet_fc_invalidate_host().
*
+ * @host_traddr: called by the transport to retrieve the node name and
+ * port name of the host port address.
+ *
* @max_hw_queues: indicates the maximum number of hw queues the LLDD
* supports for cpu affinitization.
* Value is Mandatory. Must be at least 1.
@@ -975,6 +978,7 @@ struct nvmet_fc_target_template {
void (*ls_abort)(struct nvmet_fc_target_port *targetport,
void *hosthandle, struct nvmefc_ls_req *lsreq);
void (*host_release)(void *hosthandle);
+ int (*host_traddr)(void *hosthandle, u64 *wwnn, u64 *wwpn);
u32 max_hw_queues;
u16 max_sgl_segments;
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 6/8] nvme-fcloop: implement 'host_traddr'
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
` (4 preceding siblings ...)
2024-03-22 7:03 ` [PATCH 5/8] nvmet-fc: " Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-22 7:03 ` [PATCH 7/8] lpfc_nvmet: " Hannes Reinecke
2024-03-22 7:03 ` [PATCH 8/8] nvmet: add debugfs support for queues Hannes Reinecke
7 siblings, 0 replies; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
Implement the 'host_traddr' callback to display the host transport
address for nvmet debugfs.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/fcloop.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/nvme/target/fcloop.c b/drivers/nvme/target/fcloop.c
index 913cd2ec7a6f..e1abb27927ff 100644
--- a/drivers/nvme/target/fcloop.c
+++ b/drivers/nvme/target/fcloop.c
@@ -492,6 +492,16 @@ fcloop_t2h_host_release(void *hosthandle)
/* host handle ignored for now */
}
+static int
+fcloop_t2h_host_traddr(void *hosthandle, u64 *wwnn, u64 *wwpn)
+{
+ struct fcloop_rport *rport = hosthandle;
+
+ *wwnn = rport->lport->localport->node_name;
+ *wwpn = rport->lport->localport->port_name;
+ return 0;
+}
+
/*
* Simulate reception of RSCN and converting it to a initiator transport
* call to rescan a remote port.
@@ -1074,6 +1084,7 @@ static struct nvmet_fc_target_template tgttemplate = {
.ls_req = fcloop_t2h_ls_req,
.ls_abort = fcloop_t2h_ls_abort,
.host_release = fcloop_t2h_host_release,
+ .host_traddr = fcloop_t2h_host_traddr,
.max_hw_queues = FCLOOP_HW_QUEUES,
.max_sgl_segments = FCLOOP_SGL_SEGS,
.max_dif_sgl_segments = FCLOOP_SGL_SEGS,
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 7/8] lpfc_nvmet: implement 'host_traddr'
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
` (5 preceding siblings ...)
2024-03-22 7:03 ` [PATCH 6/8] nvme-fcloop: implement 'host_traddr' Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-22 7:03 ` [PATCH 8/8] nvmet: add debugfs support for queues Hannes Reinecke
7 siblings, 0 replies; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
Implement the 'host_traddr' callback to display the host transport
address for nvmet debugfs.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/scsi/lpfc/lpfc_nvmet.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index 425328d9c2d8..a315ab03f721 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -1363,6 +1363,16 @@ lpfc_nvmet_ls_abort(struct nvmet_fc_target_port *targetport,
atomic_inc(&lpfc_nvmet->xmt_ls_abort);
}
+static int
+lpfc_nvmet_host_traddr(void *hosthandle, u64 *wwnn, u64 *wwpn)
+{
+ struct lpfc_nodelist *ndlp = hosthandle;
+
+ *wwnn = wwn_to_u64(ndlp->nlp_nodename.u.wwn);
+ *wwpn = wwn_to_u64(ndlp->nlp_portname.u.wwn);
+ return 0;
+}
+
static void
lpfc_nvmet_host_release(void *hosthandle)
{
@@ -1413,6 +1423,7 @@ static struct nvmet_fc_target_template lpfc_tgttemplate = {
.ls_req = lpfc_nvmet_ls_req,
.ls_abort = lpfc_nvmet_ls_abort,
.host_release = lpfc_nvmet_host_release,
+ .host_traddr = lpfc_nvmet_host_traddr,
.max_hw_queues = 1,
.max_sgl_segments = LPFC_NVMET_DEFAULT_SEGS,
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* [PATCH 8/8] nvmet: add debugfs support for queues
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
` (6 preceding siblings ...)
2024-03-22 7:03 ` [PATCH 7/8] lpfc_nvmet: " Hannes Reinecke
@ 2024-03-22 7:03 ` Hannes Reinecke
2024-03-23 20:31 ` Sagi Grimberg
7 siblings, 1 reply; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-22 7:03 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Sagi Grimberg, Keith Busch, linux-nvme, Hannes Reinecke
Add debugfs entries to display the status of the controller
queues.
Signed-off-by: Hannes Reinecke <hare@kernel.org>
---
drivers/nvme/target/core.c | 2 ++
drivers/nvme/target/debugfs.c | 49 +++++++++++++++++++++++++++++++++++
drivers/nvme/target/debugfs.h | 8 ++++++
drivers/nvme/target/nvmet.h | 3 +++
4 files changed, 62 insertions(+)
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index 4955819e4f5f..694e91cdfc8d 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -791,6 +791,7 @@ void nvmet_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq,
sq->size = size;
ctrl->sqs[qid] = sq;
+ nvmet_debugfs_queue_setup(ctrl, sq);
}
static void nvmet_confirm_sq(struct percpu_ref *ref)
@@ -815,6 +816,7 @@ void nvmet_sq_destroy(struct nvmet_sq *sq)
wait_for_completion(&sq->free_done);
percpu_ref_exit(&sq->ref);
nvmet_auth_sq_free(sq);
+ nvmet_debugfs_queue_free(sq);
if (ctrl) {
/*
diff --git a/drivers/nvme/target/debugfs.c b/drivers/nvme/target/debugfs.c
index 40eeac97157a..a8fec34f36d4 100644
--- a/drivers/nvme/target/debugfs.c
+++ b/drivers/nvme/target/debugfs.c
@@ -35,6 +35,55 @@ struct dentry *nvmet_debugfs;
.release = single_release, \
}
+static int nvmet_queue_sqsize_show(struct seq_file *m, void *p)
+{
+ struct nvmet_sq *sq = (struct nvmet_sq *)m->private;
+
+ seq_printf(m, "%d\n", sq->size);
+ return 0;
+}
+NVMET_DEBUGFS_ATTR(nvmet_queue_sqsize);
+
+static int nvmet_queue_sqhead_show(struct seq_file *m, void *p)
+{
+ struct nvmet_sq *sq = (struct nvmet_sq *)m->private;
+ u32 sqhd = READ_ONCE(sq->sqhd);
+
+ if (sq->sqhd_disabled)
+ seq_puts(m, "disabled\n");
+ else
+ seq_printf(m, "%u\n", sqhd & 0x0000FFFF);
+ return 0;
+}
+NVMET_DEBUGFS_ATTR(nvmet_queue_sqhead);
+
+int nvmet_debugfs_queue_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq)
+{
+ char name[32];
+ struct dentry *parent = ctrl->debugfs_dir, *queue_dir;
+
+ if (!parent)
+ return -ENODEV;
+ if (!sq)
+ return -EINVAL;
+ snprintf(name, sizeof(name), "queue%d", sq->qid);
+ queue_dir = debugfs_create_dir(name, parent);
+ if (IS_ERR(queue_dir))
+ return PTR_ERR(queue_dir);
+ sq->debugfs_dir = queue_dir;
+ debugfs_create_file("sqsize", S_IRUSR, queue_dir,
+ sq, &nvmet_queue_sqsize_fops);
+ debugfs_create_file("sqhead", S_IRUSR, queue_dir,
+ sq, &nvmet_queue_sqhead_fops);
+ return 0;
+}
+
+void nvmet_debugfs_queue_free(struct nvmet_sq *sq)
+{
+ debugfs_remove_recursive(sq->debugfs_dir);
+ sq->debugfs_dir = NULL;
+}
+
static int nvmet_ctrl_hostnqn_show(struct seq_file *m, void *p)
{
struct nvmet_ctrl *ctrl = (struct nvmet_ctrl *)m->private;
diff --git a/drivers/nvme/target/debugfs.h b/drivers/nvme/target/debugfs.h
index ff09e5597614..5192f8012b79 100644
--- a/drivers/nvme/target/debugfs.h
+++ b/drivers/nvme/target/debugfs.h
@@ -14,6 +14,8 @@ int nvmet_debugfs_subsys_setup(struct nvmet_subsys *subsys);
void nvmet_debugfs_subsys_free(struct nvmet_subsys *subsys);
int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl);
void nvmet_debugfs_ctrl_free(struct nvmet_ctrl *ctrl);
+int nvmet_debugfs_queue_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq);
+void nvmet_debugfs_queue_free(struct nvmet_sq *sq);
int __init nvmet_init_debugfs(void);
void nvmet_exit_debugfs(void);
@@ -30,6 +32,12 @@ static inline int nvmet_debugfs_ctrl_setup(struct nvmet_ctrl *ctrl)
}
static inline void nvmet_debugfs_ctrl_free(struct nvmet_ctrl *ctrl) {}
+static inline int nvmet_debugfs_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq)
+{
+ return 0;
+}
+static inline void nvmet_debugfs_sq_free(struct nvmet_sq *sq) {}
+
static inline int __init nvmet_init_debugfs(void)
{
return 0;
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
index 3b7ba6d656cf..a6c2b106ba1c 100644
--- a/drivers/nvme/target/nvmet.h
+++ b/drivers/nvme/target/nvmet.h
@@ -109,6 +109,9 @@ struct nvmet_sq {
u16 size;
u32 sqhd;
bool sqhd_disabled;
+#ifdef CONFIG_NVME_TARGET_DEBUGFS
+ struct dentry *debugfs_dir;
+#endif
#ifdef CONFIG_NVME_TARGET_AUTH
bool authenticated;
struct delayed_work auth_expired_work;
--
2.35.3
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-22 7:03 ` [PATCH 1/8] nvmet: add " Hannes Reinecke
@ 2024-03-23 20:25 ` Sagi Grimberg
2024-03-26 11:55 ` Hannes Reinecke
2024-03-25 18:18 ` Daniel Wagner
1 sibling, 1 reply; 23+ messages in thread
From: Sagi Grimberg @ 2024-03-23 20:25 UTC (permalink / raw)
To: Hannes Reinecke, Christoph Hellwig
Cc: Keith Busch, linux-nvme, Redouane BOUFENGHOUR
> +int nvmet_debugfs_subsys_setup(struct nvmet_subsys *subsys)
> +{
> + int ret = 0;
> +
> + subsys->debugfs_dir = debugfs_create_dir(subsys->subsysnqn,
> + nvmet_debugfs);
> + if (IS_ERR(subsys->debugfs_dir)) {
> + ret = PTR_ERR(subsys->debugfs_dir);
> + subsys->debugfs_dir = NULL;
> + }
> + return ret;
> +}
> +
> +void nvmet_debugfs_subsys_free(struct nvmet_subsys *subsys)
> +{
> + debugfs_remove_recursive(subsys->debugfs_dir);
> +}
The subsys setup/free look trivial enough to just open-code
in the call-sites.
The rest looks fine to me.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 2/8] nvmet: add 'host_traddr' callback for debugfs
2024-03-22 7:03 ` [PATCH 2/8] nvmet: add 'host_traddr' callback for debugfs Hannes Reinecke
@ 2024-03-23 20:27 ` Sagi Grimberg
0 siblings, 0 replies; 23+ messages in thread
From: Sagi Grimberg @ 2024-03-23 20:27 UTC (permalink / raw)
To: Hannes Reinecke, Christoph Hellwig; +Cc: Keith Busch, linux-nvme
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 3/8] nvmet-tcp: implement host_traddr()
2024-03-22 7:03 ` [PATCH 3/8] nvmet-tcp: implement host_traddr() Hannes Reinecke
@ 2024-03-23 20:27 ` Sagi Grimberg
0 siblings, 0 replies; 23+ messages in thread
From: Sagi Grimberg @ 2024-03-23 20:27 UTC (permalink / raw)
To: Hannes Reinecke, Christoph Hellwig; +Cc: Keith Busch, linux-nvme
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 4/8] nvmet-rdma: implement host_traddr()
2024-03-22 7:03 ` [PATCH 4/8] nvmet-rdma: " Hannes Reinecke
@ 2024-03-23 20:27 ` Sagi Grimberg
0 siblings, 0 replies; 23+ messages in thread
From: Sagi Grimberg @ 2024-03-23 20:27 UTC (permalink / raw)
To: Hannes Reinecke, Christoph Hellwig; +Cc: Keith Busch, linux-nvme
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 8/8] nvmet: add debugfs support for queues
2024-03-22 7:03 ` [PATCH 8/8] nvmet: add debugfs support for queues Hannes Reinecke
@ 2024-03-23 20:31 ` Sagi Grimberg
2024-03-25 7:25 ` Hannes Reinecke
0 siblings, 1 reply; 23+ messages in thread
From: Sagi Grimberg @ 2024-03-23 20:31 UTC (permalink / raw)
To: Hannes Reinecke, Christoph Hellwig; +Cc: Keith Busch, linux-nvme
On 22/03/2024 9:03, Hannes Reinecke wrote:
> Add debugfs entries to display the status of the controller
> queues.
I'm questioning the value of this. We can possibly see lots and lots of
queues and I wonder how a queue entry will this actually help.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 8/8] nvmet: add debugfs support for queues
2024-03-23 20:31 ` Sagi Grimberg
@ 2024-03-25 7:25 ` Hannes Reinecke
2024-03-25 9:07 ` Sagi Grimberg
0 siblings, 1 reply; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-25 7:25 UTC (permalink / raw)
To: Sagi Grimberg, Hannes Reinecke, Christoph Hellwig; +Cc: Keith Busch, linux-nvme
On 3/23/24 21:31, Sagi Grimberg wrote:
>
>
> On 22/03/2024 9:03, Hannes Reinecke wrote:
>> Add debugfs entries to display the status of the controller
>> queues.
>
> I'm questioning the value of this. We can possibly see lots and lots of
> queues and I wonder how a queue entry will this actually help.
One can inspect I/O progress via the sqhead attribute; also one would
want to know the number of queues created.
But we can leave it for now; main part of this patchset is the
controller entries and the possibility to trigger a controller reset.
Cheers,
Hannes
--
Dr. Hannes Reinecke Kernel Storage Architect
hare@suse.de +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 8/8] nvmet: add debugfs support for queues
2024-03-25 7:25 ` Hannes Reinecke
@ 2024-03-25 9:07 ` Sagi Grimberg
0 siblings, 0 replies; 23+ messages in thread
From: Sagi Grimberg @ 2024-03-25 9:07 UTC (permalink / raw)
To: Hannes Reinecke, Hannes Reinecke, Christoph Hellwig
Cc: Keith Busch, linux-nvme
On 25/03/2024 9:25, Hannes Reinecke wrote:
> On 3/23/24 21:31, Sagi Grimberg wrote:
>>
>>
>> On 22/03/2024 9:03, Hannes Reinecke wrote:
>>> Add debugfs entries to display the status of the controller
>>> queues.
>>
>> I'm questioning the value of this. We can possibly see lots and lots of
>> queues and I wonder how a queue entry will this actually help.
>
> One can inspect I/O progress via the sqhead attribute; also one would
> want to know the number of queues created.
> But we can leave it for now; main part of this patchset is the
> controller entries and the possibility to trigger a controller reset.
Lets drop the queue debug stats for now
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-22 7:03 ` [PATCH 1/8] nvmet: add " Hannes Reinecke
2024-03-23 20:25 ` Sagi Grimberg
@ 2024-03-25 18:18 ` Daniel Wagner
2024-03-25 19:22 ` Daniel Wagner
` (2 more replies)
1 sibling, 3 replies; 23+ messages in thread
From: Daniel Wagner @ 2024-03-25 18:18 UTC (permalink / raw)
To: Hannes Reinecke
Cc: Christoph Hellwig, Sagi Grimberg, Keith Busch, linux-nvme,
Redouane BOUFENGHOUR
On Fri, Mar 22, 2024 at 08:03:26AM +0100, Hannes Reinecke wrote:
> +static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
> + size_t count, loff_t *ppos)
> +{
> + struct seq_file *m = file->private_data;
> + struct nvmet_ctrl *ctrl = m->private;
> + char reset[16];
> +
> + if (count >= sizeof(reset))
> + return -EINVAL;
> + if (copy_from_user(reset, buf, count))
> + return -EFAULT;
> + if (!memcmp(reset, "fatal", 5))
> + nvmet_ctrl_fatal_error(ctrl);
I'd like to use this also to trigger a reset. This allows to test the
auth code a bit better, e.g. after changing the ctrl key on the target
nothing will happen until a reconnect happens. Currently, I have to
set the max queue count which triggers a reset. Also it would make the
'support real hardware' series for blktests why more generic.
This here should does the trick in my local testing:
--- a/drivers/nvme/target/debugfs.c
+++ b/drivers/nvme/target/debugfs.c
@@ -157,6 +157,8 @@ static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
return -EFAULT;
if (!memcmp(reset, "fatal", 5))
nvmet_ctrl_fatal_error(ctrl);
+ else if (!memcmp(reset, "reset", 5))
+ ctrl->ops->delete_ctrl(ctrl);
else
return -EINVAL;
return count;
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-25 18:18 ` Daniel Wagner
@ 2024-03-25 19:22 ` Daniel Wagner
2024-03-25 22:39 ` Sagi Grimberg
2024-03-26 7:14 ` Hannes Reinecke
2 siblings, 0 replies; 23+ messages in thread
From: Daniel Wagner @ 2024-03-25 19:22 UTC (permalink / raw)
To: Hannes Reinecke
Cc: Christoph Hellwig, Sagi Grimberg, Keith Busch, linux-nvme,
Redouane BOUFENGHOUR
On Mon, Mar 25, 2024 at 07:18:52PM +0100, Daniel Wagner wrote:
> On Fri, Mar 22, 2024 at 08:03:26AM +0100, Hannes Reinecke wrote:
> > +static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
> > + size_t count, loff_t *ppos)
> > +{
> > + struct seq_file *m = file->private_data;
> > + struct nvmet_ctrl *ctrl = m->private;
> > + char reset[16];
> > +
> > + if (count >= sizeof(reset))
> > + return -EINVAL;
> > + if (copy_from_user(reset, buf, count))
> > + return -EFAULT;
> > + if (!memcmp(reset, "fatal", 5))
> > + nvmet_ctrl_fatal_error(ctrl);
>
> I'd like to use this also to trigger a reset. This allows to test the
> auth code a bit better, e.g. after changing the ctrl key on the target
> nothing will happen until a reconnect happens. Currently, I have to
> set the max queue count which triggers a reset. Also it would make the
> 'support real hardware' series for blktests why more generic.
>
> This here should does the trick in my local testing:
>
> --- a/drivers/nvme/target/debugfs.c
> +++ b/drivers/nvme/target/debugfs.c
> @@ -157,6 +157,8 @@ static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
> return -EFAULT;
> if (!memcmp(reset, "fatal", 5))
> nvmet_ctrl_fatal_error(ctrl);
> + else if (!memcmp(reset, "reset", 5))
> + ctrl->ops->delete_ctrl(ctrl);
> else
> return -EINVAL;
> return count;
>
and here the corresponding test extension (nvme/045)
echo "Renew host key on the controller and force reconnect"
new_hostkey="$(nvme gen-dhchap-key -n ${def_subsysnqn} 2> /dev/null)"
_set_nvmet_hostkey "${def_hostnqn}" "${new_hostkey}"
# Force a reconnect
nvmedev=$(_find_nvme_dev "${def_subsysnqn}")
cntlid="$(nvme id-ctrl -o json "/dev/${nvmedev}" | jq .cntlid)"
echo "reset" > /sys/kernel/debug/nvmet/"${def_subsysnqn}/ctrl${cntlid}"/state
nvmf_wait_for_ctrl_delete "${nvmedev}"
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-25 18:18 ` Daniel Wagner
2024-03-25 19:22 ` Daniel Wagner
@ 2024-03-25 22:39 ` Sagi Grimberg
2024-03-26 7:16 ` Daniel Wagner
2024-03-26 7:14 ` Hannes Reinecke
2 siblings, 1 reply; 23+ messages in thread
From: Sagi Grimberg @ 2024-03-25 22:39 UTC (permalink / raw)
To: Daniel Wagner, Hannes Reinecke
Cc: Christoph Hellwig, Keith Busch, linux-nvme, Redouane BOUFENGHOUR
On 25/03/2024 20:18, Daniel Wagner wrote:
> On Fri, Mar 22, 2024 at 08:03:26AM +0100, Hannes Reinecke wrote:
>> +static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
>> + size_t count, loff_t *ppos)
>> +{
>> + struct seq_file *m = file->private_data;
>> + struct nvmet_ctrl *ctrl = m->private;
>> + char reset[16];
>> +
>> + if (count >= sizeof(reset))
>> + return -EINVAL;
>> + if (copy_from_user(reset, buf, count))
>> + return -EFAULT;
>> + if (!memcmp(reset, "fatal", 5))
>> + nvmet_ctrl_fatal_error(ctrl);
> I'd like to use this also to trigger a reset. This allows to test the
> auth code a bit better, e.g. after changing the ctrl key on the target
> nothing will happen until a reconnect happens. Currently, I have to
> set the max queue count which triggers a reset. Also it would make the
> 'support real hardware' series for blktests why more generic.
>
> This here should does the trick in my local testing:
>
> --- a/drivers/nvme/target/debugfs.c
> +++ b/drivers/nvme/target/debugfs.c
> @@ -157,6 +157,8 @@ static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
> return -EFAULT;
> if (!memcmp(reset, "fatal", 5))
> nvmet_ctrl_fatal_error(ctrl);
> + else if (!memcmp(reset, "reset", 5))
> + ctrl->ops->delete_ctrl(ctrl);
> else
> return -EINVAL;
> return count;
What is the difference between fatal and reset?
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-25 18:18 ` Daniel Wagner
2024-03-25 19:22 ` Daniel Wagner
2024-03-25 22:39 ` Sagi Grimberg
@ 2024-03-26 7:14 ` Hannes Reinecke
2024-03-26 7:22 ` Daniel Wagner
2 siblings, 1 reply; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-26 7:14 UTC (permalink / raw)
To: Daniel Wagner, Hannes Reinecke
Cc: Christoph Hellwig, Sagi Grimberg, Keith Busch, linux-nvme,
Redouane BOUFENGHOUR
On 3/25/24 19:18, Daniel Wagner wrote:
> On Fri, Mar 22, 2024 at 08:03:26AM +0100, Hannes Reinecke wrote:
>> +static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
>> + size_t count, loff_t *ppos)
>> +{
>> + struct seq_file *m = file->private_data;
>> + struct nvmet_ctrl *ctrl = m->private;
>> + char reset[16];
>> +
>> + if (count >= sizeof(reset))
>> + return -EINVAL;
>> + if (copy_from_user(reset, buf, count))
>> + return -EFAULT;
>> + if (!memcmp(reset, "fatal", 5))
>> + nvmet_ctrl_fatal_error(ctrl);
>
> I'd like to use this also to trigger a reset. This allows to test the
> auth code a bit better, e.g. after changing the ctrl key on the target
> nothing will happen until a reconnect happens. Currently, I have to
> set the max queue count which triggers a reset. Also it would make the
> 'support real hardware' series for blktests why more generic.
>
> This here should does the trick in my local testing:
>
> --- a/drivers/nvme/target/debugfs.c
> +++ b/drivers/nvme/target/debugfs.c
> @@ -157,6 +157,8 @@ static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
> return -EFAULT;
> if (!memcmp(reset, "fatal", 5))
> nvmet_ctrl_fatal_error(ctrl);
> + else if (!memcmp(reset, "reset", 5))
> + ctrl->ops->delete_ctrl(ctrl);
> else
> return -EINVAL;
> return count;
>
Weelll ... guess what the 'fatal' status does ...
I can rename it to 'reset' if you'd like, but 'fatal' corresponds to one
of the controller states, whereas 'reset' doesn't.
But I can make it an alias if you really want to write 'reset' :-)
Cheers,
Hannes
--
Dr. Hannes Reinecke Kernel Storage Architect
hare@suse.de +49 911 74053 688
SUSE Software Solutions GmbH, Frankenstr. 146, 90461 Nürnberg
HRB 36809 (AG Nürnberg), GF: I. Totev, A. McDonald, W. Knoblich
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-25 22:39 ` Sagi Grimberg
@ 2024-03-26 7:16 ` Daniel Wagner
0 siblings, 0 replies; 23+ messages in thread
From: Daniel Wagner @ 2024-03-26 7:16 UTC (permalink / raw)
To: Sagi Grimberg
Cc: Hannes Reinecke, Christoph Hellwig, Keith Busch, linux-nvme,
Redouane BOUFENGHOUR
On Tue, Mar 26, 2024 at 12:39:16AM +0200, Sagi Grimberg wrote:
>
>
> On 25/03/2024 20:18, Daniel Wagner wrote:
> > On Fri, Mar 22, 2024 at 08:03:26AM +0100, Hannes Reinecke wrote:
> > > +static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
> > > + size_t count, loff_t *ppos)
> > > +{
> > > + struct seq_file *m = file->private_data;
> > > + struct nvmet_ctrl *ctrl = m->private;
> > > + char reset[16];
> > > +
> > > + if (count >= sizeof(reset))
> > > + return -EINVAL;
> > > + if (copy_from_user(reset, buf, count))
> > > + return -EFAULT;
> > > + if (!memcmp(reset, "fatal", 5))
> > > + nvmet_ctrl_fatal_error(ctrl);
> > I'd like to use this also to trigger a reset. This allows to test the
> > auth code a bit better, e.g. after changing the ctrl key on the target
> > nothing will happen until a reconnect happens. Currently, I have to
> > set the max queue count which triggers a reset. Also it would make the
> > 'support real hardware' series for blktests why more generic.
> >
> > This here should does the trick in my local testing:
> >
> > --- a/drivers/nvme/target/debugfs.c
> > +++ b/drivers/nvme/target/debugfs.c
> > @@ -157,6 +157,8 @@ static ssize_t nvmet_ctrl_state_write(struct file *file, const char __user *buf,
> > return -EFAULT;
> > if (!memcmp(reset, "fatal", 5))
> > nvmet_ctrl_fatal_error(ctrl);
> > + else if (!memcmp(reset, "reset", 5))
> > + ctrl->ops->delete_ctrl(ctrl);
> > else
> > return -EINVAL;
> > return count;
>
> What is the difference between fatal and reset?
nvmet_ctrl_fatal_error() also calls ctrl->ops->delete_ctrl() eventually
but also logs 'fatal error occurred'. This works also just fine for what
I had in mind.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-26 7:14 ` Hannes Reinecke
@ 2024-03-26 7:22 ` Daniel Wagner
0 siblings, 0 replies; 23+ messages in thread
From: Daniel Wagner @ 2024-03-26 7:22 UTC (permalink / raw)
To: Hannes Reinecke
Cc: Hannes Reinecke, Christoph Hellwig, Sagi Grimberg, Keith Busch,
linux-nvme, Redouane BOUFENGHOUR
On Tue, Mar 26, 2024 at 08:14:28AM +0100, Hannes Reinecke wrote:
> Weelll ... guess what the 'fatal' status does ...
> I can rename it to 'reset' if you'd like, but 'fatal' corresponds to one of
> the controller states, whereas 'reset' doesn't.
> But I can make it an alias if you really want to write 'reset' :-)
I am fine with 'fatal'.
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH 1/8] nvmet: add debugfs support
2024-03-23 20:25 ` Sagi Grimberg
@ 2024-03-26 11:55 ` Hannes Reinecke
0 siblings, 0 replies; 23+ messages in thread
From: Hannes Reinecke @ 2024-03-26 11:55 UTC (permalink / raw)
To: Sagi Grimberg, Hannes Reinecke, Christoph Hellwig
Cc: Keith Busch, linux-nvme, Redouane BOUFENGHOUR
On 3/23/24 21:25, Sagi Grimberg wrote:
>> +int nvmet_debugfs_subsys_setup(struct nvmet_subsys *subsys)
>> +{
>> + int ret = 0;
>> +
>> + subsys->debugfs_dir = debugfs_create_dir(subsys->subsysnqn,
>> + nvmet_debugfs);
>> + if (IS_ERR(subsys->debugfs_dir)) {
>> + ret = PTR_ERR(subsys->debugfs_dir);
>> + subsys->debugfs_dir = NULL;
>> + }
>> + return ret;
>> +}
>> +
>> +void nvmet_debugfs_subsys_free(struct nvmet_subsys *subsys)
>> +{
>> + debugfs_remove_recursive(subsys->debugfs_dir);
>> +}
>
> The subsys setup/free look trivial enough to just open-code
> in the call-sites.
>
> The rest looks fine to me.
Agreed for the 'free' call, the setup call has to stay as it's
referring to the static dentry 'nvmet_debugfs', which I'd like
to keep private to 'debugfs.c'.
Cheers,
Hannes
^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2024-03-26 11:56 UTC | newest]
Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-22 7:03 [PATCHv3 0/8] nvmet: debugfs support Hannes Reinecke
2024-03-22 7:03 ` [PATCH 1/8] nvmet: add " Hannes Reinecke
2024-03-23 20:25 ` Sagi Grimberg
2024-03-26 11:55 ` Hannes Reinecke
2024-03-25 18:18 ` Daniel Wagner
2024-03-25 19:22 ` Daniel Wagner
2024-03-25 22:39 ` Sagi Grimberg
2024-03-26 7:16 ` Daniel Wagner
2024-03-26 7:14 ` Hannes Reinecke
2024-03-26 7:22 ` Daniel Wagner
2024-03-22 7:03 ` [PATCH 2/8] nvmet: add 'host_traddr' callback for debugfs Hannes Reinecke
2024-03-23 20:27 ` Sagi Grimberg
2024-03-22 7:03 ` [PATCH 3/8] nvmet-tcp: implement host_traddr() Hannes Reinecke
2024-03-23 20:27 ` Sagi Grimberg
2024-03-22 7:03 ` [PATCH 4/8] nvmet-rdma: " Hannes Reinecke
2024-03-23 20:27 ` Sagi Grimberg
2024-03-22 7:03 ` [PATCH 5/8] nvmet-fc: " Hannes Reinecke
2024-03-22 7:03 ` [PATCH 6/8] nvme-fcloop: implement 'host_traddr' Hannes Reinecke
2024-03-22 7:03 ` [PATCH 7/8] lpfc_nvmet: " Hannes Reinecke
2024-03-22 7:03 ` [PATCH 8/8] nvmet: add debugfs support for queues Hannes Reinecke
2024-03-23 20:31 ` Sagi Grimberg
2024-03-25 7:25 ` Hannes Reinecke
2024-03-25 9:07 ` Sagi Grimberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).