Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2018-01-29 15:50:31 +0100
committerJiri Kosina <jkosina@suse.cz>2018-01-29 15:50:31 +0100
commit41a773ef8f4f26fb0254d50aaf5382e3de9495af (patch)
tree777cf42ab012a0bbff9465b7d09c8eefe1f10ed0
parent62f6b952e7035c14fedd28e15778ca4ef2c2fb31 (diff)
parent870ce838cb9eb6cf3c023a6c184617ff9eb8c5dc (diff)
Merge remote-tracking branch 'origin/users/jthumshirn/SLE15/for-next' into SLE15
Conflicts: series.conf
-rw-r--r--patches.drivers/nvme-add-tracepoint-for-nvme_complete_rq.patch69
-rw-r--r--patches.drivers/nvme-add-tracepoint-for-nvme_setup_cmd.patch347
-rw-r--r--series.conf4
3 files changed, 420 insertions, 0 deletions
diff --git a/patches.drivers/nvme-add-tracepoint-for-nvme_complete_rq.patch b/patches.drivers/nvme-add-tracepoint-for-nvme_complete_rq.patch
new file mode 100644
index 0000000000..794d7ea0aa
--- /dev/null
+++ b/patches.drivers/nvme-add-tracepoint-for-nvme_complete_rq.patch
@@ -0,0 +1,69 @@
+From: Johannes Thumshirn <jthumshirn@suse.de>
+Date: Fri, 26 Jan 2018 11:21:38 +0100
+Subject: nvme: add tracepoint for nvme_complete_rq
+Patch-mainline: Queued in subsystem maintainer repository
+Git-repo: git://git.infradead.org/nvme.git
+Git-commit: ca5554a696dce37852f6d6721520b4f13fc295c3
+References: FATE#323952, FATE#322506
+
+Add a tracepoint in nvme_complete_rq() for completions of NVMe commands. An
+expmale output of the trace-point is as follows:
+
+<idle>-0 [001] d.h. 3.505266: nvme_complete_rq: cmdid=989, qid=1, res=0, retries=0, flags=0x0, status=0
+
+Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
+Reviewed-by: Hannes Reinecke <hare@suse.com>
+Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
+Reviewed-by: Keith Busch <keith.busch@intel.com>
+Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+---
+ drivers/nvme/host/core.c | 2 ++
+ drivers/nvme/host/trace.h | 25 +++++++++++++++++++++++++
+ 2 files changed, 27 insertions(+)
+
+--- a/drivers/nvme/host/core.c
++++ b/drivers/nvme/host/core.c
+@@ -202,6 +202,8 @@ void nvme_complete_rq(struct request *re
+ {
+ blk_status_t status = nvme_error_status(req);
+
++ trace_nvme_complete_rq(req);
++
+ if (unlikely(status != BLK_STS_OK && nvme_req_needs_retry(req))) {
+ if (nvme_req_needs_failover(req, status)) {
+ nvme_failover_req(req);
+--- a/drivers/nvme/host/trace.h
++++ b/drivers/nvme/host/trace.h
+@@ -129,6 +129,31 @@ TRACE_EVENT(nvme_setup_nvm_cmd,
+ __parse_nvme_cmd(__entry->opcode, __entry->cdw10))
+ );
+
++TRACE_EVENT(nvme_complete_rq,
++ TP_PROTO(struct request *req),
++ TP_ARGS(req),
++ TP_STRUCT__entry(
++ __field(int, qid)
++ __field(int, cid)
++ __field(u64, result)
++ __field(u8, retries)
++ __field(u8, flags)
++ __field(u16, status)
++ ),
++ TP_fast_assign(
++ __entry->qid = req->q->id;
++ __entry->cid = req->tag;
++ __entry->result = le64_to_cpu(nvme_req(req)->result.u64);
++ __entry->retries = nvme_req(req)->retries;
++ __entry->flags = nvme_req(req)->flags;
++ __entry->status = nvme_req(req)->status;
++ ),
++ TP_printk("cmdid=%u, qid=%d, res=%llu, retries=%u, flags=0x%x, status=%u",
++ __entry->cid, __entry->qid, __entry->result,
++ __entry->retries, __entry->flags, __entry->status)
++
++);
++
+ #endif /* _TRACE_NVME_H */
+
+ #undef TRACE_INCLUDE_PATH
diff --git a/patches.drivers/nvme-add-tracepoint-for-nvme_setup_cmd.patch b/patches.drivers/nvme-add-tracepoint-for-nvme_setup_cmd.patch
new file mode 100644
index 0000000000..679a264f80
--- /dev/null
+++ b/patches.drivers/nvme-add-tracepoint-for-nvme_setup_cmd.patch
@@ -0,0 +1,347 @@
+From: Johannes Thumshirn <jthumshirn@suse.de>
+Date: Fri, 26 Jan 2018 11:21:37 +0100
+Subject: nvme: add tracepoint for nvme_setup_cmd
+Patch-mainline: Queued in subsystem maintainer repository
+Git-repo: git://git.infradead.org/nvme.git
+Git-commit: 3d030e41d96f46c14faf79f19c3cf1b9961815c8
+References: FATE#323952, FATE#322506
+
+Add tracepoints for nvme_setup_cmd() for tracing admin and/or nvm commands.
+
+Examples of the two tracepoints are as follows for trace_nvme_setup_admin_cmd():
+kworker/u8:0-5 [003] .... 2.998792: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_cq cqid=1, qsize=1023, cq_flags=0x3, irq_vector=0)
+
+and trace_nvme_setup_nvm_cmd():
+dd-205 [001] .... 3.503929: nvme_setup_nvm_cmd: qid=1, nsid=1, cmdid=989, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=4096, len=2047, ctrl=0x0, dsmgmt=0, reftag=0)
+
+Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
+Reviewed-by: Keith Busch <keith.busch@intel.com>
+Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+---
+ drivers/nvme/host/Makefile | 4 +
+ drivers/nvme/host/core.c | 7 ++
+ drivers/nvme/host/trace.c | 130 +++++++++++++++++++++++++++++++++++++++++
+ drivers/nvme/host/trace.h | 140 +++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 281 insertions(+)
+ create mode 100644 drivers/nvme/host/trace.c
+ create mode 100644 drivers/nvme/host/trace.h
+
+--- a/drivers/nvme/host/Makefile
++++ b/drivers/nvme/host/Makefile
+@@ -1,10 +1,14 @@
+ obj-$(CONFIG_NVME_CORE) += nvme-core.o
++
++ccflags-y += -I$(src)
++
+ obj-$(CONFIG_BLK_DEV_NVME) += nvme.o
+ obj-$(CONFIG_NVME_FABRICS) += nvme-fabrics.o
+ obj-$(CONFIG_NVME_RDMA) += nvme-rdma.o
+ obj-$(CONFIG_NVME_FC) += nvme-fc.o
+
+ nvme-core-y := core.o
++nvme-core-$(CONFIG_TRACING) += trace.o
+ nvme-core-$(CONFIG_NVME_MULTIPATH) += multipath.o
+ nvme-core-$(CONFIG_NVM) += lightnvm.o
+
+--- a/drivers/nvme/host/core.c
++++ b/drivers/nvme/host/core.c
+@@ -29,6 +29,9 @@
+ #include <linux/pm_qos.h>
+ #include <asm/unaligned.h>
+
++#define CREATE_TRACE_POINTS
++#include "trace.h"
++
+ #include "nvme.h"
+ #include "fabrics.h"
+
+@@ -599,6 +602,10 @@ blk_status_t nvme_setup_cmd(struct nvme_
+ }
+
+ cmd->common.command_id = req->tag;
++ if (ns)
++ trace_nvme_setup_nvm_cmd(req->q->id, cmd);
++ else
++ trace_nvme_setup_admin_cmd(cmd);
+ return ret;
+ }
+ EXPORT_SYMBOL_GPL(nvme_setup_cmd);
+--- /dev/null
++++ b/drivers/nvme/host/trace.c
+@@ -0,0 +1,130 @@
++/*
++ * NVM Express device driver tracepoints
++ * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
++ * more details.
++ */
++
++#include <asm/unaligned.h>
++#include "trace.h"
++
++static const char *nvme_trace_create_sq(struct trace_seq *p, u8 *cdw10)
++{
++ const char *ret = trace_seq_buffer_ptr(p);
++ u16 sqid = get_unaligned_le16(cdw10);
++ u16 qsize = get_unaligned_le16(cdw10 + 2);
++ u16 sq_flags = get_unaligned_le16(cdw10 + 4);
++ u16 cqid = get_unaligned_le16(cdw10 + 6);
++
++
++ trace_seq_printf(p, "sqid=%u, qsize=%u, sq_flags=0x%x, cqid=%u",
++ sqid, qsize, sq_flags, cqid);
++ trace_seq_putc(p, 0);
++
++ return ret;
++}
++
++static const char *nvme_trace_create_cq(struct trace_seq *p, u8 *cdw10)
++{
++ const char *ret = trace_seq_buffer_ptr(p);
++ u16 cqid = get_unaligned_le16(cdw10);
++ u16 qsize = get_unaligned_le16(cdw10 + 2);
++ u16 cq_flags = get_unaligned_le16(cdw10 + 4);
++ u16 irq_vector = get_unaligned_le16(cdw10 + 6);
++
++ trace_seq_printf(p, "cqid=%u, qsize=%u, cq_flags=0x%x, irq_vector=%u",
++ cqid, qsize, cq_flags, irq_vector);
++ trace_seq_putc(p, 0);
++
++ return ret;
++}
++
++static const char *nvme_trace_admin_identify(struct trace_seq *p, u8 *cdw10)
++{
++ const char *ret = trace_seq_buffer_ptr(p);
++ u8 cns = cdw10[0];
++ u16 ctrlid = get_unaligned_le16(cdw10 + 2);
++
++ trace_seq_printf(p, "cns=%u, ctrlid=%u", cns, ctrlid);
++ trace_seq_putc(p, 0);
++
++ return ret;
++}
++
++
++
++static const char *nvme_trace_read_write(struct trace_seq *p, u8 *cdw10)
++{
++ const char *ret = trace_seq_buffer_ptr(p);
++ u64 slba = get_unaligned_le64(cdw10);
++ u16 length = get_unaligned_le16(cdw10 + 8);
++ u16 control = get_unaligned_le16(cdw10 + 10);
++ u32 dsmgmt = get_unaligned_le32(cdw10 + 12);
++ u32 reftag = get_unaligned_le32(cdw10 + 16);
++
++ trace_seq_printf(p,
++ "slba=%llu, len=%u, ctrl=0x%x, dsmgmt=%u, reftag=%u",
++ slba, length, control, dsmgmt, reftag);
++ trace_seq_putc(p, 0);
++
++ return ret;
++}
++
++static const char *nvme_trace_dsm(struct trace_seq *p, u8 *cdw10)
++{
++ const char *ret = trace_seq_buffer_ptr(p);
++
++ trace_seq_printf(p, "nr=%u, attributes=%u",
++ get_unaligned_le32(cdw10),
++ get_unaligned_le32(cdw10 + 4));
++ trace_seq_putc(p, 0);
++
++ return ret;
++}
++
++static const char *nvme_trace_common(struct trace_seq *p, u8 *cdw10)
++{
++ const char *ret = trace_seq_buffer_ptr(p);
++
++ trace_seq_printf(p, "cdw10=%*ph", 24, cdw10);
++ trace_seq_putc(p, 0);
++
++ return ret;
++}
++
++const char *nvme_trace_parse_admin_cmd(struct trace_seq *p,
++ u8 opcode, u8 *cdw10)
++{
++ switch (opcode) {
++ case nvme_admin_create_sq:
++ return nvme_trace_create_sq(p, cdw10);
++ case nvme_admin_create_cq:
++ return nvme_trace_create_cq(p, cdw10);
++ case nvme_admin_identify:
++ return nvme_trace_admin_identify(p, cdw10);
++ default:
++ return nvme_trace_common(p, cdw10);
++ }
++}
++
++const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p,
++ u8 opcode, u8 *cdw10)
++{
++ switch (opcode) {
++ case nvme_cmd_read:
++ case nvme_cmd_write:
++ case nvme_cmd_write_zeroes:
++ return nvme_trace_read_write(p, cdw10);
++ case nvme_cmd_dsm:
++ return nvme_trace_dsm(p, cdw10);
++ default:
++ return nvme_trace_common(p, cdw10);
++ }
++}
+--- /dev/null
++++ b/drivers/nvme/host/trace.h
+@@ -0,0 +1,140 @@
++/*
++ * NVM Express device driver tracepoints
++ * Copyright (c) 2018 Johannes Thumshirn, SUSE Linux GmbH
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
++ * more details.
++ */
++
++#undef TRACE_SYSTEM
++#define TRACE_SYSTEM nvme
++
++#if !defined(_TRACE_NVME_H) || defined(TRACE_HEADER_MULTI_READ)
++#define _TRACE_NVME_H
++
++#include <linux/nvme.h>
++#include <linux/tracepoint.h>
++#include <linux/trace_seq.h>
++
++#include "nvme.h"
++
++#define nvme_admin_opcode_name(opcode) { opcode, #opcode }
++#define show_admin_opcode_name(val) \
++ __print_symbolic(val, \
++ nvme_admin_opcode_name(nvme_admin_delete_sq), \
++ nvme_admin_opcode_name(nvme_admin_create_sq), \
++ nvme_admin_opcode_name(nvme_admin_get_log_page), \
++ nvme_admin_opcode_name(nvme_admin_delete_cq), \
++ nvme_admin_opcode_name(nvme_admin_create_cq), \
++ nvme_admin_opcode_name(nvme_admin_identify), \
++ nvme_admin_opcode_name(nvme_admin_abort_cmd), \
++ nvme_admin_opcode_name(nvme_admin_set_features), \
++ nvme_admin_opcode_name(nvme_admin_get_features), \
++ nvme_admin_opcode_name(nvme_admin_async_event), \
++ nvme_admin_opcode_name(nvme_admin_ns_mgmt), \
++ nvme_admin_opcode_name(nvme_admin_activate_fw), \
++ nvme_admin_opcode_name(nvme_admin_download_fw), \
++ nvme_admin_opcode_name(nvme_admin_ns_attach), \
++ nvme_admin_opcode_name(nvme_admin_keep_alive), \
++ nvme_admin_opcode_name(nvme_admin_directive_send), \
++ nvme_admin_opcode_name(nvme_admin_directive_recv), \
++ nvme_admin_opcode_name(nvme_admin_dbbuf), \
++ nvme_admin_opcode_name(nvme_admin_format_nvm), \
++ nvme_admin_opcode_name(nvme_admin_security_send), \
++ nvme_admin_opcode_name(nvme_admin_security_recv), \
++ nvme_admin_opcode_name(nvme_admin_sanitize_nvm))
++
++const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, u8 opcode,
++ u8 *cdw10);
++#define __parse_nvme_admin_cmd(opcode, cdw10) \
++ nvme_trace_parse_admin_cmd(p, opcode, cdw10)
++
++#define nvme_opcode_name(opcode) { opcode, #opcode }
++#define show_opcode_name(val) \
++ __print_symbolic(val, \
++ nvme_opcode_name(nvme_cmd_flush), \
++ nvme_opcode_name(nvme_cmd_write), \
++ nvme_opcode_name(nvme_cmd_read), \
++ nvme_opcode_name(nvme_cmd_write_uncor), \
++ nvme_opcode_name(nvme_cmd_compare), \
++ nvme_opcode_name(nvme_cmd_write_zeroes), \
++ nvme_opcode_name(nvme_cmd_dsm), \
++ nvme_opcode_name(nvme_cmd_resv_register), \
++ nvme_opcode_name(nvme_cmd_resv_report), \
++ nvme_opcode_name(nvme_cmd_resv_acquire), \
++ nvme_opcode_name(nvme_cmd_resv_release))
++
++const char *nvme_trace_parse_nvm_cmd(struct trace_seq *p, u8 opcode,
++ u8 *cdw10);
++#define __parse_nvme_cmd(opcode, cdw10) \
++ nvme_trace_parse_nvm_cmd(p, opcode, cdw10)
++
++TRACE_EVENT(nvme_setup_admin_cmd,
++ TP_PROTO(struct nvme_command *cmd),
++ TP_ARGS(cmd),
++ TP_STRUCT__entry(
++ __field(u8, opcode)
++ __field(u8, flags)
++ __field(u16, cid)
++ __field(u64, metadata)
++ __array(u8, cdw10, 24)
++ ),
++ TP_fast_assign(
++ __entry->opcode = cmd->common.opcode;
++ __entry->flags = cmd->common.flags;
++ __entry->cid = cmd->common.command_id;
++ __entry->metadata = le64_to_cpu(cmd->common.metadata);
++ memcpy(__entry->cdw10, cmd->common.cdw10,
++ sizeof(__entry->cdw10));
++ ),
++ TP_printk(" cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
++ __entry->cid, __entry->flags, __entry->metadata,
++ show_admin_opcode_name(__entry->opcode),
++ __parse_nvme_admin_cmd(__entry->opcode, __entry->cdw10))
++);
++
++
++TRACE_EVENT(nvme_setup_nvm_cmd,
++ TP_PROTO(int qid, struct nvme_command *cmd),
++ TP_ARGS(qid, cmd),
++ TP_STRUCT__entry(
++ __field(int, qid)
++ __field(u8, opcode)
++ __field(u8, flags)
++ __field(u16, cid)
++ __field(u32, nsid)
++ __field(u64, metadata)
++ __array(u8, cdw10, 24)
++ ),
++ TP_fast_assign(
++ __entry->qid = qid;
++ __entry->opcode = cmd->common.opcode;
++ __entry->flags = cmd->common.flags;
++ __entry->cid = cmd->common.command_id;
++ __entry->nsid = le32_to_cpu(cmd->common.nsid);
++ __entry->metadata = le64_to_cpu(cmd->common.metadata);
++ memcpy(__entry->cdw10, cmd->common.cdw10,
++ sizeof(__entry->cdw10));
++ ),
++ TP_printk("qid=%d, nsid=%u, cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)",
++ __entry->qid, __entry->nsid, __entry->cid,
++ __entry->flags, __entry->metadata,
++ show_opcode_name(__entry->opcode),
++ __parse_nvme_cmd(__entry->opcode, __entry->cdw10))
++);
++
++#endif /* _TRACE_NVME_H */
++
++#undef TRACE_INCLUDE_PATH
++#define TRACE_INCLUDE_PATH .
++#undef TRACE_INCLUDE_FILE
++#define TRACE_INCLUDE_FILE trace
++
++/* This part must be outside protection */
++#include <trace/define_trace.h>
diff --git a/series.conf b/series.conf
index c0e76656ea..a611d55e34 100644
--- a/series.conf
+++ b/series.conf
@@ -6679,6 +6679,8 @@
patches.drivers/ibmvnic-Fix-IP-offload-control-buffer.patch
patches.drivers/ibmvnic-Fix-IPv6-packet-descriptors.patch
patches.drivers/net-mlx5e-Fix-fixpoint-divide-exception-in-mlx5e_am_.patch
+
+ # davem/net
patches.drivers/ibmvnic-Modify-buffer-size-and-number-of-queues-on-f.patch
patches.drivers/ibmvnic-Revert-to-previous-mtu-when-unsupported-valu.patch
patches.drivers/ibmvnic-Allocate-and-request-vpd-in-init_resources.patch
@@ -6755,6 +6757,8 @@
patches.drivers/block-Provide-blk_status_t-decoding-for-path-errors.patch
patches.drivers/nvme-multipath-Use-blk_path_error.patch
patches.drivers/dm-mpath-Use-blk_path_error.patch
+ patches.drivers/nvme-add-tracepoint-for-nvme_setup_cmd.patch
+ patches.drivers/nvme-add-tracepoint-for-nvme_complete_rq.patch
# out-of-tree patches
patches.drivers/s390-sles15-00-04-04-kmsg-add-VNIC-Characteristics-msg-documentation.patch