diff mbox series

scsi: target: core: Add CONTROL field for trace events

Message ID 20200929125957.83069-1-r.bolshakov@yadro.com
State New
Headers show
Series scsi: target: core: Add CONTROL field for trace events | expand

Commit Message

Roman Bolshakov Sept. 29, 2020, 12:59 p.m. UTC
trace-cmd report doesn't show events from target subsystem because
scsi_command_size() leaks through event format string:

  [target:target_sequencer_start] function scsi_command_size not defined
  [target:target_cmd_complete] function scsi_command_size not defined

Addition of scsi_command_size() to plugin_scsi.c in trace-cmd doesn't
help because an expression is used inside TP_printk(). trace-cmd event
parser doesn't understand minus sign inside [ ]:

  Error: expected ']' but read '-'

Rather than duplicating kernel code in plugin_scsi.c, it's better to
provide a dedicated field for CONTROL byte.

Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>
---
 include/scsi/scsi_common.h    |  7 +++++++
 include/trace/events/target.h | 12 ++++++------
 2 files changed, 13 insertions(+), 6 deletions(-)

Comments

Mike Christie Oct. 2, 2020, 5:58 p.m. UTC | #1
On 9/29/20 7:59 AM, Roman Bolshakov wrote:
> trace-cmd report doesn't show events from target subsystem because

> scsi_command_size() leaks through event format string:

> 

>   [target:target_sequencer_start] function scsi_command_size not defined

>   [target:target_cmd_complete] function scsi_command_size not defined

> 

> Addition of scsi_command_size() to plugin_scsi.c in trace-cmd doesn't

> help because an expression is used inside TP_printk(). trace-cmd event

> parser doesn't understand minus sign inside [ ]:

> 

>   Error: expected ']' but read '-'

> 

> Rather than duplicating kernel code in plugin_scsi.c, it's better to

> provide a dedicated field for CONTROL byte.

> 

> Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com>

> ---

>  include/scsi/scsi_common.h    |  7 +++++++

>  include/trace/events/target.h | 12 ++++++------

>  2 files changed, 13 insertions(+), 6 deletions(-)

> 

> diff --git a/include/scsi/scsi_common.h b/include/scsi/scsi_common.h

> index 731ac09ed231..5b567b43e1b1 100644

> --- a/include/scsi/scsi_common.h

> +++ b/include/scsi/scsi_common.h

> @@ -25,6 +25,13 @@ scsi_command_size(const unsigned char *cmnd)

>  		scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]);

>  }

>  

> +static inline unsigned char

> +scsi_command_control(const unsigned char *cmnd)

> +{

> +	return (cmnd[0] == VARIABLE_LENGTH_CMD) ?

> +		cmnd[1] : cmnd[COMMAND_SIZE(cmnd[0]) - 1];

> +}

> +

>  /* Returns a human-readable name for the device */

>  extern const char *scsi_device_type(unsigned type);

>  

> diff --git a/include/trace/events/target.h b/include/trace/events/target.h

> index 77408edd29d2..67fad2677ed5 100644

> --- a/include/trace/events/target.h

> +++ b/include/trace/events/target.h

> @@ -141,6 +141,7 @@ TRACE_EVENT(target_sequencer_start,

>  		__field( unsigned int,	opcode		)

>  		__field( unsigned int,	data_length	)

>  		__field( unsigned int,	task_attribute  )

> +		__field( unsigned char,	control		)

>  		__array( unsigned char,	cdb, TCM_MAX_COMMAND_SIZE	)

>  		__string( initiator,	cmd->se_sess->se_node_acl->initiatorname	)

>  	),

> @@ -151,6 +152,7 @@ TRACE_EVENT(target_sequencer_start,

>  		__entry->opcode		= cmd->t_task_cdb[0];

>  		__entry->data_length	= cmd->data_length;

>  		__entry->task_attribute	= cmd->sam_task_attr;

> +		__entry->control	= scsi_command_control(cmd->t_task_cdb);

>  		memcpy(__entry->cdb, cmd->t_task_cdb, TCM_MAX_COMMAND_SIZE);

>  		__assign_str(initiator, cmd->se_sess->se_node_acl->initiatorname);

>  	),

