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 		strlcpy(__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 		strlcpy(__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 		strlcpy(__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 		strlcpy(__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