[PATCH] perf/arm-cmn: Reject unsupported hardware configurations
Robin Murphy
robin.murphy at arm.com
Fri Jan 30 03:41:13 PST 2026
On 2026-01-30 3:57 am, Ilkka Koskinen wrote:
>
>
> Hi Robin,
>
> On Thu, 29 Jan 2026, 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
>
> Should that be something like:
>
> "...as soon as we see one bigger than expected.."
Erm, indeed "see" is what I was trying to type... apparently it didn't
make it all the way to my fingers.
> Other than that, the patch looks good to me.
>
> Reviewed-by: Ilkka Koskinen <ilkka at os.amperecomputing.com>
Thanks!
Robin.
>
> Cheers, Ilkka
>
>> + * 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;
>> + }
>>
>> 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);
>> + 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");
>> --
>> 2.39.2.101.g768bb238c484.dirty
>>
>>
>>
More information about the linux-arm-kernel
mailing list