diff options
| author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2016-06-17 14:50:23 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2016-06-20 09:54:21 -0400 |
| commit | aad108aa9d1aca5be178ef40325dcc99b448e866 (patch) | |
| tree | 0f86ba6921d86ac462dc3db3e484a1a08de70e0f /samples | |
| parent | e2ace001176dc9745a472fe8bda1f0b28a4d7351 (diff) | |
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 <rostedt@goodmis.org>
Diffstat (limited to 'samples')
| -rw-r--r-- | samples/Kconfig | 7 | ||||
| -rw-r--r-- | samples/Makefile | 2 | ||||
| -rw-r--r-- | samples/trace_printk/Makefile | 6 | ||||
| -rw-r--r-- | samples/trace_printk/trace-printk.c | 56 |
4 files changed, 70 insertions, 1 deletions
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 | |||
| 11 | help | 11 | help |
| 12 | This build trace event example modules. | 12 | This build trace event example modules. |
| 13 | 13 | ||
| 14 | config SAMPLE_TRACE_PRINTK | ||
| 15 | tristate "Build trace_printk module - tests various trace_printk formats" | ||
| 16 | depends on EVENT_TRACING && m | ||
| 17 | help | ||
| 18 | This builds a module that calls trace_printk() and can be used to | ||
| 19 | test various trace_printk() calls from a module. | ||
| 20 | |||
| 14 | config SAMPLE_KOBJECT | 21 | config SAMPLE_KOBJECT |
| 15 | tristate "Build kobject examples -- loadable modules only" | 22 | tristate "Build kobject examples -- loadable modules only" |
| 16 | depends on m | 23 | 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 @@ | |||
| 2 | 2 | ||
| 3 | obj-$(CONFIG_SAMPLES) += kobject/ kprobes/ trace_events/ livepatch/ \ | 3 | obj-$(CONFIG_SAMPLES) += kobject/ kprobes/ trace_events/ livepatch/ \ |
| 4 | hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/ \ | 4 | hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/ \ |
| 5 | configfs/ connector/ v4l/ | 5 | 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 @@ | |||
| 1 | # builds a module that calls various trace_printk routines | ||
| 2 | # then to use one (as root): insmod <module_name.ko> | ||
| 3 | |||
| 4 | # This module can also be used to test the trace_printk code. | ||
| 5 | |||
| 6 | 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 @@ | |||
| 1 | #include <linux/module.h> | ||
| 2 | #include <linux/kthread.h> | ||
| 3 | #include <linux/irq_work.h> | ||
| 4 | |||
| 5 | /* Must not be static to force gcc to consider these non constant */ | ||
| 6 | char *trace_printk_test_global_str = | ||
| 7 | "This is a dynamic string that will use trace_puts\n"; | ||
| 8 | |||
| 9 | char *trace_printk_test_global_str_irq = | ||
| 10 | "(irq) This is a dynamic string that will use trace_puts\n"; | ||
| 11 | |||
| 12 | char *trace_printk_test_global_str_fmt = | ||
| 13 | "%sThis is a %s that will use trace_printk\n"; | ||
| 14 | |||
| 15 | static struct irq_work irqwork; | ||
| 16 | |||
| 17 | static void trace_printk_irq_work(struct irq_work *work) | ||
| 18 | { | ||
| 19 | trace_printk("(irq) This is a static string that will use trace_bputs\n"); | ||
| 20 | trace_printk(trace_printk_test_global_str_irq); | ||
| 21 | |||
| 22 | trace_printk("(irq) This is a %s that will use trace_bprintk()\n", | ||
| 23 | "static string"); | ||
| 24 | |||
| 25 | trace_printk(trace_printk_test_global_str_fmt, | ||
| 26 | "(irq) ", "dynamic string"); | ||
| 27 | } | ||
| 28 | |||
| 29 | static int __init trace_printk_init(void) | ||
| 30 | { | ||
| 31 | init_irq_work(&irqwork, trace_printk_irq_work); | ||
| 32 | |||
| 33 | trace_printk("This is a static string that will use trace_bputs\n"); | ||
| 34 | trace_printk(trace_printk_test_global_str); | ||
| 35 | |||
| 36 | /* Kick off printing in irq context */ | ||
| 37 | irq_work_queue(&irqwork); | ||
| 38 | |||
| 39 | trace_printk("This is a %s that will use trace_bprintk()\n", | ||
| 40 | "static string"); | ||
| 41 | |||
| 42 | trace_printk(trace_printk_test_global_str_fmt, "", "dynamic string"); | ||
| 43 | |||
| 44 | return 0; | ||
| 45 | } | ||
| 46 | |||
| 47 | static void __exit trace_printk_exit(void) | ||
| 48 | { | ||
| 49 | } | ||
| 50 | |||
| 51 | module_init(trace_printk_init); | ||
| 52 | module_exit(trace_printk_exit); | ||
| 53 | |||
| 54 | MODULE_AUTHOR("Steven Rostedt"); | ||
| 55 | MODULE_DESCRIPTION("trace-printk"); | ||
| 56 | MODULE_LICENSE("GPL"); | ||
