1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM wbt |
4 | |
5 | #if !defined(_TRACE_WBT_H) || defined(TRACE_HEADER_MULTI_READ) |
6 | #define _TRACE_WBT_H |
7 | |
8 | #include <linux/tracepoint.h> |
9 | #include "../../../block/blk-wbt.h" |
10 | |
11 | /** |
12 | * wbt_stat - trace stats for blk_wb |
13 | * @stat: array of read/write stats |
14 | */ |
15 | TRACE_EVENT(wbt_stat, |
16 | |
17 | TP_PROTO(struct backing_dev_info *bdi, struct blk_rq_stat *stat), |
18 | |
19 | TP_ARGS(bdi, stat), |
20 | |
21 | TP_STRUCT__entry( |
22 | __array(char, name, 32) |
23 | __field(s64, rmean) |
24 | __field(u64, rmin) |
25 | __field(u64, rmax) |
26 | __field(s64, rnr_samples) |
27 | __field(s64, rtime) |
28 | __field(s64, wmean) |
29 | __field(u64, wmin) |
30 | __field(u64, wmax) |
31 | __field(s64, wnr_samples) |
32 | __field(s64, wtime) |
33 | ), |
34 | |
35 | TP_fast_assign( |
36 | strscpy(__entry->name, bdi_dev_name(bdi), |
37 | ARRAY_SIZE(__entry->name)); |
38 | __entry->rmean = stat[0].mean; |
39 | __entry->rmin = stat[0].min; |
40 | __entry->rmax = stat[0].max; |
41 | __entry->rnr_samples = stat[0].nr_samples; |
42 | __entry->wmean = stat[1].mean; |
43 | __entry->wmin = stat[1].min; |
44 | __entry->wmax = stat[1].max; |
45 | __entry->wnr_samples = stat[1].nr_samples; |
46 | ), |
47 | |
48 | TP_printk("%s: rmean=%llu, rmin=%llu, rmax=%llu, rsamples=%llu, " |
49 | "wmean=%llu, wmin=%llu, wmax=%llu, wsamples=%llu" , |
50 | __entry->name, __entry->rmean, __entry->rmin, __entry->rmax, |
51 | __entry->rnr_samples, __entry->wmean, __entry->wmin, |
52 | __entry->wmax, __entry->wnr_samples) |
53 | ); |
54 | |
55 | /** |
56 | * wbt_lat - trace latency event |
57 | * @lat: latency trigger |
58 | */ |
59 | TRACE_EVENT(wbt_lat, |
60 | |
61 | TP_PROTO(struct backing_dev_info *bdi, unsigned long lat), |
62 | |
63 | TP_ARGS(bdi, lat), |
64 | |
65 | TP_STRUCT__entry( |
66 | __array(char, name, 32) |
67 | __field(unsigned long, lat) |
68 | ), |
69 | |
70 | TP_fast_assign( |
71 | strscpy(__entry->name, bdi_dev_name(bdi), |
72 | ARRAY_SIZE(__entry->name)); |
73 | __entry->lat = div_u64(lat, 1000); |
74 | ), |
75 | |
76 | TP_printk("%s: latency %lluus" , __entry->name, |
77 | (unsigned long long) __entry->lat) |
78 | ); |
79 | |
80 | /** |
81 | * wbt_step - trace wb event step |
82 | * @msg: context message |
83 | * @step: the current scale step count |
84 | * @window: the current monitoring window |
85 | * @bg: the current background queue limit |
86 | * @normal: the current normal writeback limit |
87 | * @max: the current max throughput writeback limit |
88 | */ |
89 | TRACE_EVENT(wbt_step, |
90 | |
91 | TP_PROTO(struct backing_dev_info *bdi, const char *msg, |
92 | int step, unsigned long window, unsigned int bg, |
93 | unsigned int normal, unsigned int max), |
94 | |
95 | TP_ARGS(bdi, msg, step, window, bg, normal, max), |
96 | |
97 | TP_STRUCT__entry( |
98 | __array(char, name, 32) |
99 | __field(const char *, msg) |
100 | __field(int, step) |
101 | __field(unsigned long, window) |
102 | __field(unsigned int, bg) |
103 | __field(unsigned int, normal) |
104 | __field(unsigned int, max) |
105 | ), |
106 | |
107 | TP_fast_assign( |
108 | strscpy(__entry->name, bdi_dev_name(bdi), |
109 | ARRAY_SIZE(__entry->name)); |
110 | __entry->msg = msg; |
111 | __entry->step = step; |
112 | __entry->window = div_u64(window, 1000); |
113 | __entry->bg = bg; |
114 | __entry->normal = normal; |
115 | __entry->max = max; |
116 | ), |
117 | |
118 | TP_printk("%s: %s: step=%d, window=%luus, background=%u, normal=%u, max=%u" , |
119 | __entry->name, __entry->msg, __entry->step, __entry->window, |
120 | __entry->bg, __entry->normal, __entry->max) |
121 | ); |
122 | |
123 | /** |
124 | * wbt_timer - trace wb timer event |
125 | * @status: timer state status |
126 | * @step: the current scale step count |
127 | * @inflight: tracked writes inflight |
128 | */ |
129 | TRACE_EVENT(wbt_timer, |
130 | |
131 | TP_PROTO(struct backing_dev_info *bdi, unsigned int status, |
132 | int step, unsigned int inflight), |
133 | |
134 | TP_ARGS(bdi, status, step, inflight), |
135 | |
136 | TP_STRUCT__entry( |
137 | __array(char, name, 32) |
138 | __field(unsigned int, status) |
139 | __field(int, step) |
140 | __field(unsigned int, inflight) |
141 | ), |
142 | |
143 | TP_fast_assign( |
144 | strscpy(__entry->name, bdi_dev_name(bdi), |
145 | ARRAY_SIZE(__entry->name)); |
146 | __entry->status = status; |
147 | __entry->step = step; |
148 | __entry->inflight = inflight; |
149 | ), |
150 | |
151 | TP_printk("%s: status=%u, step=%d, inflight=%u" , __entry->name, |
152 | __entry->status, __entry->step, __entry->inflight) |
153 | ); |
154 | |
155 | #endif /* _TRACE_WBT_H */ |
156 | |
157 | /* This part must be outside protection */ |
158 | #include <trace/define_trace.h> |
159 | |