Skip to content

Commit cd2aafa

Browse files
committed
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/[email protected]/ 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/[email protected]/#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/[email protected]/ ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 4cc58a0 + 9e3d9ae commit cd2aafa

File tree

5 files changed

+174
-24
lines changed

5 files changed

+174
-24
lines changed

drivers/net/dsa/mv88e6xxx/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,7 @@ mv88e6xxx-objs += port_hidden.o
1515
mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_PTP) += ptp.o
1616
mv88e6xxx-objs += serdes.o
1717
mv88e6xxx-objs += smi.o
18+
mv88e6xxx-objs += trace.o
19+
20+
# for tracing framework to find trace.h
21+
CFLAGS_trace.o := -I$(src)

drivers/net/dsa/mv88e6xxx/global1_atu.c

Lines changed: 65 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "chip.h"
1414
#include "global1.h"
15+
#include "trace.h"
1516

1617
/* Offset 0x01: ATU FID Register */
1718

@@ -114,6 +115,19 @@ static int mv88e6xxx_g1_atu_op_wait(struct mv88e6xxx_chip *chip)
114115
return mv88e6xxx_g1_wait_bit(chip, MV88E6XXX_G1_ATU_OP, bit, 0);
115116
}
116117

118+
static int mv88e6xxx_g1_read_atu_violation(struct mv88e6xxx_chip *chip)
119+
{
120+
int err;
121+
122+
err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_ATU_OP,
123+
MV88E6XXX_G1_ATU_OP_BUSY |
124+
MV88E6XXX_G1_ATU_OP_GET_CLR_VIOLATION);
125+
if (err)
126+
return err;
127+
128+
return mv88e6xxx_g1_atu_op_wait(chip);
129+
}
130+
117131
static int mv88e6xxx_g1_atu_op(struct mv88e6xxx_chip *chip, u16 fid, u16 op)
118132
{
119133
u16 val;
@@ -159,6 +173,41 @@ int mv88e6xxx_g1_atu_get_next(struct mv88e6xxx_chip *chip, u16 fid)
159173
return mv88e6xxx_g1_atu_op(chip, fid, MV88E6XXX_G1_ATU_OP_GET_NEXT_DB);
160174
}
161175

176+
static int mv88e6xxx_g1_atu_fid_read(struct mv88e6xxx_chip *chip, u16 *fid)
177+
{
178+
u16 val = 0, upper = 0, op = 0;
179+
int err = -EOPNOTSUPP;
180+
181+
if (mv88e6xxx_num_databases(chip) > 256) {
182+
err = mv88e6xxx_g1_read(chip, MV88E6352_G1_ATU_FID, &val);
183+
val &= 0xfff;
184+
if (err)
185+
return err;
186+
} else {
187+
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_OP, &op);
188+
if (err)
189+
return err;
190+
if (mv88e6xxx_num_databases(chip) > 64) {
191+
/* ATU DBNum[7:4] are located in ATU Control 15:12 */
192+
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_CTL,
193+
&upper);
194+
if (err)
195+
return err;
196+
197+
upper = (upper >> 8) & 0x00f0;
198+
} else if (mv88e6xxx_num_databases(chip) > 16) {
199+
/* ATU DBNum[5:4] are located in ATU Operation 9:8 */
200+
upper = (op >> 4) & 0x30;
201+
}
202+
203+
/* ATU DBNum[3:0] are located in ATU Operation 3:0 */
204+
val = (op & 0xf) | upper;
205+
}
206+
*fid = val;
207+
208+
return err;
209+
}
210+
162211
/* Offset 0x0C: ATU Data Register */
163212

