diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 93 | 
1 files changed, 90 insertions, 3 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 34e7cbac0c9..f3dad80c20b 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -126,6 +126,34 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)  EXPORT_SYMBOL_GPL(trace_seq_printf);  /** + * trace_seq_bitmask - put a list of longs as a bitmask print output + * @s:		trace sequence descriptor + * @maskp:	points to an array of unsigned longs that represent a bitmask + * @nmaskbits:	The number of bits that are valid in @maskp + * + * It returns 0 if the trace oversizes the buffer's free + * space, 1 otherwise. + * + * Writes a ASCII representation of a bitmask string into @s. + */ +int +trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp, +		  int nmaskbits) +{ +	int len = (PAGE_SIZE - 1) - s->len; +	int ret; + +	if (s->full || !len) +		return 0; + +	ret = bitmap_scnprintf(s->buffer, len, maskp, nmaskbits); +	s->len += ret; + +	return 1; +} +EXPORT_SYMBOL_GPL(trace_seq_bitmask); + +/**   * trace_seq_vprintf - sequence printing of trace information   * @s: trace sequence descriptor   * @fmt: printf format string @@ -399,6 +427,19 @@ EXPORT_SYMBOL(ftrace_print_symbols_seq_u64);  #endif  const char * +ftrace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr, +			 unsigned int bitmask_size) +{ +	const char *ret = p->buffer + p->len; + +	trace_seq_bitmask(p, bitmask_ptr, bitmask_size * 8); +	trace_seq_putc(p, 0); + +	return ret; +} +EXPORT_SYMBOL_GPL(ftrace_print_bitmask_seq); + +const char *  ftrace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len)  {  	int i; @@ -431,7 +472,7 @@ int ftrace_raw_output_prep(struct trace_iterator *iter,  	}  	trace_seq_init(p); -	ret = trace_seq_printf(s, "%s: ", event->name); +	ret = trace_seq_printf(s, "%s: ", ftrace_event_name(event));  	if (!ret)  		return TRACE_TYPE_PARTIAL_LINE; @@ -439,6 +480,37 @@ int ftrace_raw_output_prep(struct trace_iterator *iter,  }  EXPORT_SYMBOL(ftrace_raw_output_prep); +static int ftrace_output_raw(struct trace_iterator *iter, char *name, +			     char *fmt, va_list ap) +{ +	struct trace_seq *s = &iter->seq; +	int ret; + +	ret = trace_seq_printf(s, "%s: ", name); +	if (!ret) +		return TRACE_TYPE_PARTIAL_LINE; + +	ret = trace_seq_vprintf(s, fmt, ap); + +	if (!ret) +		return TRACE_TYPE_PARTIAL_LINE; + +	return TRACE_TYPE_HANDLED; +} + +int ftrace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...) +{ +	va_list ap; +	int ret; + +	va_start(ap, fmt); +	ret = ftrace_output_raw(iter, name, fmt, ap); +	va_end(ap); + +	return ret; +} +EXPORT_SYMBOL_GPL(ftrace_output_call); +  #ifdef CONFIG_KRETPROBES  static inline const char *kretprobed(const char *name)  { @@ -618,8 +690,23 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)  		(entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :  		(entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' :  		'.'; -	need_resched = -		(entry->flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.'; + +	switch (entry->flags & (TRACE_FLAG_NEED_RESCHED | +				TRACE_FLAG_PREEMPT_RESCHED)) { +	case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_PREEMPT_RESCHED: +		need_resched = 'N'; +		break; +	case TRACE_FLAG_NEED_RESCHED: +		need_resched = 'n'; +		break; +	case TRACE_FLAG_PREEMPT_RESCHED: +		need_resched = 'p'; +		break; +	default: +		need_resched = '.'; +		break; +	} +  	hardsoft_irq =  		(hardirq && softirq) ? 'H' :  		hardirq ? 'h' :  | 
