From aad108aa9d1aca5be178ef40325dcc99b448e866 Mon Sep 17 00:00:00 2001 From: "Steven Rostedt (Red Hat)" Date: Fri, 17 Jun 2016 14:50:23 -0400 Subject: [PATCH] tracing: Add trace_printk sample code Add sample code to test trace_printk(). The trace_printk() functions should never be used in production code. This makes testing it a bit more difficult. Having a sample module that can test use cases of trace_printk() can help out. Currently it just tests trace_printk() where it will be converted into: trace_bputs() trace_puts() trace_bprintk() as well as staying as the normal _trace_printk(). It also tests its use in interrupt context as that will test the auxilery buffers. Signed-off-by: Steven Rostedt --- samples/Kconfig | 7 ++++ samples/Makefile | 2 +- samples/trace_printk/Makefile | 6 ++++ samples/trace_printk/trace-printk.c | 56 +++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 samples/trace_printk/Makefile create mode 100644 samples/trace_printk/trace-printk.c diff --git a/samples/Kconfig b/samples/Kconfig index 559a58baff6e..27a24571e96c 100644 --- a/samples/Kconfig +++ b/samples/Kconfig @@ -11,6 +11,13 @@ config SAMPLE_TRACE_EVENTS help This build trace event example modules. +config SAMPLE_TRACE_PRINTK + tristate "Build trace_printk module - tests various trace_printk formats" + depends on EVENT_TRACING && m + help + This builds a module that calls trace_printk() and can be used to + test various trace_printk() calls from a module. + config SAMPLE_KOBJECT tristate "Build kobject examples -- loadable modules only" depends on m diff --git a/samples/Makefile b/samples/Makefile index 2e3b523d7097..1a20169d85ac 100644 --- a/samples/Makefile +++ b/samples/Makefile @@ -2,4 +2,4 @@ obj-$(CONFIG_SAMPLES) += kobject/ kprobes/ trace_events/ livepatch/ \ hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/ \ - configfs/ connector/ v4l/ + configfs/ connector/ v4l/ trace_printk/ diff --git a/samples/trace_printk/Makefile b/samples/trace_printk/Makefile new file mode 100644 index 000000000000..19900ab2b00d --- /dev/null +++ b/samples/trace_printk/Makefile @@ -0,0 +1,6 @@ +# builds a module that calls various trace_printk routines +# then to use one (as root): insmod + +# This module can also be used to test the trace_printk code. + +obj-$(CONFIG_SAMPLE_TRACE_PRINTK) += trace-printk.o diff --git a/samples/trace_printk/trace-printk.c b/samples/trace_printk/trace-printk.c new file mode 100644 index 000000000000..e9e0040ff7be --- /dev/null +++ b/samples/trace_printk/trace-printk.c @@ -0,0 +1,56 @@ +#include +#include +#include + +/* Must not be static to force gcc to consider these non constant */ +char *trace_printk_test_global_str = + "This is a dynamic string that will use trace_puts\n"; + +char *trace_printk_test_global_str_irq = + "(irq) This is a dynamic string that will use trace_puts\n"; + +char *trace_printk_test_global_str_fmt = + "%sThis is a %s that will use trace_printk\n"; + +static struct irq_work irqwork; + +static void trace_printk_irq_work(struct irq_work *work) +{ + trace_printk("(irq) This is a static string that will use trace_bputs\n"); + trace_printk(trace_printk_test_global_str_irq); + + trace_printk("(irq) This is a %s that will use trace_bprintk()\n", + "static string"); + + trace_printk(trace_printk_test_global_str_fmt, + "(irq) ", "dynamic string"); +} + +static int __init trace_printk_init(void) +{ + init_irq_work(&irqwork, trace_printk_irq_work); + + trace_printk("This is a static string that will use trace_bputs\n"); + trace_printk(trace_printk_test_global_str); + + /* Kick off printing in irq context */ + irq_work_queue(&irqwork); + + trace_printk("This is a %s that will use trace_bprintk()\n", + "static string"); + + trace_printk(trace_printk_test_global_str_fmt, "", "dynamic string"); + + return 0; +} + +static void __exit trace_printk_exit(void) +{ +} + +module_init(trace_printk_init); +module_exit(trace_printk_exit); + +MODULE_AUTHOR("Steven Rostedt"); +MODULE_DESCRIPTION("trace-printk"); +MODULE_LICENSE("GPL");