1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
2 | #include <linux/module.h> |
3 | #include <linux/kthread.h> |
4 | #include <linux/irq_work.h> |
5 | |
6 | /* Must not be static to force gcc to consider these non constant */ |
7 | char *trace_printk_test_global_str = |
8 | "This is a dynamic string that will use trace_puts\n"; |
9 | |
10 | char *trace_printk_test_global_str_irq = |
11 | "(irq) This is a dynamic string that will use trace_puts\n"; |
12 | |
13 | char *trace_printk_test_global_str_fmt = |
14 | "%sThis is a %s that will use trace_printk\n"; |
15 | |
16 | static struct irq_work irqwork; |
17 | |
18 | static void trace_printk_irq_work(struct irq_work *work) |
19 | { |
20 | trace_printk("(irq) This is a static string that will use trace_bputs\n"); |
21 | trace_printk(trace_printk_test_global_str_irq); |
22 | |
23 | trace_printk("(irq) This is a %s that will use trace_bprintk()\n", |
24 | "static string"); |
25 | |
26 | trace_printk(trace_printk_test_global_str_fmt, |
27 | "(irq) ", "dynamic string"); |
28 | } |
29 | |
30 | static int __init trace_printk_init(void) |
31 | { |
32 | init_irq_work(work: &irqwork, func: trace_printk_irq_work); |
33 | |
34 | trace_printk("This is a static string that will use trace_bputs\n"); |
35 | trace_printk(trace_printk_test_global_str); |
36 | |
37 | /* Kick off printing in irq context */ |
38 | irq_work_queue(work: &irqwork); |
39 | irq_work_sync(work: &irqwork); |
40 | |
41 | trace_printk("This is a %s that will use trace_bprintk()\n", |
42 | "static string"); |
43 | |
44 | trace_printk(trace_printk_test_global_str_fmt, "", "dynamic string"); |
45 | |
46 | return 0; |
47 | } |
48 | |
49 | static void __exit trace_printk_exit(void) |
50 | { |
51 | } |
52 | |
53 | module_init(trace_printk_init); |
54 | module_exit(trace_printk_exit); |
55 | |
56 | MODULE_AUTHOR("Steven Rostedt"); |
57 | MODULE_DESCRIPTION("trace-printk"); |
58 | MODULE_LICENSE("GPL"); |
59 |