mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
Partially revert "perf/arm-cmn: Optimise DTC counter accesses"
It turns out the optimisation implemented by commit4f2c3872dd
is totally broken, since all the places that consume hw->dtcs_used for events other than cycle count are still not expecting it to be sparsely populated, and fail to read all the relevant DTC counters correctly if so. If implemented correctly, the optimisation potentially saves up to 3 register reads per event update, which is reasonably significant for events targeting a single node, but still not worth a massive amount of additional code complexity overall. Getting it right within the current design looks a fair bit more involved than it was ever intended to be, so let's just make a functional revert which restores the old behaviour while still backporting easily. Fixes:4f2c3872dd
("perf/arm-cmn: Optimise DTC counter accesses") Reported-by: Ilkka Koskinen <ilkka@os.amperecomputing.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Link: https://lore.kernel.org/r/b41bb4ed7283c3d8400ce5cf5e6ec94915e6750f.1674498637.git.robin.murphy@arm.com Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
68a63a412d
commit
a428eb4b99
@ -1576,7 +1576,6 @@ static int arm_cmn_event_init(struct perf_event *event)
|
|||||||
hw->dn++;
|
hw->dn++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
hw->dtcs_used |= arm_cmn_node_to_xp(cmn, dn)->dtc;
|
|
||||||
hw->num_dns++;
|
hw->num_dns++;
|
||||||
if (bynodeid)
|
if (bynodeid)
|
||||||
break;
|
break;
|
||||||
@ -1589,6 +1588,12 @@ static int arm_cmn_event_init(struct perf_event *event)
|
|||||||
nodeid, nid.x, nid.y, nid.port, nid.dev, type);
|
nodeid, nid.x, nid.y, nid.port, nid.dev, type);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* Keep assuming non-cycles events count in all DTC domains; turns out
|
||||||
|
* it's hard to make a worthwhile optimisation around this, short of
|
||||||
|
* going all-in with domain-local counter allocation as well.
|
||||||
|
*/
|
||||||
|
hw->dtcs_used = (1U << cmn->num_dtcs) - 1;
|
||||||
|
|
||||||
return arm_cmn_validate_group(cmn, event);
|
return arm_cmn_validate_group(cmn, event);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user