[PATCH] perf/arm-cmn: Reject unsupported hardware configurations
Mark Rutland
mark.rutland at arm.com
Thu Jan 29 06:23:17 PST 2026
On Thu, Jan 29, 2026 at 02:11:22PM +0000, Robin Murphy wrote:
> So far we've been fairly lax about accepting both unknown CMN models
> (at least with a warning), and unknown revisions of those which we
> do know, as although things do frequently change between releases,
> typically enough remains the same to be somewhat useful for at least
> some basic bringup checks. However, we also make assumptions of the
> maximum supported sizes and numbers of things in various places, and
> there's no guarantee that something new might not be bigger and lead
> to nasty array overflows. Make sure we only try to run on things that
> actually match our assumptions and so will not risk memory corruption.
>
> Cc: stable at vger.kernel.org
> Fixes: 7819e05a0dce ("perf/arm-cmn: Revamp model detection")
> Signed-off-by: Robin Murphy <robin.murphy at arm.com>
> ---
> drivers/perf/arm-cmn.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c
> index 2903e01f951f..24fec53ceccc 100644
> --- a/drivers/perf/arm-cmn.c
> +++ b/drivers/perf/arm-cmn.c
> @@ -2422,6 +2422,15 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
> arm_cmn_init_node_info(cmn, reg & CMN_CHILD_NODE_ADDR, dn);
> dn->portid_bits = xp->portid_bits;
> dn->deviceid_bits = xp->deviceid_bits;
> + /*
> + * Logical IDs are assigned from 0 per node type, so as
> + * soon as we one bigger than expected, we can assume
> + * there are more than we can cope with.
> + */
> + if (dn->logid > CMN_MAX_NODES_PER_EVENT) {
> + dev_err(cmn->dev, "Invalid node number: %d\n", dn->logid);
> + return -ENODEV;
I think "Invalid" is ambiguous (it can read like we're saying the HW is
wrong), and it would be better to say "Unsupported", or something to
that effect, e.g.
dev_err(cmn->dev, "Node number (%d) larger than supported (%d)\n",
dn->logid, CMN_MAX_NODES_PER_EVENT)
> + }
>
> switch (dn->type) {
> case CMN_TYPE_DTC:
> @@ -2499,6 +2508,10 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
> cmn->mesh_x = cmn->num_xps;
> cmn->mesh_y = cmn->num_xps / cmn->mesh_x;
>
> + if (max(cmn->mesh_x, cmn->mesh_y) > CMN_MAX_DIMENSION) {
> + dev_err(cmn->dev, "Invalid mesh size: %dx%d\n", cmn->mesh_x, cmn->mesh_y);
Likewise:
dev_err(cmn->dev, "Mesh size (%%dx%d) larger than supported
(%d)\n", cmn->mesh_x, cmn->mesh_y, CMN_MAX_DIMENSION);
> + return -ENODEV;
> + }
> /* 1x1 config plays havoc with XP event encodings */
> if (cmn->num_xps == 1)
> dev_warn(cmn->dev, "1x1 config not fully supported, translate XP events manually\n");
... or you could align with the wording here.
Aside from the specific wording for the messages, this looks god to me.
Mark.
More information about the linux-arm-kernel
mailing list