Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'trace-points-for-mv88e6xxx'

Vladimir Oltean says:

====================
Trace points for mv88e6xxx

While testing Hans Schultz' attempt at offloading MAB on mv88e6xxx:
https://patchwork.kernel.org/project/netdevbpf/cover/20221205185908.217520-1-netdev@kapio-technology.com/
I noticed that he still didn't get rid of the huge log spam caused by
ATU and VTU violations, even if we discussed about this:
https://patchwork.kernel.org/project/netdevbpf/cover/20221112203748.68995-1-netdev@kapio-technology.com/#25091076

It seems unlikely he's going to ever do this, so here is my own stab at
converting those messages to trace points. This is IMO an improvement
regardless of whether Hans' work with MAB lands or not, especially the
VTU violations which were quite annoying to me as well.

A small sample of before:

$ ./bridge_locked_port.sh lan1 lan2 lan3 lan4
[ 114.465272] mv88e6085 d0032004.mdio-mii:10: VTU member violation for vid 100, source port 9
[ 119.550508] mv88e6xxx_g1_vtu_prob_irq_thread_fn: 34 callbacks suppressed
[ 120.369586] mv88e6085 d0032004.mdio-mii:10: VTU member violation for vid 100, source port 9
[ 120.473658] mv88e6085 d0032004.mdio-mii:10: VTU member violation for vid 100, source port 9
[ 125.535209] mv88e6xxx_g1_vtu_prob_irq_thread_fn: 21 callbacks suppressed
[ 125.535243] mv88e6085 d0032004.mdio-mii:10: VTU member violation for vid 100, source port 9
[ 126.174558] mv88e6085 d0032004.mdio-mii:10: VTU member violation for vid 100, source port 9
[ 130.234055] mv88e6085 d0032004.mdio-mii:10: ATU miss violation for 00:01:02:03:04:01 fid 3 portvec 4 spid 2
[ 130.338193] mv88e6085 d0032004.mdio-mii:10: ATU miss violation for 00:01:02:03:04:01 fid 3 portvec 4 spid 2
[ 134.626099] mv88e6xxx_g1_atu_prob_irq_thread_fn: 38 callbacks suppressed
[ 134.626132] mv88e6085 d0032004.mdio-mii:10: ATU miss violation for 00:01:02:03:04:01 fid 3 portvec 4 spid 2

and after:

$ trace-cmd record -e mv88e6xxx ./bridge_locked_port.sh lan1 lan2 lan3 lan4
$ trace-cmd report
irq/35-moxtet-60 [001] 93.929734: mv88e6xxx_vtu_miss_violation: dev d0032004.mdio-mii:10 spid 9 vid 100
irq/35-moxtet-60 [001] 94.183209: mv88e6xxx_vtu_miss_violation: dev d0032004.mdio-mii:10 spid 9 vid 100
irq/35-moxtet-60 [001] 101.865545: mv88e6xxx_vtu_miss_violation: dev d0032004.mdio-mii:10 spid 9 vid 100
irq/35-moxtet-60 [001] 121.831261: mv88e6xxx_vtu_member_violation: dev d0032004.mdio-mii:10 spid 9 vid 100
irq/35-moxtet-60 [001] 122.371238: mv88e6xxx_vtu_member_violation: dev d0032004.mdio-mii:10 spid 9 vid 100
irq/35-moxtet-60 [001] 148.452932: mv88e6xxx_atu_miss_violation: dev d0032004.mdio-mii:10 spid 2 portvec 0x4 addr 00:01:02:03:04:01 fid 0

v1 at:
https://patchwork.kernel.org/project/netdevbpf/cover/20221207233954.3619276-1-vladimir.oltean@nxp.com/
====================

