diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 78 | 
1 files changed, 53 insertions, 25 deletions
| diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 123b189c732..194d79602dc 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -610,24 +610,54 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)  	return trace_print_lat_fmt(s, entry);  } -static unsigned long preempt_mark_thresh = 100; +static unsigned long preempt_mark_thresh_us = 100;  static int -lat_print_timestamp(struct trace_seq *s, u64 abs_usecs, -		    unsigned long rel_usecs) +lat_print_timestamp(struct trace_iterator *iter, u64 next_ts)  { -	return trace_seq_printf(s, " %4lldus%c: ", abs_usecs, -				rel_usecs > preempt_mark_thresh ? '!' : -				  rel_usecs > 1 ? '+' : ' '); +	unsigned long verbose = trace_flags & TRACE_ITER_VERBOSE; +	unsigned long in_ns = iter->iter_flags & TRACE_FILE_TIME_IN_NS; +	unsigned long long abs_ts = iter->ts - iter->tr->time_start; +	unsigned long long rel_ts = next_ts - iter->ts; +	struct trace_seq *s = &iter->seq; + +	if (in_ns) { +		abs_ts = ns2usecs(abs_ts); +		rel_ts = ns2usecs(rel_ts); +	} + +	if (verbose && in_ns) { +		unsigned long abs_usec = do_div(abs_ts, USEC_PER_MSEC); +		unsigned long abs_msec = (unsigned long)abs_ts; +		unsigned long rel_usec = do_div(rel_ts, USEC_PER_MSEC); +		unsigned long rel_msec = (unsigned long)rel_ts; + +		return trace_seq_printf( +				s, "[%08llx] %ld.%03ldms (+%ld.%03ldms): ", +				ns2usecs(iter->ts), +				abs_msec, abs_usec, +				rel_msec, rel_usec); +	} else if (verbose && !in_ns) { +		return trace_seq_printf( +				s, "[%016llx] %lld (+%lld): ", +				iter->ts, abs_ts, rel_ts); +	} else if (!verbose && in_ns) { +		return trace_seq_printf( +				s, " %4lldus%c: ", +				abs_ts, +				rel_ts > preempt_mark_thresh_us ? '!' : +				  rel_ts > 1 ? '+' : ' '); +	} else { /* !verbose && !in_ns */ +		return trace_seq_printf(s, " %4lld: ", abs_ts); +	}  }  int trace_print_context(struct trace_iterator *iter)  {  	struct trace_seq *s = &iter->seq;  	struct trace_entry *entry = iter->ent; -	unsigned long long t = ns2usecs(iter->ts); -	unsigned long usec_rem = do_div(t, USEC_PER_SEC); -	unsigned long secs = (unsigned long)t; +	unsigned long long t; +	unsigned long secs, usec_rem;  	char comm[TASK_COMM_LEN];  	int ret; @@ -644,8 +674,13 @@ int trace_print_context(struct trace_iterator *iter)  			return 0;  	} -	return trace_seq_printf(s, " %5lu.%06lu: ", -				secs, usec_rem); +	if (iter->iter_flags & TRACE_FILE_TIME_IN_NS) { +		t = ns2usecs(iter->ts); +		usec_rem = do_div(t, USEC_PER_SEC); +		secs = (unsigned long)t; +		return trace_seq_printf(s, " %5lu.%06lu: ", secs, usec_rem); +	} else +		return trace_seq_printf(s, " %12llu: ", iter->ts);  }  int trace_print_lat_context(struct trace_iterator *iter) @@ -659,36 +694,29 @@ int trace_print_lat_context(struct trace_iterator *iter)  			   *next_entry = trace_find_next_entry(iter, NULL,  							       &next_ts);  	unsigned long verbose = (trace_flags & TRACE_ITER_VERBOSE); -	unsigned long abs_usecs = ns2usecs(iter->ts - iter->tr->time_start); -	unsigned long rel_usecs;  	/* Restore the original ent_size */  	iter->ent_size = ent_size;  	if (!next_entry)  		next_ts = iter->ts; -	rel_usecs = ns2usecs(next_ts - iter->ts);  	if (verbose) {  		char comm[TASK_COMM_LEN];  		trace_find_cmdline(entry->pid, comm); -		ret = trace_seq_printf(s, "%16s %5d %3d %d %08x %08lx [%08llx]" -				       " %ld.%03ldms (+%ld.%03ldms): ", comm, -				       entry->pid, iter->cpu, entry->flags, -				       entry->preempt_count, iter->idx, -				       ns2usecs(iter->ts), -				       abs_usecs / USEC_PER_MSEC, -				       abs_usecs % USEC_PER_MSEC, -				       rel_usecs / USEC_PER_MSEC, -				       rel_usecs % USEC_PER_MSEC); +		ret = trace_seq_printf( +				s, "%16s %5d %3d %d %08x %08lx ", +				comm, entry->pid, iter->cpu, entry->flags, +				entry->preempt_count, iter->idx);  	} else {  		ret = lat_print_generic(s, entry, iter->cpu); -		if (ret) -			ret = lat_print_timestamp(s, abs_usecs, rel_usecs);  	} +	if (ret) +		ret = lat_print_timestamp(iter, next_ts); +  	return ret;  } | 
