nvme: add tracepoint for nvme_setup_cmd
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>
2018-01-26 11:21:37 +01:00
/*
* 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 ) )
) ;
2018-01-26 11:21:38 +01:00
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 ;
) ,
2018-04-26 14:25:15 -06:00
TP_printk ( " qid=%d, cmdid=%u, res=%llu, retries=%u, flags=0x%x, status=%u " ,
__entry - > qid , __entry - > cid , __entry - > result ,
2018-01-26 11:21:38 +01:00
__entry - > retries , __entry - > flags , __entry - > status )
) ;
nvme: add tracepoint for nvme_setup_cmd
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>
2018-01-26 11:21:37 +01:00
# 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>