164213
static int mv88e6xxx_g1_atu_data_read(struct mv88e6xxx_chip *chip,
@@ -353,21 +402,23 @@ static irqreturn_t mv88e6xxx_g1_atu_prob_irq_thread_fn(int irq, void *dev_id)
353402
{
354403
struct mv88e6xxx_chip *chip = dev_id;
355404
struct mv88e6xxx_atu_entry entry;
356-
int spid;
357-
int err;
358-
u16 val;
405+
int err, spid;
406+
u16 val, fid;
359407

360408
mv88e6xxx_reg_lock(chip);
361409

362-
err = mv88e6xxx_g1_atu_op(chip, 0,
363-
MV88E6XXX_G1_ATU_OP_GET_CLR_VIOLATION);
410+
err = mv88e6xxx_g1_read_atu_violation(chip);
364411
if (err)
365412
goto out;
366413

367414
err = mv88e6xxx_g1_read(chip, MV88E6XXX_G1_ATU_OP, &val);
368415
if (err)
369416
goto out;
370417

418+
err = mv88e6xxx_g1_atu_fid_read(chip, &fid);
419+
if (err)
420+
goto out;
421+
371422
err = mv88e6xxx_g1_atu_data_read(chip, &entry);
372423
if (err)
373424
goto out;
@@ -378,30 +429,24 @@ static irqreturn_t mv88e6xxx_g1_atu_prob_irq_thread_fn(int irq, void *dev_id)
378429

379430
spid = entry.state;
380431

381-
if (val & MV88E6XXX_G1_ATU_OP_AGE_OUT_VIOLATION) {
382-
dev_err_ratelimited(chip->dev,
383-
"ATU age out violation for %pM\n",
384-
entry.mac);
385-
}
386-
387432
if (val & MV88E6XXX_G1_ATU_OP_MEMBER_VIOLATION) {
388-
dev_err_ratelimited(chip->dev,
389-
"ATU member violation for %pM portvec %x spid %d\n",
390-
entry.mac, entry.portvec, spid);
433+
trace_mv88e6xxx_atu_member_violation(chip->dev, spid,
434+
entry.portvec, entry.mac,
435+
fid);
391436
chip->ports[spid].atu_member_violation++;
392437
}
393438

394439
if (val & MV88E6XXX_G1_ATU_OP_MISS_VIOLATION) {
395-
dev_err_ratelimited(chip->dev,
396-
"ATU miss violation for %pM portvec %x spid %d\n",
397-
entry.mac, entry.portvec, spid);
440+
trace_mv88e6xxx_atu_miss_violation(chip->dev, spid,
441+
entry.portvec, entry.mac,
442+
fid);
398443
chip->ports[spid].atu_miss_violation++;
399444
}
400445

401446
if (val & MV88E6XXX_G1_ATU_OP_FULL_VIOLATION) {
402-
dev_err_ratelimited(chip->dev,
403-
"ATU full violation for %pM portvec %x spid %d\n",
404-
entry.mac, entry.portvec, spid);
447+
trace_mv88e6xxx_atu_full_violation(chip->dev, spid,
448+
entry.portvec, entry.mac,
449+
fid);
405450
chip->ports[spid].atu_full_violation++;
406451
}
407452
mv88e6xxx_reg_unlock(chip);

drivers/net/dsa/mv88e6xxx/global1_vtu.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "chip.h"
1515
#include "global1.h"
16+
#include "trace.h"
1617

1718
/* Offset 0x02: VTU FID Register */
1819

@@ -628,14 +629,12 @@ static irqreturn_t mv88e6xxx_g1_vtu_prob_irq_thread_fn(int irq, void *dev_id)
628629
spid = val & MV88E6XXX_G1_VTU_OP_SPID_MASK;
629630

630631
if (val & MV88E6XXX_G1_VTU_OP_MEMBER_VIOLATION) {
631-
dev_err_ratelimited(chip->dev, "VTU member violation for vid %d, source port %d\n",
632-
vid, spid);
632+
trace_mv88e6xxx_vtu_member_violation(chip->dev, spid, vid);
633633
chip->ports[spid].vtu_member_violation++;
634634
}
635635

636636
if (val & MV88E6XXX_G1_VTU_OP_MISS_VIOLATION) {
637-
dev_dbg_ratelimited(chip->dev, "VTU miss violation for vid %d, source port %d\n",
638-
vid, spid);
637+
trace_mv88e6xxx_vtu_miss_violation(chip->dev, spid, vid);
639638
chip->ports[spid].vtu_miss_violation++;
640639
}
641640

drivers/net/dsa/mv88e6xxx/trace.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
/* Copyright 2022 NXP
3+
*/
4+
5+
#define CREATE_TRACE_POINTS
6+
#include "trace.h"

drivers/net/dsa/mv88e6xxx/trace.h

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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>

0 commit comments

Comments
 (0)