Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 769b0441 authored by Frederic Weisbecker's avatar Frederic Weisbecker Committed by Ingo Molnar
Browse files

tracing/core: drop the old trace_printk() implementation in favour of trace_bprintk()



Impact: faster and lighter tracing

Now that we have trace_bprintk() which is faster and consume lesser
memory than trace_printk() and has the same purpose, we can now drop
the old implementation in favour of the binary one from trace_bprintk(),
which means we move all the implementation of trace_bprintk() to
trace_printk(), so the Api doesn't change except that we must now use
trace_seq_bprintk() to print the TRACE_PRINT entries.

Some changes result of this:

- Previously, trace_bprintk depended of a single tracer and couldn't
  work without. This tracer has been dropped and the whole implementation
  of trace_printk() (like the module formats management) is now integrated
  in the tracing core (comes with CONFIG_TRACING), though we keep the file
  trace_printk (previously trace_bprintk.c) where we can find the module
  management. Thus we don't overflow trace.c

- changes some parts to use trace_seq_bprintk() to print TRACE_PRINT entries.

- change a bit trace_printk/trace_vprintk macros to support non-builtin formats
  constants, and fix 'const' qualifiers warnings. But this is all transparent for
  developers.

- etc...

V2:

- Rebase against last changes
- Fix mispell on the changelog

V3:

- Rebase against last changes (moving trace_printk() to kernel.h)

Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1236356510-8381-5-git-send-email-fweisbec@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 1ba28e02
Loading
Loading
Loading
Loading
+0 −25
Original line number Diff line number Diff line
@@ -223,31 +223,6 @@ extern int ftrace_make_nop(struct module *mod,
 */
extern int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr);

#ifdef CONFIG_TRACE_BPRINTK
extern int trace_vbprintk(unsigned long ip, const char *fmt, va_list args);
extern int __trace_bprintk(unsigned long ip, const char *fmt, ...)
		__attribute__ ((format (printf, 2, 3)));

static inline void  ____trace_bprintk_check_format(const char *fmt, ...)
		__attribute__ ((format (printf, 1, 2)));
static inline void ____trace_bprintk_check_format(const char *fmt, ...) {}
#define __trace_bprintk_check_format(fmt, args...)			\
do {									\
	if (0)								\
		____trace_bprintk_check_format(fmt, ##args);		\
} while (0)

#define trace_bprintk(fmt, args...)					\
do {									\
	static char *__attribute__((section("__trace_bprintk_fmt")))	\
			trace_bprintk_fmt = fmt;			\
	__trace_bprintk_check_format(fmt, ##args);			\
	__trace_bprintk(_THIS_IP_, trace_bprintk_fmt, ##args);	\
} while (0)
#else
#define trace_bprintk trace_printk
#endif

/* May be defined in arch */
extern int ftrace_arch_read_dyn_info(char *buf, int size);

+31 −3
Original line number Diff line number Diff line
@@ -423,6 +423,16 @@ extern void ftrace_off_permanent(void);
extern void
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3);

static inline void __attribute__ ((format (printf, 1, 2)))
____trace_printk_check_format(const char *fmt, ...)
{
}
#define __trace_printk_check_format(fmt, args...)			\
do {									\
	if (0)								\
		____trace_printk_check_format(fmt, ##args);		\
} while (0)

/**
 * trace_printk - printf formatting in the ftrace buffer
 * @fmt: the printf format for printing
@@ -439,13 +449,31 @@ ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3);
 * Please refrain from leaving trace_printks scattered around in
 * your code.
 */
# define trace_printk(fmt...) __trace_printk(_THIS_IP_, fmt)

#define trace_printk(fmt, args...)					\
do {									\
	static const char *trace_printk_fmt				\
	__attribute__((section("__trace_printk_fmt")));			\
	trace_printk_fmt = fmt;					\
	__trace_printk_check_format(fmt, ##args);			\
	__trace_printk(_THIS_IP_, trace_printk_fmt, ##args);		\
} while (0)

extern int
__trace_printk(unsigned long ip, const char *fmt, ...)
	__attribute__ ((format (printf, 2, 3)));
# define ftrace_vprintk(fmt, ap) __trace_printk(_THIS_IP_, fmt, ap)

#define ftrace_vprintk(fmt, vargs)					\
do {									\
	static const char *trace_printk_fmt				\
	__attribute__((section("__trace_printk_fmt")));			\
	trace_printk_fmt = fmt;					\
	__ftrace_vprintk(_THIS_IP_, trace_printk_fmt, vargs);		\
} while (0)

extern int
__ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap);

extern void ftrace_dump(void);
#else
static inline void
@@ -467,7 +495,7 @@ ftrace_vprintk(const char *fmt, va_list ap)
	return 0;
}
static inline void ftrace_dump(void) { }
#endif
#endif /* CONFIG_TRACING */

/*
 *      Display an IP address in readable format.
+1 −1
Original line number Diff line number Diff line
@@ -329,7 +329,7 @@ struct module
	unsigned int num_tracepoints;
#endif

#ifdef CONFIG_TRACE_BPRINTK
#ifdef CONFIG_TRACING
	const char **trace_bprintk_fmt_start;
	unsigned int num_trace_bprintk_fmt;
#endif
+1 −6
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ config TRACING
	select STACKTRACE if STACKTRACE_SUPPORT
	select TRACEPOINTS
	select NOP_TRACER
	select BINARY_PRINTF

#
# Minimum requirements an architecture has to meet for us to
@@ -97,12 +98,6 @@ config FUNCTION_GRAPH_TRACER
	  This is done by setting the current return address on the current
	  task structure into a stack of calls.

config TRACE_BPRINTK
	bool "Binary printk for tracing"
	default y
	depends on TRACING
	select BINARY_PRINTF

config IRQSOFF_TRACER
	bool "Interrupts-off Latency Tracer"
	default n
+1 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ obj-$(CONFIG_TRACING) += trace.o
obj-$(CONFIG_TRACING) += trace_clock.o
obj-$(CONFIG_TRACING) += trace_output.o
obj-$(CONFIG_TRACING) += trace_stat.o
obj-$(CONFIG_TRACE_BPRINTK) += trace_bprintk.o
obj-$(CONFIG_TRACING) += trace_printk.o
obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o
obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o
obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o
Loading