> @@ -160,9 +162,7 @@ TRACE_EVENT(target_sequencer_start,

>  		  __entry->tag, show_opcode_name(__entry->opcode),

>  		  __entry->data_length, __print_hex(__entry->cdb, 16),

>  		  show_task_attribute_name(__entry->task_attribute),

> -		  scsi_command_size(__entry->cdb) <= 16 ?

> -			__entry->cdb[scsi_command_size(__entry->cdb) - 1] :

> -			__entry->cdb[1]

> +		  __entry->control

>  	)

>  );

>  

> @@ -178,6 +178,7 @@ TRACE_EVENT(target_cmd_complete,

>  		__field( unsigned int,	opcode		)

>  		__field( unsigned int,	data_length	)

>  		__field( unsigned int,	task_attribute  )

> +		__field( unsigned char,	control		)

>  		__field( unsigned char,	scsi_status	)

>  		__field( unsigned char,	sense_length	)

>  		__array( unsigned char,	cdb, TCM_MAX_COMMAND_SIZE	)

> @@ -191,6 +192,7 @@ TRACE_EVENT(target_cmd_complete,

>  		__entry->opcode		= cmd->t_task_cdb[0];

>  		__entry->data_length	= cmd->data_length;

>  		__entry->task_attribute	= cmd->sam_task_attr;

> +		__entry->control	= scsi_command_control(cmd->t_task_cdb);

>  		__entry->scsi_status	= cmd->scsi_status;

>  		__entry->sense_length	= cmd->scsi_status == SAM_STAT_CHECK_CONDITION ?

>  			min(18, ((u8 *) cmd->sense_buffer)[SPC_ADD_SENSE_LEN_OFFSET] + 8) : 0;

> @@ -208,9 +210,7 @@ TRACE_EVENT(target_cmd_complete,

>  		  show_opcode_name(__entry->opcode),

>  		  __entry->data_length, __print_hex(__entry->cdb, 16),

>  		  show_task_attribute_name(__entry->task_attribute),

> -		  scsi_command_size(__entry->cdb) <= 16 ?

> -			__entry->cdb[scsi_command_size(__entry->cdb) - 1] :

> -			__entry->cdb[1]

> +		  __entry->control

>  	)

>  );

>  


I'm not an expert on the tracing side of the code, but the target/scsi
parts look ok to me.

Reviewed-by: Mike Christie <michael.christie@oracle.com>
Martin K. Petersen Oct. 2, 2020, 10:41 p.m. UTC | #2
Roman,

> trace-cmd report doesn't show events from target subsystem because
> scsi_command_size() leaks through event format string:

Applied to 5.10/scsi-staging, thanks!
Martin K. Petersen Oct. 7, 2020, 3:48 a.m. UTC | #3
On Tue, 29 Sep 2020 15:59:57 +0300, Roman Bolshakov wrote:

> trace-cmd report doesn't show events from target subsystem because

> scsi_command_size() leaks through event format string:

> 

>   [target:target_sequencer_start] function scsi_command_size not defined

>   [target:target_cmd_complete] function scsi_command_size not defined

> 

> Addition of scsi_command_size() to plugin_scsi.c in trace-cmd doesn't

> help because an expression is used inside TP_printk(). trace-cmd event

> parser doesn't understand minus sign inside [ ]:

> 

> [...]


Applied to 5.10/scsi-queue, thanks!

[1/1] scsi: target: core: Add CONTROL field for trace events
      https://git.kernel.org/mkp/scsi/c/7010645ba725

-- 
Martin K. Petersen	Oracle Linux Engineering
diff mbox series

Patch

diff --git a/include/scsi/scsi_common.h b/include/scsi/scsi_common.h
index 731ac09ed231..5b567b43e1b1 100644
--- a/include/scsi/scsi_common.h
+++ b/include/scsi/scsi_common.h
@@ -25,6 +25,13 @@  scsi_command_size(const unsigned char *cmnd)
 		scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]);
 }
 
