* [PATCH v5 0/2] add tracepoints for nvme command submission and completion
@ 2018-01-23 10:56 ` Johannes Thumshirn
0 siblings, 0 replies; 16+ messages in thread
From: Johannes Thumshirn @ 2018-01-23 10:56 UTC (permalink / raw)
Add tracepoints for nvme command submission and completion. The tracepoints
are modeled after SCSI's trace_scsi_dispatch_cmd_start() and
trace_scsi_dispatch_cmd_done() tracepoints and fulfil a similar purpose,
namely a fast way to check which command is going to be queued into the HW or
Fabric driver and which command is completed again.
Here's an example output using the qemu emulated pci nvme:
# tracer: nop
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
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)
<idle>-0 [003] d.h. 2.998866: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 2.998872: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=1, qsize=1023, sq_flags=0x1, cqid=1)
<idle>-0 [003] d.h. 2.999050: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 2.999059: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_cq cqid=2, qsize=1023, cq_flags=0x3, irq_vector=1)
<idle>-0 [003] d.h. 2.999102: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 2.999105: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=2, qsize=1023, sq_flags=0x1, cqid=2)
<idle>-0 [003] d.h. 2.999218: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 2.999266: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_cq cqid=3, qsize=1023, cq_flags=0x3, irq_vector=2)
<idle>-0 [003] d.h. 2.999305: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 2.999308: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=3, qsize=1023, sq_flags=0x1, cqid=3)
<idle>-0 [003] d.h. 2.999427: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 2.999472: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_cq cqid=4, qsize=1023, cq_flags=0x3, irq_vector=3)
<idle>-0 [003] d.h. 2.999504: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 2.999507: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=4, qsize=1023, sq_flags=0x1, cqid=4)
<idle>-0 [003] d.h. 2.999626: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 3.000677: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_identify cns=0, ctrlid=1)
<idle>-0 [003] d.h. 3.000746: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .N.. 3.000802: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_identify cns=0, ctrlid=0)
<idle>-0 [003] d.h. 3.000843: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 3.000979: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_identify cns=0, ctrlid=0)
<idle>-0 [003] d.h. 3.001020: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 3.001064: nvme_setup_nvm_cmd: nsid=1, cmdid=830, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=0, len=7, ctrl=0x0, dsmgmt=0, reftag=0)
<idle>-0 [003] d.h. 3.001218: nvme_complete_rq: cmdid=830, qid=1, res=0, retries=0, flags=0x0, status=0
kworker/u8:0-5 [003] .... 3.001245: nvme_setup_nvm_cmd: nsid=1, cmdid=830, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=24, len=7, ctrl=0x0, dsmgmt=0, reftag=0)
<idle>-0 [003] d.h. 3.001302: nvme_complete_rq: cmdid=830, qid=1, res=0, retries=0, flags=0x0, status=0
dd-205 [001] .... 3.500869: nvme_setup_nvm_cmd: nsid=1, cmdid=988, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=0, len=2559, ctrl=0x0, dsmgmt=0, reftag=0)
dd-205 [001] .... 3.501764: nvme_setup_nvm_cmd: nsid=1, cmdid=989, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=2560, len=1535, ctrl=0x0, dsmgmt=0, reftag=0)
<idle>-0 [001] d.h. 3.502925: nvme_complete_rq: cmdid=988, qid=1, res=0, retries=0, flags=0x0, status=0
<idle>-0 [001] d.h. 3.503256: nvme_complete_rq: cmdid=989, qid=1, res=0, retries=0, flags=0x0, status=0
dd-205 [001] .... 3.503929: nvme_setup_nvm_cmd: nsid=1, cmdid=989, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=4096, len=2047, ctrl=0x0, dsmgmt=0, reftag=0)
dd-205 [001] .... 3.504240: nvme_setup_nvm_cmd: nsid=1, cmdid=990, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=6144, len=2047, ctrl=0x0, dsmgmt=0, reftag=0)
<idle>-0 [001] d.h. 3.505266: nvme_complete_rq: cmdid=989, qid=1, res=0, retries=0, flags=0x0, status=0
dd-205 [001] .... 3.505711: nvme_setup_nvm_cmd: nsid=1, cmdid=989, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=8192, len=2047, ctrl=0x0, dsmgmt=0, reftag=0)
<idle>-0 [001] d.h. 3.505850: nvme_complete_rq: cmdid=990, qid=1, res=0, retries=0, flags=0x0, status=0
dd-205 [001] .... 3.506202: nvme_setup_nvm_cmd: nsid=1, cmdid=990, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=10240, len=2047, ctrl=0x0, dsmgmt=0, reftag=0)
<idle>-0 [001] d.H. 3.507158: nvme_complete_rq: cmdid=989, qid=1, res=0, retries=0, flags=0x0, status=0
dd-205 [001] d.h. 3.507650: nvme_complete_rq: cmdid=990, qid=1, res=0, retries=0, flags=0x0, status=0
dd-206 [000] .... 3.515159: nvme_setup_nvm_cmd: nsid=1, cmdid=853, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=0, len=2559, ctrl=0x0, dsmgmt=0, reftag=0)
dd-206 [000] .... 3.515626: nvme_setup_nvm_cmd: nsid=1, cmdid=854, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=2560, len=2559, ctrl=0x0, dsmgmt=0, reftag=0)
dd-206 [000] .... 3.516093: nvme_setup_nvm_cmd: nsid=1, cmdid=855, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=5120, len=2559, ctrl=0x0, dsmgmt=0, reftag=0)
dd-206 [000] .... 3.516529: nvme_setup_nvm_cmd: nsid=1, cmdid=856, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=7680, len=2559, ctrl=0x0, dsmgmt=0, reftag=0)
<idle>-0 [000] d.h. 3.516865: nvme_complete_rq: cmdid=853, qid=1, res=0, retries=0, flags=0x0, status=0
<idle>-0 [000] d.h. 3.517744: nvme_complete_rq: cmdid=854, qid=1, res=0, retries=0, flags=0x0, status=0
<idle>-0 [000] d.h. 3.518581: nvme_complete_rq: cmdid=856, qid=1, res=0, retries=0, flags=0x0, status=0
<idle>-0 [000] d.h. 3.519480: nvme_complete_rq: cmdid=855, qid=1, res=0, retries=0, flags=0x0, status=0
Johannes Thumshirn (2):
nvme: add tracepoint for nvme_setup_cmd
nvme: add tracepoint for nvme_complete_rq
drivers/nvme/host/Makefile | 4 ++
drivers/nvme/host/core.c | 9 +++
drivers/nvme/host/trace.c | 131 +++++++++++++++++++++++++++++++++++
drivers/nvme/host/trace.h | 165 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 309 insertions(+)
create mode 100644 drivers/nvme/host/trace.c
create mode 100644 drivers/nvme/host/trace.h
--
2.12.3
^ permalink raw reply [flat|nested] 16+ messages in thread* [PATCH v5 0/2] add tracepoints for nvme command submission and completion @ 2018-01-23 10:56 ` Johannes Thumshirn 0 siblings, 0 replies; 16+ messages in thread From: Johannes Thumshirn @ 2018-01-23 10:56 UTC (permalink / raw) To: Christoph Hellwig Cc: Sagi Grimberg, Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist, Martin K . Petersen, Johannes Thumshirn Add tracepoints for nvme command submission and completion. The tracepoints are modeled after SCSI's trace_scsi_dispatch_cmd_start() and trace_scsi_dispatch_cmd_done() tracepoints and fulfil a similar purpose, namely a fast way to check which command is going to be queued into the HW or Fabric driver and which command is completed again. Here's an example output using the qemu emulated pci nvme: # tracer: nop # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | 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) <idle>-0 [003] d.h. 2.998866: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 2.998872: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=1, qsize=1023, sq_flags=0x1, cqid=1) <idle>-0 [003] d.h. 2.999050: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 2.999059: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_cq cqid=2, qsize=1023, cq_flags=0x3, irq_vector=1) <idle>-0 [003] d.h. 2.999102: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 2.999105: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=2, qsize=1023, sq_flags=0x1, cqid=2) <idle>-0 [003] d.h. 2.999218: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 2.999266: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_cq cqid=3, qsize=1023, cq_flags=0x3, irq_vector=2) <idle>-0 [003] d.h. 2.999305: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 2.999308: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=3, qsize=1023, sq_flags=0x1, cqid=3) <idle>-0 [003] d.h. 2.999427: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 2.999472: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_cq cqid=4, qsize=1023, cq_flags=0x3, irq_vector=3) <idle>-0 [003] d.h. 2.999504: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 2.999507: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_create_sq sqid=4, qsize=1023, sq_flags=0x1, cqid=4) <idle>-0 [003] d.h. 2.999626: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 3.000677: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_identify cns=0, ctrlid=1) <idle>-0 [003] d.h. 3.000746: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .N.. 3.000802: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_identify cns=0, ctrlid=0) <idle>-0 [003] d.h. 3.000843: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 3.000979: nvme_setup_admin_cmd: cmdid=14, flags=0x0, meta=0x0, cmd=(nvme_admin_identify cns=0, ctrlid=0) <idle>-0 [003] d.h. 3.001020: nvme_complete_rq: cmdid=14, qid=0, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 3.001064: nvme_setup_nvm_cmd: nsid=1, cmdid=830, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=0, len=7, ctrl=0x0, dsmgmt=0, reftag=0) <idle>-0 [003] d.h. 3.001218: nvme_complete_rq: cmdid=830, qid=1, res=0, retries=0, flags=0x0, status=0 kworker/u8:0-5 [003] .... 3.001245: nvme_setup_nvm_cmd: nsid=1, cmdid=830, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=24, len=7, ctrl=0x0, dsmgmt=0, reftag=0) <idle>-0 [003] d.h. 3.001302: nvme_complete_rq: cmdid=830, qid=1, res=0, retries=0, flags=0x0, status=0 dd-205 [001] .... 3.500869: nvme_setup_nvm_cmd: nsid=1, cmdid=988, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=0, len=2559, ctrl=0x0, dsmgmt=0, reftag=0) dd-205 [001] .... 3.501764: nvme_setup_nvm_cmd: nsid=1, cmdid=989, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=2560, len=1535, ctrl=0x0, dsmgmt=0, reftag=0) <idle>-0 [001] d.h. 3.502925: nvme_complete_rq: cmdid=988, qid=1, res=0, retries=0, flags=0x0, status=0 <idle>-0 [001] d.h. 3.503256: nvme_complete_rq: cmdid=989, qid=1, res=0, retries=0, flags=0x0, status=0 dd-205 [001] .... 3.503929: nvme_setup_nvm_cmd: nsid=1, cmdid=989, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=4096, len=2047, ctrl=0x0, dsmgmt=0, reftag=0) dd-205 [001] .... 3.504240: nvme_setup_nvm_cmd: nsid=1, cmdid=990, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=6144, len=2047, ctrl=0x0, dsmgmt=0, reftag=0) <idle>-0 [001] d.h. 3.505266: nvme_complete_rq: cmdid=989, qid=1, res=0, retries=0, flags=0x0, status=0 dd-205 [001] .... 3.505711: nvme_setup_nvm_cmd: nsid=1, cmdid=989, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=8192, len=2047, ctrl=0x0, dsmgmt=0, reftag=0) <idle>-0 [001] d.h. 3.505850: nvme_complete_rq: cmdid=990, qid=1, res=0, retries=0, flags=0x0, status=0 dd-205 [001] .... 3.506202: nvme_setup_nvm_cmd: nsid=1, cmdid=990, flags=0x0, meta=0x0, cmd=(nvme_cmd_read slba=10240, len=2047, ctrl=0x0, dsmgmt=0, reftag=0) <idle>-0 [001] d.H. 3.507158: nvme_complete_rq: cmdid=989, qid=1, res=0, retries=0, flags=0x0, status=0 dd-205 [001] d.h. 3.507650: nvme_complete_rq: cmdid=990, qid=1, res=0, retries=0, flags=0x0, status=0 dd-206 [000] .... 3.515159: nvme_setup_nvm_cmd: nsid=1, cmdid=853, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=0, len=2559, ctrl=0x0, dsmgmt=0, reftag=0) dd-206 [000] .... 3.515626: nvme_setup_nvm_cmd: nsid=1, cmdid=854, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=2560, len=2559, ctrl=0x0, dsmgmt=0, reftag=0) dd-206 [000] .... 3.516093: nvme_setup_nvm_cmd: nsid=1, cmdid=855, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=5120, len=2559, ctrl=0x0, dsmgmt=0, reftag=0) dd-206 [000] .... 3.516529: nvme_setup_nvm_cmd: nsid=1, cmdid=856, flags=0x0, meta=0x0, cmd=(nvme_cmd_write slba=7680, len=2559, ctrl=0x0, dsmgmt=0, reftag=0) <idle>-0 [000] d.h. 3.516865: nvme_complete_rq: cmdid=853, qid=1, res=0, retries=0, flags=0x0, status=0 <idle>-0 [000] d.h. 3.517744: nvme_complete_rq: cmdid=854, qid=1, res=0, retries=0, flags=0x0, status=0 <idle>-0 [000] d.h. 3.518581: nvme_complete_rq: cmdid=856, qid=1, res=0, retries=0, flags=0x0, status=0 <idle>-0 [000] d.h. 3.519480: nvme_complete_rq: cmdid=855, qid=1, res=0, retries=0, flags=0x0, status=0 Johannes Thumshirn (2): nvme: add tracepoint for nvme_setup_cmd nvme: add tracepoint for nvme_complete_rq drivers/nvme/host/Makefile | 4 ++ drivers/nvme/host/core.c | 9 +++ drivers/nvme/host/trace.c | 131 +++++++++++++++++++++++++++++++++++ drivers/nvme/host/trace.h | 165 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 309 insertions(+) create mode 100644 drivers/nvme/host/trace.c create mode 100644 drivers/nvme/host/trace.h -- 2.12.3 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd 2018-01-23 10:56 ` Johannes Thumshirn @ 2018-01-23 10:56 ` Johannes Thumshirn -1 siblings, 0 replies; 16+ messages in thread From: Johannes Thumshirn @ 2018-01-23 10:56 UTC (permalink / raw) 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: 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 at suse.de> Reviewed-by: Hannes Reinecke <hare at suse.de> Reviewed-by: Martin K. Petersen <martin.petersen at oracle.com> Reviewed-by: Keith Busch <keith.busch at intel.com> --- Changes to v4: * Split trace function into two for admin and nvm cmds (Christoph) * Remove structures for commands and decode as needed (Christoph) * Add proper Changelog (Christoph) * Don't decode NS ID for admin commands Changes to v3: * Only build trace.o when CONFIG_TRACE=y (Christoph) * Only copy non-common command fields to trace decoder (Christoph) * Merge write_zeros decoder into rw decoder * Don't decode admin commands as I/O commands Changes to v2: * Don't cast le64_to_cpu() conversions to unsigned long long (Christoph) * Add proper copyright header (Christoph) * Move trace decoding into own file (Christoph) * Include the src directory in the Makefile for trace (Christoph) * Removed spaces before and after parenthesis (Christoph) * Reduced print lines to fit the 80 char limit (Christoph) Changes to v1: * Fix typo (Hannes) * move include/trace/events/nvme.h -> drivers/nvme/host/trace.h (Christoph) --- --- drivers/nvme/host/Makefile | 4 ++ drivers/nvme/host/core.c | 7 +++ drivers/nvme/host/trace.c | 131 ++++++++++++++++++++++++++++++++++++++++++ drivers/nvme/host/trace.h | 139 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 281 insertions(+) create mode 100644 drivers/nvme/host/trace.c create mode 100644 drivers/nvme/host/trace.h diff --git a/drivers/nvme/host/Makefile b/drivers/nvme/host/Makefile index a25fd43650ad..441e67e3a9d7 100644 --- a/drivers/nvme/host/Makefile +++ b/drivers/nvme/host/Makefile @@ -1,4 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 + +ccflags-y += -I$(src) + obj-$(CONFIG_NVME_CORE) += nvme-core.o obj-$(CONFIG_BLK_DEV_NVME) += nvme.o obj-$(CONFIG_NVME_FABRICS) += nvme-fabrics.o @@ -6,6 +9,7 @@ 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 diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 839650e0926a..7b60a828fe01 100644 --- 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" @@ -591,6 +594,10 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req, } cmd->common.command_id = req->tag; + if (ns) + trace_nvme_setup_nvm_cmd(cmd); + else + trace_nvme_setup_admin_cmd(cmd); return ret; } EXPORT_SYMBOL_GPL(nvme_setup_cmd); diff --git a/drivers/nvme/host/trace.c b/drivers/nvme/host/trace.c new file mode 100644 index 000000000000..87beb77dcc6c --- /dev/null +++ b/drivers/nvme/host/trace.c @@ -0,0 +1,131 @@ +/* + * 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 "trace.h" + +static const char *nvme_trace_create_sq(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __le16 qsize = cdw10[0] >> 16; + __le16 sqid = cdw10[0] & 0xffff; + __le16 cqid = cdw10[1] >> 16; + __le16 sq_flags = cdw10[1] & 0xffff; + + trace_seq_printf(p, "sqid=%u, qsize=%u, sq_flags=0x%x, cqid=%u", + le16_to_cpu(sqid), le16_to_cpu(qsize), + le16_to_cpu(sq_flags), le16_to_cpu(cqid)); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_create_cq(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __le16 qsize = cdw10[0] >> 16; + __le16 cqid = cdw10[0] & 0xffff; + __le16 irq_vector = cdw10[1] >> 16; + __le16 cq_flags = cdw10[1] & 0xffff; + + trace_seq_printf(p, "cqid=%u, qsize=%u, cq_flags=0x%x, irq_vector=%u", + le16_to_cpu(cqid), le16_to_cpu(qsize), + le16_to_cpu(cq_flags), le16_to_cpu(irq_vector)); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_admin_identify(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __u8 cns = (cdw10[0] >> 24) & 0xff; + __le16 ctrlid = cdw10[0] & 0xffff; + + trace_seq_printf(p, "cns=%u, ctrlid=%u", cns, le16_to_cpu(ctrlid)); + trace_seq_putc(p, 0); + + return ret; +} + + + +static const char *nvme_trace_read_write(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __le64 slba = ((u64)cdw10[1] << 32) | cdw10[0]; + __le16 control = cdw10[2] >> 16; + __le16 length = cdw10[2] & 0xffff; + __le32 dsmgmt = cdw10[3]; + __le32 reftag = cdw10[4]; + + trace_seq_printf(p, + "slba=%llu, len=%u, ctrl=0x%x, dsmgmt=%u, reftag=%u", + le64_to_cpu(slba), le16_to_cpu(length), + le16_to_cpu(control), le32_to_cpu(dsmgmt), + le32_to_cpu(reftag)); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_dsm(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + + trace_seq_printf(p, "nr=%u, attributes=%u", + le32_to_cpu(cdw10[0]), le32_to_cpu(cdw10[1])); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_common(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + + trace_seq_printf(p, "cdw10=%*ph", 6, cdw10); + trace_seq_putc(p, 0); + + return ret; +} + +const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, + u8 opcode, __le32 *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, __le32 *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); + } +} diff --git a/drivers/nvme/host/trace.h b/drivers/nvme/host/trace.h new file mode 100644 index 000000000000..5e5c2de7a43e --- /dev/null +++ b/drivers/nvme/host/trace.h @@ -0,0 +1,139 @@ +/* + * 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, + __le32 *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, + __le32 *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(__le64, metadata) + __array(__le32, cdw10, 6) + ), + TP_fast_assign( + __entry->opcode = cmd->common.opcode; + __entry->flags = cmd->common.flags; + __entry->cid = cmd->common.command_id; + __entry->metadata = 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, + le64_to_cpu(__entry->metadata), + show_admin_opcode_name(__entry->opcode), + __parse_nvme_admin_cmd(__entry->opcode, __entry->cdw10)) +); + + +TRACE_EVENT(nvme_setup_nvm_cmd, + TP_PROTO(struct nvme_command *cmd), + TP_ARGS(cmd), + TP_STRUCT__entry( + __field(__u8, opcode) + __field(__u8, flags) + __field(__u16, cid) + __field(__le32, nsid) + __field(__le64, metadata) + __array(__le32, cdw10, 6) + ), + TP_fast_assign( + __entry->opcode = cmd->common.opcode; + __entry->flags = cmd->common.flags; + __entry->cid = cmd->common.command_id; + __entry->nsid = cmd->common.nsid; + __entry->metadata = cmd->common.metadata; + memcpy(__entry->cdw10, cmd->common.cdw10, + sizeof(__entry->cdw10)); + ), + TP_printk("nsid=%u, cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)", + le32_to_cpu(__entry->nsid), __entry->cid, __entry->flags, + le64_to_cpu(__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> -- 2.12.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd @ 2018-01-23 10:56 ` Johannes Thumshirn 0 siblings, 0 replies; 16+ messages in thread From: Johannes Thumshirn @ 2018-01-23 10:56 UTC (permalink / raw) To: Christoph Hellwig Cc: Sagi Grimberg, Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist, Martin K . Petersen, Johannes Thumshirn 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: 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> --- Changes to v4: * Split trace function into two for admin and nvm cmds (Christoph) * Remove structures for commands and decode as needed (Christoph) * Add proper Changelog (Christoph) * Don't decode NS ID for admin commands Changes to v3: * Only build trace.o when CONFIG_TRACE=y (Christoph) * Only copy non-common command fields to trace decoder (Christoph) * Merge write_zeros decoder into rw decoder * Don't decode admin commands as I/O commands Changes to v2: * Don't cast le64_to_cpu() conversions to unsigned long long (Christoph) * Add proper copyright header (Christoph) * Move trace decoding into own file (Christoph) * Include the src directory in the Makefile for trace (Christoph) * Removed spaces before and after parenthesis (Christoph) * Reduced print lines to fit the 80 char limit (Christoph) Changes to v1: * Fix typo (Hannes) * move include/trace/events/nvme.h -> drivers/nvme/host/trace.h (Christoph) --- --- drivers/nvme/host/Makefile | 4 ++ drivers/nvme/host/core.c | 7 +++ drivers/nvme/host/trace.c | 131 ++++++++++++++++++++++++++++++++++++++++++ drivers/nvme/host/trace.h | 139 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 281 insertions(+) create mode 100644 drivers/nvme/host/trace.c create mode 100644 drivers/nvme/host/trace.h diff --git a/drivers/nvme/host/Makefile b/drivers/nvme/host/Makefile index a25fd43650ad..441e67e3a9d7 100644 --- a/drivers/nvme/host/Makefile +++ b/drivers/nvme/host/Makefile @@ -1,4 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 + +ccflags-y += -I$(src) + obj-$(CONFIG_NVME_CORE) += nvme-core.o obj-$(CONFIG_BLK_DEV_NVME) += nvme.o obj-$(CONFIG_NVME_FABRICS) += nvme-fabrics.o @@ -6,6 +9,7 @@ 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 diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 839650e0926a..7b60a828fe01 100644 --- 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" @@ -591,6 +594,10 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req, } cmd->common.command_id = req->tag; + if (ns) + trace_nvme_setup_nvm_cmd(cmd); + else + trace_nvme_setup_admin_cmd(cmd); return ret; } EXPORT_SYMBOL_GPL(nvme_setup_cmd); diff --git a/drivers/nvme/host/trace.c b/drivers/nvme/host/trace.c new file mode 100644 index 000000000000..87beb77dcc6c --- /dev/null +++ b/drivers/nvme/host/trace.c @@ -0,0 +1,131 @@ +/* + * 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 "trace.h" + +static const char *nvme_trace_create_sq(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __le16 qsize = cdw10[0] >> 16; + __le16 sqid = cdw10[0] & 0xffff; + __le16 cqid = cdw10[1] >> 16; + __le16 sq_flags = cdw10[1] & 0xffff; + + trace_seq_printf(p, "sqid=%u, qsize=%u, sq_flags=0x%x, cqid=%u", + le16_to_cpu(sqid), le16_to_cpu(qsize), + le16_to_cpu(sq_flags), le16_to_cpu(cqid)); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_create_cq(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __le16 qsize = cdw10[0] >> 16; + __le16 cqid = cdw10[0] & 0xffff; + __le16 irq_vector = cdw10[1] >> 16; + __le16 cq_flags = cdw10[1] & 0xffff; + + trace_seq_printf(p, "cqid=%u, qsize=%u, cq_flags=0x%x, irq_vector=%u", + le16_to_cpu(cqid), le16_to_cpu(qsize), + le16_to_cpu(cq_flags), le16_to_cpu(irq_vector)); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_admin_identify(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __u8 cns = (cdw10[0] >> 24) & 0xff; + __le16 ctrlid = cdw10[0] & 0xffff; + + trace_seq_printf(p, "cns=%u, ctrlid=%u", cns, le16_to_cpu(ctrlid)); + trace_seq_putc(p, 0); + + return ret; +} + + + +static const char *nvme_trace_read_write(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + __le64 slba = ((u64)cdw10[1] << 32) | cdw10[0]; + __le16 control = cdw10[2] >> 16; + __le16 length = cdw10[2] & 0xffff; + __le32 dsmgmt = cdw10[3]; + __le32 reftag = cdw10[4]; + + trace_seq_printf(p, + "slba=%llu, len=%u, ctrl=0x%x, dsmgmt=%u, reftag=%u", + le64_to_cpu(slba), le16_to_cpu(length), + le16_to_cpu(control), le32_to_cpu(dsmgmt), + le32_to_cpu(reftag)); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_dsm(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + + trace_seq_printf(p, "nr=%u, attributes=%u", + le32_to_cpu(cdw10[0]), le32_to_cpu(cdw10[1])); + trace_seq_putc(p, 0); + + return ret; +} + +static const char *nvme_trace_common(struct trace_seq *p, __le32 *cdw10) +{ + const char *ret = trace_seq_buffer_ptr(p); + + trace_seq_printf(p, "cdw10=%*ph", 6, cdw10); + trace_seq_putc(p, 0); + + return ret; +} + +const char *nvme_trace_parse_admin_cmd(struct trace_seq *p, + u8 opcode, __le32 *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, __le32 *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); + } +} diff --git a/drivers/nvme/host/trace.h b/drivers/nvme/host/trace.h new file mode 100644 index 000000000000..5e5c2de7a43e --- /dev/null +++ b/drivers/nvme/host/trace.h @@ -0,0 +1,139 @@ +/* + * 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, + __le32 *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, + __le32 *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(__le64, metadata) + __array(__le32, cdw10, 6) + ), + TP_fast_assign( + __entry->opcode = cmd->common.opcode; + __entry->flags = cmd->common.flags; + __entry->cid = cmd->common.command_id; + __entry->metadata = 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, + le64_to_cpu(__entry->metadata), + show_admin_opcode_name(__entry->opcode), + __parse_nvme_admin_cmd(__entry->opcode, __entry->cdw10)) +); + + +TRACE_EVENT(nvme_setup_nvm_cmd, + TP_PROTO(struct nvme_command *cmd), + TP_ARGS(cmd), + TP_STRUCT__entry( + __field(__u8, opcode) + __field(__u8, flags) + __field(__u16, cid) + __field(__le32, nsid) + __field(__le64, metadata) + __array(__le32, cdw10, 6) + ), + TP_fast_assign( + __entry->opcode = cmd->common.opcode; + __entry->flags = cmd->common.flags; + __entry->cid = cmd->common.command_id; + __entry->nsid = cmd->common.nsid; + __entry->metadata = cmd->common.metadata; + memcpy(__entry->cdw10, cmd->common.cdw10, + sizeof(__entry->cdw10)); + ), + TP_printk("nsid=%u, cmdid=%u, flags=0x%x, meta=0x%llx, cmd=(%s %s)", + le32_to_cpu(__entry->nsid), __entry->cid, __entry->flags, + le64_to_cpu(__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> -- 2.12.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd 2018-01-23 10:56 ` Johannes Thumshirn @ 2018-01-23 12:43 ` Sagi Grimberg -1 siblings, 0 replies; 16+ messages in thread From: Sagi Grimberg @ 2018-01-23 12:43 UTC (permalink / raw) Looks good Johannes, Reviewed-by: Sagi Grimberg <sagi at grimberg.me> ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd @ 2018-01-23 12:43 ` Sagi Grimberg 0 siblings, 0 replies; 16+ messages in thread From: Sagi Grimberg @ 2018-01-23 12:43 UTC (permalink / raw) To: Johannes Thumshirn, Christoph Hellwig Cc: Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist, Martin K . Petersen Looks good Johannes, Reviewed-by: Sagi Grimberg <sagi@grimberg.me> ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd 2018-01-23 10:56 ` Johannes Thumshirn @ 2018-01-23 12:46 ` Christoph Hellwig -1 siblings, 0 replies; 16+ messages in thread From: Christoph Hellwig @ 2018-01-23 12:46 UTC (permalink / raw) Seems like this is still missing the qid in the tracepoint, as it only got added to the completion side. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd @ 2018-01-23 12:46 ` Christoph Hellwig 0 siblings, 0 replies; 16+ messages in thread From: Christoph Hellwig @ 2018-01-23 12:46 UTC (permalink / raw) To: Johannes Thumshirn Cc: Christoph Hellwig, Sagi Grimberg, Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist, Martin K . Petersen Seems like this is still missing the qid in the tracepoint, as it only got added to the completion side. ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd 2018-01-23 12:46 ` Christoph Hellwig @ 2018-01-23 13:31 ` Martin K. Petersen -1 siblings, 0 replies; 16+ messages in thread From: Martin K. Petersen @ 2018-01-23 13:31 UTC (permalink / raw) Christoph, > Seems like this is still missing the qid in the tracepoint, as it only > got added to the completion side. Yup, noticed the same thing. -- Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd @ 2018-01-23 13:31 ` Martin K. Petersen 0 siblings, 0 replies; 16+ messages in thread From: Martin K. Petersen @ 2018-01-23 13:31 UTC (permalink / raw) To: Christoph Hellwig Cc: Johannes Thumshirn, Sagi Grimberg, Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist, Martin K . Petersen Christoph, > Seems like this is still missing the qid in the tracepoint, as it only > got added to the completion side. Yup, noticed the same thing. -- Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd 2018-01-23 13:31 ` Martin K. Petersen @ 2018-01-23 13:35 ` Johannes Thumshirn -1 siblings, 0 replies; 16+ messages in thread From: Johannes Thumshirn @ 2018-01-23 13:35 UTC (permalink / raw) On Tue, Jan 23, 2018@08:31:50AM -0500, Martin K. Petersen wrote: > > Christoph, > > > Seems like this is still missing the qid in the tracepoint, as it only > > got added to the completion side. > > Yup, noticed the same thing. Yep already fixed and about to send out the fixed version if no one as any further comments. -- Johannes Thumshirn Storage jthumshirn at suse.de +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N?rnberg GF: Felix Imend?rffer, Jane Smithard, Graham Norton HRB 21284 (AG N?rnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd @ 2018-01-23 13:35 ` Johannes Thumshirn 0 siblings, 0 replies; 16+ messages in thread From: Johannes Thumshirn @ 2018-01-23 13:35 UTC (permalink / raw) To: Martin K. Petersen Cc: Christoph Hellwig, Sagi Grimberg, Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist On Tue, Jan 23, 2018 at 08:31:50AM -0500, Martin K. Petersen wrote: > > Christoph, > > > Seems like this is still missing the qid in the tracepoint, as it only > > got added to the completion side. > > Yup, noticed the same thing. Yep already fixed and about to send out the fixed version if no one as any further comments. -- Johannes Thumshirn Storage jthumshirn@suse.de +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850 ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v5 2/2] nvme: add tracepoint for nvme_complete_rq 2018-01-23 10:56 ` Johannes Thumshirn @ 2018-01-23 10:56 ` Johannes Thumshirn -1 siblings, 0 replies; 16+ messages in thread From: Johannes Thumshirn @ 2018-01-23 10:56 UTC (permalink / raw) 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 at suse.de> Reviewed-by: Hannes Reinecke <hare at suse.com> Reviewed-by: Martin K. Petersen <martin.petersen at oracle.com> Reviewed-by: Keith Busch <keith.busch at intel.com> --- Changes to v4: * Print QID for completions (Christoph) Changes to v2: * Pass the whole struct request to the tracepoint * Removed spaces after parenthesis (Christoph) --- drivers/nvme/host/core.c | 2 ++ drivers/nvme/host/trace.h | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 7b60a828fe01..fb0b494e8ac7 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -193,6 +193,8 @@ static inline bool nvme_req_needs_retry(struct request *req) void nvme_complete_rq(struct request *req) { + trace_nvme_complete_rq(req); + if (unlikely(nvme_req(req)->status && nvme_req_needs_retry(req))) { if (nvme_req_needs_failover(req)) { nvme_failover_req(req); diff --git a/drivers/nvme/host/trace.h b/drivers/nvme/host/trace.h index 5e5c2de7a43e..699a9e6ad0be 100644 --- a/drivers/nvme/host/trace.h +++ b/drivers/nvme/host/trace.h @@ -128,6 +128,32 @@ 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(__le64, result) + __field(u8, retries) + __field(u8, flags) + __field(u16, status) + ), + TP_fast_assign( + __entry->qid = req->q->id; + __entry->cid = req->tag; + __entry->result = 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, + le64_to_cpu(__entry->result), + __entry->retries, __entry->flags, __entry->status) + +); + #endif /* _TRACE_NVME_H */ #undef TRACE_INCLUDE_PATH -- 2.12.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v5 2/2] nvme: add tracepoint for nvme_complete_rq @ 2018-01-23 10:56 ` Johannes Thumshirn 0 siblings, 0 replies; 16+ messages in thread From: Johannes Thumshirn @ 2018-01-23 10:56 UTC (permalink / raw) To: Christoph Hellwig Cc: Sagi Grimberg, Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist, Martin K . Petersen, Johannes Thumshirn 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> --- Changes to v4: * Print QID for completions (Christoph) Changes to v2: * Pass the whole struct request to the tracepoint * Removed spaces after parenthesis (Christoph) --- drivers/nvme/host/core.c | 2 ++ drivers/nvme/host/trace.h | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 7b60a828fe01..fb0b494e8ac7 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -193,6 +193,8 @@ static inline bool nvme_req_needs_retry(struct request *req) void nvme_complete_rq(struct request *req) { + trace_nvme_complete_rq(req); + if (unlikely(nvme_req(req)->status && nvme_req_needs_retry(req))) { if (nvme_req_needs_failover(req)) { nvme_failover_req(req); diff --git a/drivers/nvme/host/trace.h b/drivers/nvme/host/trace.h index 5e5c2de7a43e..699a9e6ad0be 100644 --- a/drivers/nvme/host/trace.h +++ b/drivers/nvme/host/trace.h @@ -128,6 +128,32 @@ 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(__le64, result) + __field(u8, retries) + __field(u8, flags) + __field(u16, status) + ), + TP_fast_assign( + __entry->qid = req->q->id; + __entry->cid = req->tag; + __entry->result = 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, + le64_to_cpu(__entry->result), + __entry->retries, __entry->flags, __entry->status) + +); + #endif /* _TRACE_NVME_H */ #undef TRACE_INCLUDE_PATH -- 2.12.3 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v5 2/2] nvme: add tracepoint for nvme_complete_rq 2018-01-23 10:56 ` Johannes Thumshirn @ 2018-01-23 12:44 ` Sagi Grimberg -1 siblings, 0 replies; 16+ messages in thread From: Sagi Grimberg @ 2018-01-23 12:44 UTC (permalink / raw) Reviewed-by: Sagi Grimberg <sagi at grimberg.me> ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v5 2/2] nvme: add tracepoint for nvme_complete_rq @ 2018-01-23 12:44 ` Sagi Grimberg 0 siblings, 0 replies; 16+ messages in thread From: Sagi Grimberg @ 2018-01-23 12:44 UTC (permalink / raw) To: Johannes Thumshirn, Christoph Hellwig Cc: Keith Busch, Linux Kernel Mailinglist, Hannes Reinecke, Linux NVMe Mailinglist, Martin K . Petersen Reviewed-by: Sagi Grimberg <sagi@grimberg.me> ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2018-01-23 13:35 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-01-23 10:56 [PATCH v5 0/2] add tracepoints for nvme command submission and completion Johannes Thumshirn 2018-01-23 10:56 ` Johannes Thumshirn 2018-01-23 10:56 ` [PATCH v5 1/2] nvme: add tracepoint for nvme_setup_cmd Johannes Thumshirn 2018-01-23 10:56 ` Johannes Thumshirn 2018-01-23 12:43 ` Sagi Grimberg 2018-01-23 12:43 ` Sagi Grimberg 2018-01-23 12:46 ` Christoph Hellwig 2018-01-23 12:46 ` Christoph Hellwig 2018-01-23 13:31 ` Martin K. Petersen 2018-01-23 13:31 ` Martin K. Petersen 2018-01-23 13:35 ` Johannes Thumshirn 2018-01-23 13:35 ` Johannes Thumshirn 2018-01-23 10:56 ` [PATCH v5 2/2] nvme: add tracepoint for nvme_complete_rq Johannes Thumshirn 2018-01-23 10:56 ` Johannes Thumshirn 2018-01-23 12:44 ` Sagi Grimberg 2018-01-23 12:44 ` Sagi Grimberg
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.