Commit d11a609d authored by Vladimir Oltean's avatar Vladimir Oltean Committed by Zhang Changzhong
Browse files

net: dsa: mv88e6xxx: replace ATU violation prints with trace points

stable inclusion
from stable-v5.10.225
commit 5885217d666364f1e6ea8a735034bceff9c0ebb0
category: bugfix
bugzilla: https://gitee.com/src-openeuler/kernel/issues/IAOXZQ
CVE: CVE-2024-44988

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=5885217d666364f1e6ea8a735034bceff9c0ebb0



---------------------------

[ Upstream commit 8646384d ]

In applications where the switch ports must perform 802.1X based
authentication and are therefore locked, ATU violation interrupts are
quite to be expected as part of normal operation. The problem is that
they currently spam the kernel log, even if rate limited.

Create a series of trace points, all derived from the same event class,
which log these violations to the kernel's trace buffer, which is both
much faster and much easier to ignore than printing to a serial console.

New usage model:

$ trace-cmd list | grep mv88e6xxx
mv88e6xxx
mv88e6xxx:mv88e6xxx_atu_full_violation
mv88e6xxx:mv88e6xxx_atu_miss_violation
mv88e6xxx:mv88e6xxx_atu_member_violation
$ trace-cmd record -e mv88e6xxx sleep 10

Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarSaeed Mahameed <saeed@kernel.org>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Stable-dep-of: 528876d867a2 ("net: dsa: mv88e6xxx: Fix out-of-bound access")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarZhengchao Shao <shaozhengchao@huawei.com>
Signed-off-by: default avatarZhang Changzhong <zhangchangzhong@huawei.com>
parent 3b0eb6f1
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -15,3 +15,7 @@ mv88e6xxx-objs += port_hidden.o
mv88e6xxx-$(CONFIG_NET_DSA_MV88E6XXX_PTP) += ptp.o
mv88e6xxx-objs += serdes.o
mv88e6xxx-objs += smi.o
mv88e6xxx-objs += trace.o

# for tracing framework to find trace.h
CFLAGS_trace.o := -I$(src)
+10 −9
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@

#include "chip.h"
#include "global1.h"
#include "trace.h"

/* Offset 0x01: ATU FID Register */

@@ -435,23 +436,23 @@ static irqreturn_t mv88e6xxx_g1_atu_prob_irq_thread_fn(int irq, void *dev_id)
	}

	if (val & MV88E6XXX_G1_ATU_OP_MEMBER_VIOLATION) {
		dev_err_ratelimited(chip->dev,
				    "ATU member violation for %pM fid %u portvec %x spid %d\n",
				    entry.mac, fid, entry.portvec, spid);
		trace_mv88e6xxx_atu_member_violation(chip->dev, spid,
						     entry.portvec, entry.mac,
						     fid);
		chip->ports[spid].atu_member_violation++;
	}

	if (val & MV88E6XXX_G1_ATU_OP_MISS_VIOLATION) {
		dev_err_ratelimited(chip->dev,
				    "ATU miss violation for %pM fid %u portvec %x spid %d\n",
				    entry.mac, fid, entry.portvec, spid);
		trace_mv88e6xxx_atu_miss_violation(chip->dev, spid,
						   entry.portvec, entry.mac,
						   fid);
		chip->ports[spid].atu_miss_violation++;
	}

	if (val & MV88E6XXX_G1_ATU_OP_FULL_VIOLATION) {
		dev_err_ratelimited(chip->dev,
				    "ATU full violation for %pM fid %u portvec %x spid %d\n",
				    entry.mac, fid, entry.portvec, spid);
		trace_mv88e6xxx_atu_full_violation(chip->dev, spid,
						   entry.portvec, entry.mac,
						   fid);
		chip->ports[spid].atu_full_violation++;
	}
	mv88e6xxx_reg_unlock(chip);
+6 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/* Copyright 2022 NXP
 */

#define CREATE_TRACE_POINTS
#include "trace.h"
+66 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Copyright 2022 NXP
 */

#undef TRACE_SYSTEM
#define TRACE_SYSTEM	mv88e6xxx

#if !defined(_MV88E6XXX_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
#define _MV88E6XXX_TRACE_H

#include <linux/device.h>
#include <linux/if_ether.h>
#include <linux/tracepoint.h>

DECLARE_EVENT_CLASS(mv88e6xxx_atu_violation,

	TP_PROTO(const struct device *dev, int spid, u16 portvec,
		 const unsigned char *addr, u16 fid),

	TP_ARGS(dev, spid, portvec, addr, fid),

	TP_STRUCT__entry(
		__string(name, dev_name(dev))
		__field(int, spid)
		__field(u16, portvec)
		__array(unsigned char, addr, ETH_ALEN)
		__field(u16, fid)
	),

	TP_fast_assign(
		__assign_str(name, dev_name(dev));
		__entry->spid = spid;
		__entry->portvec = portvec;
		memcpy(__entry->addr, addr, ETH_ALEN);
		__entry->fid = fid;
	),

	TP_printk("dev %s spid %d portvec 0x%x addr %pM fid %u",
		  __get_str(name), __entry->spid, __entry->portvec,
		  __entry->addr, __entry->fid)
);

DEFINE_EVENT(mv88e6xxx_atu_violation, mv88e6xxx_atu_member_violation,
	     TP_PROTO(const struct device *dev, int spid, u16 portvec,
		      const unsigned char *addr, u16 fid),
	     TP_ARGS(dev, spid, portvec, addr, fid));

DEFINE_EVENT(mv88e6xxx_atu_violation, mv88e6xxx_atu_miss_violation,
	     TP_PROTO(const struct device *dev, int spid, u16 portvec,
		      const unsigned char *addr, u16 fid),
	     TP_ARGS(dev, spid, portvec, addr, fid));

DEFINE_EVENT(mv88e6xxx_atu_violation, mv88e6xxx_atu_full_violation,
	     TP_PROTO(const struct device *dev, int spid, u16 portvec,
		      const unsigned char *addr, u16 fid),
	     TP_ARGS(dev, spid, portvec, addr, fid));

#endif /* _MV88E6XXX_TRACE_H */

/* We don't want to use include/trace/events */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#undef TRACE_INCLUDE_FILE
#define TRACE_INCLUDE_FILE	trace
/* This part must be outside protection */
#include <trace/define_trace.h>