+static inline unsigned char
+scsi_command_control(const unsigned char *cmnd)
+{
+	return (cmnd[0] == VARIABLE_LENGTH_CMD) ?
+		cmnd[1] : cmnd[COMMAND_SIZE(cmnd[0]) - 1];
+}
+
 /* Returns a human-readable name for the device */
 extern const char *scsi_device_type(unsigned type);
 
diff --git a/include/trace/events/target.h b/include/trace/events/target.h
index 77408edd29d2..67fad2677ed5 100644
--- a/include/trace/events/target.h
+++ b/include/trace/events/target.h
@@ -141,6 +141,7 @@  TRACE_EVENT(target_sequencer_start,
 		__field( unsigned int,	opcode		)
 		__field( unsigned int,	data_length	)
 		__field( unsigned int,	task_attribute  )
+		__field( unsigned char,	control		)
 		__array( unsigned char,	cdb, TCM_MAX_COMMAND_SIZE	)
 		__string( initiator,	cmd->se_sess->se_node_acl->initiatorname	)
 	),
@@ -151,6 +152,7 @@  TRACE_EVENT(target_sequencer_start,
 		__entry->opcode		= cmd->t_task_cdb[0];
 		__entry->data_length	= cmd->data_length;
 		__entry->task_attribute	= cmd->sam_task_attr;
+		__entry->control	= scsi_command_control(cmd->t_task_cdb);
 		memcpy(__entry->cdb, cmd->t_task_cdb, TCM_MAX_COMMAND_SIZE);
 		__assign_str(initiator, cmd->se_sess->se_node_acl->initiatorname);
 	),
@@ -160,9 +162,7 @@  TRACE_EVENT(target_sequencer_start,
 		  __entry->tag, show_opcode_name(__entry->opcode),
 		  __entry->data_length, __print_hex(__entry->cdb, 16),
 		  show_task_attribute_name(__entry->task_attribute),
-		  scsi_command_size(__entry->cdb) <= 16 ?
-			__entry->cdb[scsi_command_size(__entry->cdb) - 1] :
-			__entry->cdb[1]
+		  __entry->control
 	)
 );
 
@@ -178,6 +178,7 @@  TRACE_EVENT(target_cmd_complete,
 		__field( unsigned int,	opcode		)
 		__field( unsigned int,	data_length	)
 		__field( unsigned int,	task_attribute  )
+		__field( unsigned char,	control		)
 		__field( unsigned char,	scsi_status	)
 		__field( unsigned char,	sense_length	)
 		__array( unsigned char,	cdb, TCM_MAX_COMMAND_SIZE	)
@@ -191,6 +192,7 @@  TRACE_EVENT(target_cmd_complete,
 		__entry->opcode		= cmd->t_task_cdb[0];
 		__entry->data_length	= cmd->data_length;
 		__entry->task_attribute	= cmd->sam_task_attr;
+		__entry->control	= scsi_command_control(cmd->t_task_cdb);
 		__entry->scsi_status	= cmd->scsi_status;
 		__entry->sense_length	= cmd->scsi_status == SAM_STAT_CHECK_CONDITION ?
 			min(18, ((u8 *) cmd->sense_buffer)[SPC_ADD_SENSE_LEN_OFFSET] + 8) : 0;
@@ -208,9 +210,7 @@  TRACE_EVENT(target_cmd_complete,
 		  show_opcode_name(__entry->opcode),
 		  __entry->data_length, __print_hex(__entry->cdb, 16),
 		  show_task_attribute_name(__entry->task_attribute),
-		  scsi_command_size(__entry->cdb) <= 16 ?
-			__entry->cdb[scsi_command_size(__entry->cdb) - 1] :
-			__entry->cdb[1]
+		  __entry->control
 	)
 );