Link: https://lore.kernel.org/r/20221209172817.371434-1-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+174 -24
+4
drivers/net/dsa/mv88e6xxx/Makefile
··· 15 15 mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_PTP) += ptp.o 16 16 mv88e6xxx-objs += serdes.o 17 17 mv88e6xxx-objs += smi.o 18 + mv88e6xxx-objs += trace.o 19 + 20 + # for tracing framework to find trace.h 21 + CFLAGS_trace.o := -I$(src)
+65 -20
drivers/net/dsa/mv88e6xxx/global1_atu.c
··· 12 12 13 13 #include "chip.h" 14 14 #include "global1.h" 15 + #include "trace.h" 15 16 16 17 /* Offset 0x01: ATU FID Register */ 17 18 ··· 115 114 return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_ATU_OP, bit, 0); 116 115 } 117 116 117 + static int mv88e6xxx_g1_read_atu_violation(struct mv88e6xxx_chip *chip) 118 + { 119 + int err; 120 + 121 + err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_ATU_OP, 122 + MV88E6XXX_G1_ATU_OP_BUSY | 123 + MV88E6XXX_G1_ATU_OP_GET_CLR_VIOLATION); 124 + if (err) 125 + return err; 126 + 127 + return mv88e6xxx_g1_atu_op_wait(chip); 128 + } 129 + 118 130 static int mv88e6xxx_g1_atu_op(struct mv88e6xxx_chip *chip, u16 fid, u16 op) 119 131 { 120 132 u16 val; ··· 171 157 int mv88e6xxx_g1_atu_get_next(struct mv88e6xxx_chip *chip, u16 fid) 172 158 { 173 159 return mv88e6xxx_g1_atu_op(chip, fid, MV88E6XXX_G1_ATU_OP_GET_NEXT_DB); 160 + } 161 + 162 + static int mv88e6xxx_g1_atu_fid_read(struct mv88e6xxx_chip *chip, u16 *fid) 163 + { 164 + u16 val = 0, upper = 0, op = 0; 165 + int err = -EOPNOTSUPP; 166 + 167 + if (mv88e6xxx_num_databases(chip) > 256) { 168 + err = mv88e6xxx_g1_read(chip, MV88E6352_G1_ATU_FID, &val); 169 + val &= 0xfff; 170 + if (err) 171 + return err; 172 + } else { 173 + err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_OP, &op); 174 + if (err) 175 + return err; 176 + if (mv88e6xxx_num_databases(chip) > 64) { 177 + /* ATU DBNum[7:4] are located in ATU Control 15:12 */ 178 + err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_CTL, 179 + &upper); 180 + if (err) 181 + return err; 182 + 183 + upper = (upper >> 8) & 0x00f0; 184 + } else if (mv88e6xxx_num_databases(chip) > 16) { 185 + /* ATU DBNum[5:4] are located in ATU Operation 9:8 */ 186 + upper = (op >> 4) & 0x30; 187 + } 188 + 189 + /* ATU DBNum[3:0] are located in ATU Operation 3:0 */ 190 + val = (op & 0xf) | upper; 191 + } 192 + *fid = val; 193 + 194 + return err; 174 195 } 175 196 176 197 /* Offset 0x0C: ATU Data Register */ ··· 402 353 { 403 354 struct mv88e6xxx_chip *chip = dev_id; 404 355 struct mv88e6xxx_atu_entry entry; 405 - int spid; 406 - int err; 407 - u16 val; 356 + int err, spid; 357 + u16 val, fid; 408 358 409 359 mv88e6xxx_reg_lock(chip); 410 360 411 - err = mv88e6xxx_g1_atu_op(chip, 0, 412 - MV88E6XXX_G1_ATU_OP_GET_CLR_VIOLATION); 361 + err = mv88e6xxx_g1_read_atu_violation(chip); 413 362 if (err) 414 363 goto out; 415 364 416 365 err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_OP, &val); 366 + if (err) 367 + goto out; 368 + 369 + err = mv88e6xxx_g1_atu_fid_read(chip, &fid); 417 370 if (err) 418 371 goto out; 419 372 ··· 429 378 430 379 spid = entry.state; 431 380 432 - if (val & MV88E6XXX_G1_ATU_OP_AGE_OUT_VIOLATION) { 433 - dev_err_ratelimited(chip->dev, 434 - "ATU age out violation for %pM\n", 435 - entry.mac); 436 - } 437 - 438 381 if (val & MV88E6XXX_G1_ATU_OP_MEMBER_VIOLATION) { 439 - dev_err_ratelimited(chip->dev, 440 - "ATU member violation for %pM portvec %x spid %d\n", 441 - entry.mac, entry.portvec, spid); 382 + trace_mv88e6xxx_atu_member_violation(chip->dev, spid, 383 + entry.portvec, entry.mac, 384 + fid); 442 385 chip->ports[spid].atu_member_violation++; 443 386 } 444 387 445 388 if (val & MV88E6XXX_G1_ATU_OP_MISS_VIOLATION) { 446 - dev_err_ratelimited(chip->dev, 447 - "ATU miss violation for %pM portvec %x spid %d\n", 448 - entry.mac, entry.portvec, spid); 389 + trace_mv88e6xxx_atu_miss_violation(chip->dev, spid, 390 + entry.portvec, entry.mac, 391 + fid); 449 392 chip->ports[spid].atu_miss_violation++; 450 393 } 451 394 452 395 if (val & MV88E6XXX_G1_ATU_OP_FULL_VIOLATION) { 453 - dev_err_ratelimited(chip->dev, 454 - "ATU full violation for %pM portvec %x spid %d\n", 455 - entry.mac, entry.portvec, spid); 396 + trace_mv88e6xxx_atu_full_violation(chip->dev, spid, 397 + entry.portvec, entry.mac, 398 + fid); 456 399 chip->ports[spid].atu_full_violation++; 457 400 } 458 401 mv88e6xxx_reg_unlock(chip);
+3 -4
drivers/net/dsa/mv88e6xxx/global1_vtu.c
··· 13 13 14 14 #include "chip.h" 15 15 #include "global1.h" 16 + #include "trace.h" 16 17 17 18 /* Offset 0x02: VTU FID Register */ 18 19 ··· 629 628 spid = val & MV88E6XXX_G1_VTU_OP_SPID_MASK; 630 629 631 630 if (val & MV88E6XXX_G1_VTU_OP_MEMBER_VIOLATION) { 632 - dev_err_ratelimited(chip->dev, "VTU member violation for vid %d, source port %d\n", 633 - vid, spid); 631 + trace_mv88e6xxx_vtu_member_violation(chip->dev, spid, vid); 634 632 chip->ports[spid].vtu_member_violation++; 635 633 } 636 634 637 635 if (val & MV88E6XXX_G1_VTU_OP_MISS_VIOLATION) { 638 - dev_dbg_ratelimited(chip->dev, "VTU miss violation for vid %d, source port %d\n", 639 - vid, spid); 636 + trace_mv88e6xxx_vtu_miss_violation(chip->dev, spid, vid); 640 637 chip->ports[spid].vtu_miss_violation++; 641 638 } 642 639
+6
drivers/net/dsa/mv88e6xxx/trace.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* Copyright 2022 NXP 3 + */ 4 + 5 + #define CREATE_TRACE_POINTS 6 + #include "trace.h"
+96
drivers/net/dsa/mv88e6xxx/trace.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 + /* Copyright 2022 NXP 3 + */ 4 + 5 + #undef TRACE_SYSTEM 6 + #define TRACE_SYSTEM mv88e6xxx 7 + 8 + #if !defined(_MV88E6XXX_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) 9 + #define _MV88E6XXX_TRACE_H 10 + 11 + #include <linux/device.h> 12 + #include <linux/if_ether.h> 13 + #include <linux/tracepoint.h> 14 + 15 + DECLARE_EVENT_CLASS(mv88e6xxx_atu_violation, 16 + 17 + TP_PROTO(const struct device *dev, int spid, u16 portvec, 18 + const unsigned char *addr, u16 fid), 19 + 20 + TP_ARGS(dev, spid, portvec, addr, fid), 21 + 22 + TP_STRUCT__entry( 23 + __string(name, dev_name(dev)) 24 + __field(int, spid) 25 + __field(u16, portvec) 26 + __array(unsigned char, addr, ETH_ALEN) 27 + __field(u16, fid) 28 + ), 29 + 30 + TP_fast_assign( 31 + __assign_str(name, dev_name(dev)); 32 + __entry->spid = spid; 33 + __entry->portvec = portvec; 34 + memcpy(__entry->addr, addr, ETH_ALEN); 35 + __entry->fid = fid; 36 + ), 37 + 38 + TP_printk("dev %s spid %d portvec 0x%x addr %pM fid %u", 39 + __get_str(name), __entry->spid, __entry->portvec, 40 + __entry->addr, __entry->fid) 41 + ); 42 + 43 + DEFINE_EVENT(mv88e6xxx_atu_violation, mv88e6xxx_atu_member_violation, 44 + TP_PROTO(const struct device *dev, int spid, u16 portvec, 45 + const unsigned char *addr, u16 fid), 46 + TP_ARGS(dev, spid, portvec, addr, fid)); 47 + 48 + DEFINE_EVENT(mv88e6xxx_atu_violation, mv88e6xxx_atu_miss_violation, 49 + TP_PROTO(const struct device *dev, int spid, u16 portvec, 50 + const unsigned char *addr, u16 fid), 51 + TP_ARGS(dev, spid, portvec, addr, fid)); 52 + 53 + DEFINE_EVENT(mv88e6xxx_atu_violation, mv88e6xxx_atu_full_violation, 54 + TP_PROTO(const struct device *dev, int spid, u16 portvec, 55 + const unsigned char *addr, u16 fid), 56 + TP_ARGS(dev, spid, portvec, addr, fid)); 57 + 58 + DECLARE_EVENT_CLASS(mv88e6xxx_vtu_violation, 59 + 60 + TP_PROTO(const struct device *dev, int spid, u16 vid), 61 + 62 + TP_ARGS(dev, spid, vid), 63 + 64 + TP_STRUCT__entry( 65 + __string(name, dev_name(dev)) 66 + __field(int, spid) 67 + __field(u16, vid) 68 + ), 69 + 70 + TP_fast_assign( 71 + __assign_str(name, dev_name(dev)); 72 + __entry->spid = spid; 73 + __entry->vid = vid; 74 + ), 75 + 76 + TP_printk("dev %s spid %d vid %u", 77 + __get_str(name), __entry->spid, __entry->vid) 78 + ); 79 + 80 + DEFINE_EVENT(mv88e6xxx_vtu_violation, mv88e6xxx_vtu_member_violation, 81 + TP_PROTO(const struct device *dev, int spid, u16 vid), 82 + TP_ARGS(dev, spid, vid)); 83 + 84 + DEFINE_EVENT(mv88e6xxx_vtu_violation, mv88e6xxx_vtu_miss_violation, 85 + TP_PROTO(const struct device *dev, int spid, u16 vid), 86 + TP_ARGS(dev, spid, vid)); 87 + 88 + #endif /* _MV88E6XXX_TRACE_H */ 89 + 90 + /* We don't want to use include/trace/events */ 91 + #undef TRACE_INCLUDE_PATH 92 + #define TRACE_INCLUDE_PATH . 93 + #undef TRACE_INCLUDE_FILE 94 + #define TRACE_INCLUDE_FILE trace 95 + /* This part must be outside protection */ 96 + #include <trace/define_trace.h>