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); 43 __assign_str(kind); 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); 102 __assign_str(kind); 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); 161 __assign_str(kind); 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); 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); 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); 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); 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); 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); 342 __assign_str(kind); 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); 387 __assign_str(kind); 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); 430 __assign_str(kind); 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