mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-10-31 00:13:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 3775fd3850e712de87dbec398ef5f2849e846f47 Mon Sep 17 00:00:00 2001
 | |
| From: Tom Zanussi <tom.zanussi@linux.intel.com>
 | |
| Date: Mon, 15 Jan 2018 20:52:03 -0600
 | |
| Subject: [PATCH 108/414] tracing: Add cpu field for hist triggers
 | |
| 
 | |
| A common key to use in a histogram is the cpuid - add a new cpu
 | |
| 'synthetic' field named 'cpu' for that purpose.
 | |
| 
 | |
| Link: http://lkml.kernel.org/r/89537645bfc957e0d76e2cacf5f0ada88691a6cc.1516069914.git.tom.zanussi@linux.intel.com
 | |
| 
 | |
| Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com>
 | |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
 | |
| (cherry picked from commit 4bfaa88f0e0e98e706d57647452e4d37afd78d00)
 | |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | |
| ---
 | |
|  Documentation/trace/histogram.txt | 15 +++++++++++++++
 | |
|  kernel/trace/trace_events_hist.c  | 28 +++++++++++++++++++++++++++-
 | |
|  2 files changed, 42 insertions(+), 1 deletion(-)
 | |
| 
 | |
| diff --git a/Documentation/trace/histogram.txt b/Documentation/trace/histogram.txt
 | |
| index 25c94730d3fe..be612ca79455 100644
 | |
| --- a/Documentation/trace/histogram.txt
 | |
| +++ b/Documentation/trace/histogram.txt
 | |
| @@ -172,6 +172,21 @@
 | |
|    The examples below provide a more concrete illustration of the
 | |
|    concepts and typical usage patterns discussed above.
 | |
|  
 | |
| +  'special' event fields
 | |
| +  ------------------------
 | |
| +
 | |
| +  There are a number of 'special event fields' available for use as
 | |
| +  keys or values in a hist trigger.  These look like and behave as if
 | |
| +  they were actual event fields, but aren't really part of the event's
 | |
| +  field definition or format file.  They are however available for any
 | |
| +  event, and can be used anywhere an actual event field could be.
 | |
| +  They are:
 | |
| +
 | |
| +    common_timestamp       u64 - timestamp (from ring buffer) associated
 | |
| +                                 with the event, in nanoseconds.  May be
 | |
| +				 modified by .usecs to have timestamps
 | |
| +				 interpreted as microseconds.
 | |
| +    cpu                    int - the cpu on which the event occurred.
 | |
|  
 | |
|  6.2 'hist' trigger examples
 | |
|  ---------------------------
 | |
| diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
 | |
| index 0b73852f6923..34a2e8d0a052 100644
 | |
| --- a/kernel/trace/trace_events_hist.c
 | |
| +++ b/kernel/trace/trace_events_hist.c
 | |
| @@ -227,6 +227,7 @@ enum hist_field_flags {
 | |
|  	HIST_FIELD_FL_VAR		= 1 << 12,
 | |
|  	HIST_FIELD_FL_EXPR		= 1 << 13,
 | |
|  	HIST_FIELD_FL_VAR_REF		= 1 << 14,
 | |
| +	HIST_FIELD_FL_CPU		= 1 << 15,
 | |
|  };
 | |
|  
 | |
|  struct var_defs {
 | |
| @@ -1164,6 +1165,16 @@ static u64 hist_field_timestamp(struct hist_field *hist_field,
 | |
|  	return ts;
 | |
|  }
 | |
|  
 | |
| +static u64 hist_field_cpu(struct hist_field *hist_field,
 | |
| +			  struct tracing_map_elt *elt,
 | |
| +			  struct ring_buffer_event *rbe,
 | |
| +			  void *event)
 | |
| +{
 | |
| +	int cpu = smp_processor_id();
 | |
| +
 | |
| +	return cpu;
 | |
| +}
 | |
| +
 | |
|  static struct hist_field *
 | |
|  check_field_for_var_ref(struct hist_field *hist_field,
 | |
|  			struct hist_trigger_data *var_data,
 | |
| @@ -1602,6 +1613,8 @@ static const char *hist_field_name(struct hist_field *field,
 | |
|  		field_name = hist_field_name(field->operands[0], ++level);
 | |
|  	else if (field->flags & HIST_FIELD_FL_TIMESTAMP)
 | |
|  		field_name = "common_timestamp";
 | |
| +	else if (field->flags & HIST_FIELD_FL_CPU)
 | |
| +		field_name = "cpu";
 | |
|  	else if (field->flags & HIST_FIELD_FL_EXPR ||
 | |
|  		 field->flags & HIST_FIELD_FL_VAR_REF) {
 | |
|  		if (field->system) {
 | |
| @@ -2109,6 +2122,15 @@ static struct hist_field *create_hist_field(struct hist_trigger_data *hist_data,
 | |
|  		goto out;
 | |
|  	}
 | |
|  
 | |
| +	if (flags & HIST_FIELD_FL_CPU) {
 | |
| +		hist_field->fn = hist_field_cpu;
 | |
| +		hist_field->size = sizeof(int);
 | |
| +		hist_field->type = kstrdup("unsigned int", GFP_KERNEL);
 | |
| +		if (!hist_field->type)
 | |
| +			goto free;
 | |
| +		goto out;
 | |
| +	}
 | |
| +
 | |
|  	if (WARN_ON_ONCE(!field))
 | |
|  		goto out;
 | |
|  
 | |
| @@ -2345,7 +2367,9 @@ parse_field(struct hist_trigger_data *hist_data, struct trace_event_file *file,
 | |
|  		hist_data->enable_timestamps = true;
 | |
|  		if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS)
 | |
|  			hist_data->attrs->ts_in_usecs = true;
 | |
| -	} else {
 | |
| +	} else if (strcmp(field_name, "cpu") == 0)
 | |
| +		*flags |= HIST_FIELD_FL_CPU;
 | |
| +	else {
 | |
|  		field = trace_find_event_field(file->event_call, field_name);
 | |
|  		if (!field || !field->size) {
 | |
|  			field = ERR_PTR(-EINVAL);
 | |
| @@ -4621,6 +4645,8 @@ static void hist_field_print(struct seq_file *m, struct hist_field *hist_field)
 | |
|  
 | |
|  	if (hist_field->flags & HIST_FIELD_FL_TIMESTAMP)
 | |
|  		seq_puts(m, "common_timestamp");
 | |
| +	else if (hist_field->flags & HIST_FIELD_FL_CPU)
 | |
| +		seq_puts(m, "cpu");
 | |
|  	else if (field_name) {
 | |
|  		if (hist_field->flags & HIST_FIELD_FL_VAR_REF)
 | |
|  			seq_putc(m, '$');
 | |
| -- 
 | |
| 2.17.0
 | |
| 
 |