1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #if IS_ENABLED(CONFIG_NET_DEVLINK) |
3 | |
4 | #undef TRACE_SYSTEM |
5 | #define TRACE_SYSTEM devlink |
6 | |
7 | #if !defined(_TRACE_DEVLINK_H) || defined(TRACE_HEADER_MULTI_READ) |
8 | #define _TRACE_DEVLINK_H |
9 | |
10 | #include <linux/device.h> |
11 | #include <net/devlink.h> |
12 | #include <linux/tracepoint.h> |
13 | |
14 | /* |
15 | * Tracepoint for devlink hardware message: |
16 | */ |
17 | TRACE_EVENT(devlink_hwmsg, |
18 | TP_PROTO(const struct devlink *devlink, bool incoming, |
19 | unsigned long type, const u8 *buf, size_t len), |
20 | |
21 | TP_ARGS(devlink, incoming, type, buf, len), |
22 | |
23 | TP_STRUCT__entry( |
24 | __string(bus_name, devlink_to_dev(devlink)->bus->name) |
25 | __string(dev_name, dev_name(devlink_to_dev(devlink))) |
26 | __string(driver_name, devlink_to_dev(devlink)->driver->name) |
27 | __field(bool, incoming) |
28 | __field(unsigned long, type) |
29 | __dynamic_array(u8, buf, len) |
30 | __field(size_t, len) |
31 | ), |
32 | |
33 | TP_fast_assign( |
34 | __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); |
35 | __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); |
36 | __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); |
37 | __entry->incoming = incoming; |
38 | __entry->type = type; |
39 | memcpy(__get_dynamic_array(buf), buf, len); |
40 | __entry->len = len; |
41 | ), |
42 | |
43 | TP_printk("bus_name=%s dev_name=%s driver_name=%s incoming=%d type=%lu buf=0x[%*phD] len=%zu" , |
44 | __get_str(bus_name), __get_str(dev_name), |
45 | __get_str(driver_name), __entry->incoming, __entry->type, |
46 | (int) __entry->len, __get_dynamic_array(buf), __entry->len) |
47 | ); |
48 | |
49 | /* |
50 | * Tracepoint for devlink hardware error: |
51 | */ |
52 | TRACE_EVENT(devlink_hwerr, |
53 | TP_PROTO(const struct devlink *devlink, int err, const char *msg), |
54 | |
55 | TP_ARGS(devlink, err, msg), |
56 | |
57 | TP_STRUCT__entry( |
58 | __string(bus_name, devlink_to_dev(devlink)->bus->name) |
59 | __string(dev_name, dev_name(devlink_to_dev(devlink))) |
60 | __string(driver_name, devlink_to_dev(devlink)->driver->name) |
61 | __field(int, err) |
62 | __string(msg, msg) |
63 | ), |
64 | |
65 | TP_fast_assign( |
66 | __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); |
67 | __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); |
68 | __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); |
69 | __entry->err = err; |
70 | __assign_str(msg, msg); |
71 | ), |
72 | |
73 | TP_printk("bus_name=%s dev_name=%s driver_name=%s err=%d %s" , |
74 | __get_str(bus_name), __get_str(dev_name), |
75 | __get_str(driver_name), __entry->err, __get_str(msg)) |
76 | ); |
77 | |
78 | /* |
79 | * Tracepoint for devlink health message: |
80 | */ |
81 | TRACE_EVENT(devlink_health_report, |
82 | TP_PROTO(const struct devlink *devlink, const char *reporter_name, |
83 | const char *msg), |
84 | |
85 | TP_ARGS(devlink, reporter_name, msg), |
86 | |
87 | TP_STRUCT__entry( |
88 | __string(bus_name, devlink_to_dev(devlink)->bus->name) |
89 | __string(dev_name, dev_name(devlink_to_dev(devlink))) |
90 | __string(driver_name, devlink_to_dev(devlink)->driver->name) |
91 | __string(reporter_name, reporter_name) |
92 | __string(msg, msg) |
93 | ), |
94 | |
95 | TP_fast_assign( |
96 | __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); |
97 | __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); |
98 | __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); |
99 | __assign_str(reporter_name, reporter_name); |
100 | __assign_str(msg, msg); |
101 | ), |
102 | |
103 | TP_printk("bus_name=%s dev_name=%s driver_name=%s reporter_name=%s: %s" , |
104 | __get_str(bus_name), __get_str(dev_name), |
105 | __get_str(driver_name), __get_str(reporter_name), |
106 | __get_str(msg)) |
107 | ); |
108 | |
109 | /* |
110 | * Tracepoint for devlink health recover aborted message: |
111 | */ |
112 | TRACE_EVENT(devlink_health_recover_aborted, |
113 | TP_PROTO(const struct devlink *devlink, const char *reporter_name, |
114 | bool health_state, u64 time_since_last_recover), |
115 | |
116 | TP_ARGS(devlink, reporter_name, health_state, time_since_last_recover), |
117 | |
118 | TP_STRUCT__entry( |
119 | __string(bus_name, devlink_to_dev(devlink)->bus->name) |
120 | __string(dev_name, dev_name(devlink_to_dev(devlink))) |
121 | __string(driver_name, devlink_to_dev(devlink)->driver->name) |
122 | __string(reporter_name, reporter_name) |
123 | __field(bool, health_state) |
124 | __field(u64, time_since_last_recover) |
125 | ), |
126 | |
127 | TP_fast_assign( |
128 | __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); |
129 | __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); |
130 | __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); |
131 | __assign_str(reporter_name, reporter_name); |
132 | __entry->health_state = health_state; |
133 | __entry->time_since_last_recover = time_since_last_recover; |
134 | ), |
135 | |
136 | TP_printk("bus_name=%s dev_name=%s driver_name=%s reporter_name=%s: health_state=%d time_since_last_recover=%llu recover aborted" , |
137 | __get_str(bus_name), __get_str(dev_name), |
138 | __get_str(driver_name), __get_str(reporter_name), |
139 | __entry->health_state, |
140 | __entry->time_since_last_recover) |
141 | ); |
142 | |
143 | /* |
144 | * Tracepoint for devlink health reporter state update: |
145 | */ |
146 | TRACE_EVENT(devlink_health_reporter_state_update, |
147 | TP_PROTO(const struct devlink *devlink, const char *reporter_name, |
148 | bool new_state), |
149 | |
150 | TP_ARGS(devlink, reporter_name, new_state), |
151 | |
152 | TP_STRUCT__entry( |
153 | __string(bus_name, devlink_to_dev(devlink)->bus->name) |
154 | __string(dev_name, dev_name(devlink_to_dev(devlink))) |
155 | __string(driver_name, devlink_to_dev(devlink)->driver->name) |
156 | __string(reporter_name, reporter_name) |
157 | __field(u8, new_state) |
158 | ), |
159 | |
160 | TP_fast_assign( |
161 | __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); |
162 | __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); |
163 | __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); |
164 | __assign_str(reporter_name, reporter_name); |
165 | __entry->new_state = new_state; |
166 | ), |
167 | |
168 | TP_printk("bus_name=%s dev_name=%s driver_name=%s reporter_name=%s: new_state=%d" , |
169 | __get_str(bus_name), __get_str(dev_name), |
170 | __get_str(driver_name), __get_str(reporter_name), |
171 | __entry->new_state) |
172 | ); |
173 | |
174 | /* |
175 | * Tracepoint for devlink packet trap: |
176 | */ |
177 | TRACE_EVENT(devlink_trap_report, |
178 | TP_PROTO(const struct devlink *devlink, struct sk_buff *skb, |
179 | const struct devlink_trap_metadata *metadata), |
180 | |
181 | TP_ARGS(devlink, skb, metadata), |
182 | |
183 | TP_STRUCT__entry( |
184 | __string(bus_name, devlink_to_dev(devlink)->bus->name) |
185 | __string(dev_name, dev_name(devlink_to_dev(devlink))) |
186 | __string(driver_name, devlink_to_dev(devlink)->driver->name) |
187 | __string(trap_name, metadata->trap_name) |
188 | __string(trap_group_name, metadata->trap_group_name) |
189 | __array(char, input_dev_name, IFNAMSIZ) |
190 | ), |
191 | |
192 | TP_fast_assign( |
193 | struct net_device *input_dev = metadata->input_dev; |
194 | |
195 | __assign_str(bus_name, devlink_to_dev(devlink)->bus->name); |
196 | __assign_str(dev_name, dev_name(devlink_to_dev(devlink))); |
197 | __assign_str(driver_name, devlink_to_dev(devlink)->driver->name); |
198 | __assign_str(trap_name, metadata->trap_name); |
199 | __assign_str(trap_group_name, metadata->trap_group_name); |
200 | strscpy(__entry->input_dev_name, input_dev ? input_dev->name : "NULL" , IFNAMSIZ); |
201 | ), |
202 | |
203 | TP_printk("bus_name=%s dev_name=%s driver_name=%s trap_name=%s " |
204 | "trap_group_name=%s input_dev_name=%s" , __get_str(bus_name), |
205 | __get_str(dev_name), __get_str(driver_name), |
206 | __get_str(trap_name), __get_str(trap_group_name), |
207 | __entry->input_dev_name) |
208 | ); |
209 | |
210 | #endif /* _TRACE_DEVLINK_H */ |
211 | |
212 | /* This part must be outside protection */ |
213 | #include <trace/define_trace.h> |
214 | |
215 | #else /* CONFIG_NET_DEVLINK */ |
216 | |
217 | #if !defined(_TRACE_DEVLINK_H) |
218 | #define _TRACE_DEVLINK_H |
219 | |
220 | #include <net/devlink.h> |
221 | |
222 | static inline void trace_devlink_hwmsg(const struct devlink *devlink, |
223 | bool incoming, unsigned long type, |
224 | const u8 *buf, size_t len) |
225 | { |
226 | } |
227 | |
228 | static inline void trace_devlink_hwerr(const struct devlink *devlink, |
229 | int err, const char *msg) |
230 | { |
231 | } |
232 | #endif /* _TRACE_DEVLINK_H */ |
233 | |
234 | #endif |
235 | |