1 | /* SPDX-License-Identifier: GPL-2.0 |
2 | * Copyright 2022-2023 NXP |
3 | */ |
4 | |
5 | #undef TRACE_SYSTEM |
6 | #define TRACE_SYSTEM dsa |
7 | |
8 | #if !defined(_NET_DSA_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) |
9 | #define _NET_DSA_TRACE_H |
10 | |
11 | #include <net/dsa.h> |
12 | #include <net/switchdev.h> |
13 | #include <linux/etherdevice.h> |
14 | #include <linux/if_bridge.h> |
15 | #include <linux/refcount.h> |
16 | #include <linux/tracepoint.h> |
17 | |
18 | /* Enough to fit "bridge %s num %d" where num has 3 digits */ |
19 | #define DSA_DB_BUFSIZ (IFNAMSIZ + 16) |
20 | |
21 | void dsa_db_print(const struct dsa_db *db, char buf[DSA_DB_BUFSIZ]); |
22 | const char *dsa_port_kind(const struct dsa_port *dp); |
23 | |
24 | DECLARE_EVENT_CLASS(dsa_port_addr_op_hw, |
25 | |
26 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, u16 vid, |
27 | const struct dsa_db *db, int err), |
28 | |
29 | TP_ARGS(dp, addr, vid, db, err), |
30 | |
31 | TP_STRUCT__entry( |
32 | __string(dev, dev_name(dp->ds->dev)) |
33 | __string(kind, dsa_port_kind(dp)) |
34 | __field(int, port) |
35 | __array(unsigned char, addr, ETH_ALEN) |
36 | __field(u16, vid) |
37 | __array(char, db_buf, DSA_DB_BUFSIZ) |
38 | __field(int, err) |
39 | ), |
40 | |
41 | TP_fast_assign( |
42 | __assign_str(dev, dev_name(dp->ds->dev)); |
43 | __assign_str(kind, dsa_port_kind(dp)); |
44 | __entry->port = dp->index; |
45 | ether_addr_copy(__entry->addr, addr); |
46 | __entry->vid = vid; |
47 | dsa_db_print(db, __entry->db_buf); |
48 | __entry->err = err; |
49 | ), |
50 | |
51 | TP_printk("%s %s port %d addr %pM vid %u db \"%s\" err %d" , |
52 | __get_str(dev), __get_str(kind), __entry->port, __entry->addr, |
53 | __entry->vid, __entry->db_buf, __entry->err) |
54 | ); |
55 | |
56 | /* Add unicast/multicast address to hardware, either on user ports |
57 | * (where no refcounting is kept), or on shared ports when the entry |
58 | * is first seen and its refcount is 1. |
59 | */ |
60 | DEFINE_EVENT(dsa_port_addr_op_hw, dsa_fdb_add_hw, |
61 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
62 | u16 vid, const struct dsa_db *db, int err), |
63 | TP_ARGS(dp, addr, vid, db, err)); |
64 | |
65 | DEFINE_EVENT(dsa_port_addr_op_hw, dsa_mdb_add_hw, |
66 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
67 | u16 vid, const struct dsa_db *db, int err), |
68 | TP_ARGS(dp, addr, vid, db, err)); |
69 | |
70 | /* Delete unicast/multicast address from hardware, either on user ports or |
71 | * when the refcount on shared ports reaches 0 |
72 | */ |
73 | DEFINE_EVENT(dsa_port_addr_op_hw, dsa_fdb_del_hw, |
74 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
75 | u16 vid, const struct dsa_db *db, int err), |
76 | TP_ARGS(dp, addr, vid, db, err)); |
77 | |
78 | DEFINE_EVENT(dsa_port_addr_op_hw, dsa_mdb_del_hw, |
79 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
80 | u16 vid, const struct dsa_db *db, int err), |
81 | TP_ARGS(dp, addr, vid, db, err)); |
82 | |
83 | DECLARE_EVENT_CLASS(dsa_port_addr_op_refcount, |
84 | |
85 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, u16 vid, |
86 | const struct dsa_db *db, const refcount_t *refcount), |
87 | |
88 | TP_ARGS(dp, addr, vid, db, refcount), |
89 | |
90 | TP_STRUCT__entry( |
91 | __string(dev, dev_name(dp->ds->dev)) |
92 | __string(kind, dsa_port_kind(dp)) |
93 | __field(int, port) |
94 | __array(unsigned char, addr, ETH_ALEN) |
95 | __field(u16, vid) |
96 | __array(char, db_buf, DSA_DB_BUFSIZ) |
97 | __field(unsigned int, refcount) |
98 | ), |
99 | |
100 | TP_fast_assign( |
101 | __assign_str(dev, dev_name(dp->ds->dev)); |
102 | __assign_str(kind, dsa_port_kind(dp)); |
103 | __entry->port = dp->index; |
104 | ether_addr_copy(__entry->addr, addr); |
105 | __entry->vid = vid; |
106 | dsa_db_print(db, __entry->db_buf); |
107 | __entry->refcount = refcount_read(refcount); |
108 | ), |
109 | |
110 | TP_printk("%s %s port %d addr %pM vid %u db \"%s\" refcount %u" , |
111 | __get_str(dev), __get_str(kind), __entry->port, __entry->addr, |
112 | __entry->vid, __entry->db_buf, __entry->refcount) |
113 | ); |
114 | |
115 | /* Bump the refcount of an existing unicast/multicast address on shared ports */ |
116 | DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_fdb_add_bump, |
117 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
118 | u16 vid, const struct dsa_db *db, |
119 | const refcount_t *refcount), |
120 | TP_ARGS(dp, addr, vid, db, refcount)); |
121 | |
122 | DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_mdb_add_bump, |
123 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
124 | u16 vid, const struct dsa_db *db, |
125 | const refcount_t *refcount), |
126 | TP_ARGS(dp, addr, vid, db, refcount)); |
127 | |
128 | /* Drop the refcount of a multicast address that we still keep on |
129 | * shared ports |
130 | */ |
131 | DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_fdb_del_drop, |
132 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
133 | u16 vid, const struct dsa_db *db, |
134 | const refcount_t *refcount), |
135 | TP_ARGS(dp, addr, vid, db, refcount)); |
136 | |
137 | DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_mdb_del_drop, |
138 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
139 | u16 vid, const struct dsa_db *db, |
140 | const refcount_t *refcount), |
141 | TP_ARGS(dp, addr, vid, db, refcount)); |
142 | |
143 | DECLARE_EVENT_CLASS(dsa_port_addr_del_not_found, |
144 | |
145 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, u16 vid, |
146 | const struct dsa_db *db), |
147 | |
148 | TP_ARGS(dp, addr, vid, db), |
149 | |
150 | TP_STRUCT__entry( |
151 | __string(dev, dev_name(dp->ds->dev)) |
152 | __string(kind, dsa_port_kind(dp)) |
153 | __field(int, port) |
154 | __array(unsigned char, addr, ETH_ALEN) |
155 | __field(u16, vid) |
156 | __array(char, db_buf, DSA_DB_BUFSIZ) |
157 | ), |
158 | |
159 | TP_fast_assign( |
160 | __assign_str(dev, dev_name(dp->ds->dev)); |
161 | __assign_str(kind, dsa_port_kind(dp)); |
162 | __entry->port = dp->index; |
163 | ether_addr_copy(__entry->addr, addr); |
164 | __entry->vid = vid; |
165 | dsa_db_print(db, __entry->db_buf); |
166 | ), |
167 | |
168 | TP_printk("%s %s port %d addr %pM vid %u db \"%s\"" , |
169 | __get_str(dev), __get_str(kind), __entry->port, |
170 | __entry->addr, __entry->vid, __entry->db_buf) |
171 | ); |
172 | |
173 | /* Attempt to delete a unicast/multicast address on shared ports for which |
174 | * the delete operation was called more times than the addition |
175 | */ |
176 | DEFINE_EVENT(dsa_port_addr_del_not_found, dsa_fdb_del_not_found, |
177 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
178 | u16 vid, const struct dsa_db *db), |
179 | TP_ARGS(dp, addr, vid, db)); |
180 | |
181 | DEFINE_EVENT(dsa_port_addr_del_not_found, dsa_mdb_del_not_found, |
182 | TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, |
183 | u16 vid, const struct dsa_db *db), |
184 | TP_ARGS(dp, addr, vid, db)); |
185 | |
186 | TRACE_EVENT(dsa_lag_fdb_add_hw, |
187 | |
188 | TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr, |
189 | u16 vid, const struct dsa_db *db, int err), |
190 | |
191 | TP_ARGS(lag_dev, addr, vid, db, err), |
192 | |
193 | TP_STRUCT__entry( |
194 | __string(dev, lag_dev->name) |
195 | __array(unsigned char, addr, ETH_ALEN) |
196 | __field(u16, vid) |
197 | __array(char, db_buf, DSA_DB_BUFSIZ) |
198 | __field(int, err) |
199 | ), |
200 | |
201 | TP_fast_assign( |
202 | __assign_str(dev, lag_dev->name); |
203 | ether_addr_copy(__entry->addr, addr); |
204 | __entry->vid = vid; |
205 | dsa_db_print(db, __entry->db_buf); |
206 | __entry->err = err; |
207 | ), |
208 | |
209 | TP_printk("%s addr %pM vid %u db \"%s\" err %d" , |
210 | __get_str(dev), __entry->addr, __entry->vid, |
211 | __entry->db_buf, __entry->err) |
212 | ); |
213 | |
214 | TRACE_EVENT(dsa_lag_fdb_add_bump, |
215 | |
216 | TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr, |
217 | u16 vid, const struct dsa_db *db, const refcount_t *refcount), |
218 | |
219 | TP_ARGS(lag_dev, addr, vid, db, refcount), |
220 | |
221 | TP_STRUCT__entry( |
222 | __string(dev, lag_dev->name) |
223 | __array(unsigned char, addr, ETH_ALEN) |
224 | __field(u16, vid) |
225 | __array(char, db_buf, DSA_DB_BUFSIZ) |
226 | __field(unsigned int, refcount) |
227 | ), |
228 | |
229 | TP_fast_assign( |
230 | __assign_str(dev, lag_dev->name); |
231 | ether_addr_copy(__entry->addr, addr); |
232 | __entry->vid = vid; |
233 | dsa_db_print(db, __entry->db_buf); |
234 | __entry->refcount = refcount_read(refcount); |
235 | ), |
236 | |
237 | TP_printk("%s addr %pM vid %u db \"%s\" refcount %u" , |
238 | __get_str(dev), __entry->addr, __entry->vid, |
239 | __entry->db_buf, __entry->refcount) |
240 | ); |
241 | |
242 | TRACE_EVENT(dsa_lag_fdb_del_hw, |
243 | |
244 | TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr, |
245 | u16 vid, const struct dsa_db *db, int err), |
246 | |
247 | TP_ARGS(lag_dev, addr, vid, db, err), |
248 | |
249 | TP_STRUCT__entry( |
250 | __string(dev, lag_dev->name) |
251 | __array(unsigned char, addr, ETH_ALEN) |
252 | __field(u16, vid) |
253 | __array(char, db_buf, DSA_DB_BUFSIZ) |
254 | __field(int, err) |
255 | ), |
256 | |
257 | TP_fast_assign( |
258 | __assign_str(dev, lag_dev->name); |
259 | ether_addr_copy(__entry->addr, addr); |
260 | __entry->vid = vid; |
261 | dsa_db_print(db, __entry->db_buf); |
262 | __entry->err = err; |
263 | ), |
264 | |
265 | TP_printk("%s addr %pM vid %u db \"%s\" err %d" , |
266 | __get_str(dev), __entry->addr, __entry->vid, |
267 | __entry->db_buf, __entry->err) |
268 | ); |
269 | |
270 | TRACE_EVENT(dsa_lag_fdb_del_drop, |
271 | |
272 | TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr, |
273 | u16 vid, const struct dsa_db *db, const refcount_t *refcount), |
274 | |
275 | TP_ARGS(lag_dev, addr, vid, db, refcount), |
276 | |
277 | TP_STRUCT__entry( |
278 | __string(dev, lag_dev->name) |
279 | __array(unsigned char, addr, ETH_ALEN) |
280 | __field(u16, vid) |
281 | __array(char, db_buf, DSA_DB_BUFSIZ) |
282 | __field(unsigned int, refcount) |
283 | ), |
284 | |
285 | TP_fast_assign( |
286 | __assign_str(dev, lag_dev->name); |
287 | ether_addr_copy(__entry->addr, addr); |
288 | __entry->vid = vid; |
289 | dsa_db_print(db, __entry->db_buf); |
290 | __entry->refcount = refcount_read(refcount); |
291 | ), |
292 | |
293 | TP_printk("%s addr %pM vid %u db \"%s\" refcount %u" , |
294 | __get_str(dev), __entry->addr, __entry->vid, |
295 | __entry->db_buf, __entry->refcount) |
296 | ); |
297 | |
298 | TRACE_EVENT(dsa_lag_fdb_del_not_found, |
299 | |
300 | TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr, |
301 | u16 vid, const struct dsa_db *db), |
302 | |
303 | TP_ARGS(lag_dev, addr, vid, db), |
304 | |
305 | TP_STRUCT__entry( |
306 | __string(dev, lag_dev->name) |
307 | __array(unsigned char, addr, ETH_ALEN) |
308 | __field(u16, vid) |
309 | __array(char, db_buf, DSA_DB_BUFSIZ) |
310 | ), |
311 | |
312 | TP_fast_assign( |
313 | __assign_str(dev, lag_dev->name); |
314 | ether_addr_copy(__entry->addr, addr); |
315 | __entry->vid = vid; |
316 | dsa_db_print(db, __entry->db_buf); |
317 | ), |
318 | |
319 | TP_printk("%s addr %pM vid %u db \"%s\"" , |
320 | __get_str(dev), __entry->addr, __entry->vid, __entry->db_buf) |
321 | ); |
322 | |
323 | DECLARE_EVENT_CLASS(dsa_vlan_op_hw, |
324 | |
325 | TP_PROTO(const struct dsa_port *dp, |
326 | const struct switchdev_obj_port_vlan *vlan, int err), |
327 | |
328 | TP_ARGS(dp, vlan, err), |
329 | |
330 | TP_STRUCT__entry( |
331 | __string(dev, dev_name(dp->ds->dev)) |
332 | __string(kind, dsa_port_kind(dp)) |
333 | __field(int, port) |
334 | __field(u16, vid) |
335 | __field(u16, flags) |
336 | __field(bool, changed) |
337 | __field(int, err) |
338 | ), |
339 | |
340 | TP_fast_assign( |
341 | __assign_str(dev, dev_name(dp->ds->dev)); |
342 | __assign_str(kind, dsa_port_kind(dp)); |
343 | __entry->port = dp->index; |
344 | __entry->vid = vlan->vid; |
345 | __entry->flags = vlan->flags; |
346 | __entry->changed = vlan->changed; |
347 | __entry->err = err; |
348 | ), |
349 | |
350 | TP_printk("%s %s port %d vid %u%s%s%s" , |
351 | __get_str(dev), __get_str(kind), __entry->port, __entry->vid, |
352 | __entry->flags & BRIDGE_VLAN_INFO_PVID ? " pvid" : "" , |
353 | __entry->flags & BRIDGE_VLAN_INFO_UNTAGGED ? " untagged" : "" , |
354 | __entry->changed ? " (changed)" : "" ) |
355 | ); |
356 | |
357 | DEFINE_EVENT(dsa_vlan_op_hw, dsa_vlan_add_hw, |
358 | TP_PROTO(const struct dsa_port *dp, |
359 | const struct switchdev_obj_port_vlan *vlan, int err), |
360 | TP_ARGS(dp, vlan, err)); |
361 | |
362 | DEFINE_EVENT(dsa_vlan_op_hw, dsa_vlan_del_hw, |
363 | TP_PROTO(const struct dsa_port *dp, |
364 | const struct switchdev_obj_port_vlan *vlan, int err), |
365 | TP_ARGS(dp, vlan, err)); |
366 | |
367 | DECLARE_EVENT_CLASS(dsa_vlan_op_refcount, |
368 | |
369 | TP_PROTO(const struct dsa_port *dp, |
370 | const struct switchdev_obj_port_vlan *vlan, |
371 | const refcount_t *refcount), |
372 | |
373 | TP_ARGS(dp, vlan, refcount), |
374 | |
375 | TP_STRUCT__entry( |
376 | __string(dev, dev_name(dp->ds->dev)) |
377 | __string(kind, dsa_port_kind(dp)) |
378 | __field(int, port) |
379 | __field(u16, vid) |
380 | __field(u16, flags) |
381 | __field(bool, changed) |
382 | __field(unsigned int, refcount) |
383 | ), |
384 | |
385 | TP_fast_assign( |
386 | __assign_str(dev, dev_name(dp->ds->dev)); |
387 | __assign_str(kind, dsa_port_kind(dp)); |
388 | __entry->port = dp->index; |
389 | __entry->vid = vlan->vid; |
390 | __entry->flags = vlan->flags; |
391 | __entry->changed = vlan->changed; |
392 | __entry->refcount = refcount_read(refcount); |
393 | ), |
394 | |
395 | TP_printk("%s %s port %d vid %u%s%s%s refcount %u" , |
396 | __get_str(dev), __get_str(kind), __entry->port, __entry->vid, |
397 | __entry->flags & BRIDGE_VLAN_INFO_PVID ? " pvid" : "" , |
398 | __entry->flags & BRIDGE_VLAN_INFO_UNTAGGED ? " untagged" : "" , |
399 | __entry->changed ? " (changed)" : "" , __entry->refcount) |
400 | ); |
401 | |
402 | DEFINE_EVENT(dsa_vlan_op_refcount, dsa_vlan_add_bump, |
403 | TP_PROTO(const struct dsa_port *dp, |
404 | const struct switchdev_obj_port_vlan *vlan, |
405 | const refcount_t *refcount), |
406 | TP_ARGS(dp, vlan, refcount)); |
407 | |
408 | DEFINE_EVENT(dsa_vlan_op_refcount, dsa_vlan_del_drop, |
409 | TP_PROTO(const struct dsa_port *dp, |
410 | const struct switchdev_obj_port_vlan *vlan, |
411 | const refcount_t *refcount), |
412 | TP_ARGS(dp, vlan, refcount)); |
413 | |
414 | TRACE_EVENT(dsa_vlan_del_not_found, |
415 | |
416 | TP_PROTO(const struct dsa_port *dp, |
417 | const struct switchdev_obj_port_vlan *vlan), |
418 | |
419 | TP_ARGS(dp, vlan), |
420 | |
421 | TP_STRUCT__entry( |
422 | __string(dev, dev_name(dp->ds->dev)) |
423 | __string(kind, dsa_port_kind(dp)) |
424 | __field(int, port) |
425 | __field(u16, vid) |
426 | ), |
427 | |
428 | TP_fast_assign( |
429 | __assign_str(dev, dev_name(dp->ds->dev)); |
430 | __assign_str(kind, dsa_port_kind(dp)); |
431 | __entry->port = dp->index; |
432 | __entry->vid = vlan->vid; |
433 | ), |
434 | |
435 | TP_printk("%s %s port %d vid %u" , |
436 | __get_str(dev), __get_str(kind), __entry->port, __entry->vid) |
437 | ); |
438 | |
439 | #endif /* _NET_DSA_TRACE_H */ |
440 | |
441 | /* We don't want to use include/trace/events */ |
442 | #undef TRACE_INCLUDE_PATH |
443 | #define TRACE_INCLUDE_PATH . |
444 | #undef TRACE_INCLUDE_FILE |
445 | #define TRACE_INCLUDE_FILE trace |
446 | /* This part must be outside protection */ |
447 | #include <trace/define_trace.h> |
448 | |