Skip to content

Commit aad108a

Browse files
committed
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 <[email protected]>
1 parent e2ace00 commit aad108a

File tree

4 files changed

+70
-1
lines changed

4 files changed

+70
-1
lines changed

samples/Kconfig

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ config SAMPLE_TRACE_EVENTS
1111
help
1212
This build trace event example modules.
1313

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+
1421
config SAMPLE_KOBJECT
1522
tristate "Build kobject examples -- loadable modules only"
1623
depends on m

samples/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
obj-$(CONFIG_SAMPLES) += kobject/ kprobes/ trace_events/ livepatch/ \
44
hw_breakpoint/ kfifo/ kdb/ hidraw/ rpmsg/ seccomp/ \
5-
configfs/ connector/ v4l/
5+
configfs/ connector/ v4l/ trace_printk/

samples/trace_printk/Makefile

+6
Original file line numberDiff line numberDiff line change
@@ -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

samples/trace_printk/trace-printk.c

+56
Original file line numberDiff line numberDiff line change
@@ -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");

0 commit comments

Comments
 (0)