net: dsa: mv88e6xxx: replace VTU violation prints with trace points
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 9 Dec 2022 17:28:17 +0000 (19:28 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 12 Dec 2022 23:01:18 +0000 (15:01 -0800)
It is possible to trigger these VTU violation messages very easily,
it's only necessary to send packets with an unknown VLAN ID to a port
that belongs to a VLAN-aware bridge.

Do a similar thing as for ATU violation messages, and hide them in the
kernel's trace buffer.

New usage model:

$ trace-cmd list | grep mv88e6xxx
mv88e6xxx
mv88e6xxx:mv88e6xxx_vtu_miss_violation
mv88e6xxx:mv88e6xxx_vtu_member_violation
$ trace-cmd report

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Saeed Mahameed <saeed@kernel.org>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/mv88e6xxx/global1_vtu.c
drivers/net/dsa/mv88e6xxx/trace.h

index 38e18f5..bcfb4a8 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "chip.h"
 #include "global1.h"
+#include "trace.h"
 
 /* Offset 0x02: VTU FID Register */
 
@@ -628,14 +629,12 @@ static irqreturn_t mv88e6xxx_g1_vtu_prob_irq_thread_fn(int irq, void *dev_id)
        spid = val & MV88E6XXX_G1_VTU_OP_SPID_MASK;
 
        if (val & MV88E6XXX_G1_VTU_OP_MEMBER_VIOLATION) {
-               dev_err_ratelimited(chip->dev, "VTU member violation for vid %d, source port %d\n",
-                                   vid, spid);
+               trace_mv88e6xxx_vtu_member_violation(chip->dev, spid, vid);
                chip->ports[spid].vtu_member_violation++;
        }
 
        if (val & MV88E6XXX_G1_VTU_OP_MISS_VIOLATION) {
-               dev_dbg_ratelimited(chip->dev, "VTU miss violation for vid %d, source port %d\n",
-                                   vid, spid);
+               trace_mv88e6xxx_vtu_miss_violation(chip->dev, spid, vid);
                chip->ports[spid].vtu_miss_violation++;
        }
 
index d9ab5c8..f59ca04 100644 (file)
@@ -55,6 +55,36 @@ DEFINE_EVENT(mv88e6xxx_atu_violation, mv88e6xxx_atu_full_violation,
                      const unsigned char *addr, u16 fid),
             TP_ARGS(dev, spid, portvec, addr, fid));
 
+DECLARE_EVENT_CLASS(mv88e6xxx_vtu_violation,
+
+       TP_PROTO(const struct device *dev, int spid, u16 vid),
+
+       TP_ARGS(dev, spid, vid),
+
+       TP_STRUCT__entry(
+               __string(name, dev_name(dev))
+               __field(int, spid)
+               __field(u16, vid)
+       ),
+
+       TP_fast_assign(
+               __assign_str(name, dev_name(dev));
+               __entry->spid = spid;
+               __entry->vid = vid;
+       ),
+
+       TP_printk("dev %s spid %d vid %u",
+                 __get_str(name), __entry->spid, __entry->vid)
+);
+
+DEFINE_EVENT(mv88e6xxx_vtu_violation, mv88e6xxx_vtu_member_violation,
+            TP_PROTO(const struct device *dev, int spid, u16 vid),
+            TP_ARGS(dev, spid, vid));
+
+DEFINE_EVENT(mv88e6xxx_vtu_violation, mv88e6xxx_vtu_miss_violation,
+            TP_PROTO(const struct device *dev, int spid, u16 vid),
+            TP_ARGS(dev, spid, vid));
+
 #endif /* _MV88E6XXX_TRACE_H */
 
 /* We don't want to use include/trace/events */