A Decision Framework for MTE in the Real World

The evidence now supports a direct answer to the opening question. ARM MTE has no single performance cost because the measured result belongs to a complete path: a probabilistic tag contract, a chosen fault mode, a particular core implementation, a workload’s memory behavior, allocator and kernel policy, and the security job being performed. The practical judgment is not whether MTE is simply fast or slow. It is whether a defined MTE design delivers enough protection for a defined system at an acceptable and understood cost.

The evidence rejects both “negligible” and “too expensive”

The benchmark results establish a distribution, not a slogan. Many SPEC and server runs are close to baseline. Pixel Little cores show relatively small variation, with slowdowns of about 20% at most in the reported SPEC CPU 2006 measurements. AmpereOne’s SPEC CPU 2006 SYNC geomean is 1.10×, and the single-core SPEC CPU 2017 geomeans reported for AmpereOne and Apple M5 are 1.03× and 1.02×. Those results support the claim that MTE can be deployed with modest cost in many tested paths.

The same evidence rules out treating those averages as a universal promise. Pixel Performance reaches 6.64× on 456.hmmer and 2.37× on 464.h264ref in SYNC. Pixel Big reaches 1.82× on 403.gcc and 1.54× on both 471.omnetpp and 483.xalancbmk, including under ASYNC. AmpereOne reaches 1.43× on 456.hmmer, and the tested large-allocation 502.gcc_r input reaches 1.25× on AmpereOne and 1.29× on Apple M5. A service whose critical path resembles one of those patterns cannot safely inherit the geomean from a different workload.

The outliers also do not share one cause. On the Pixel Performance cores, the largest SYNC regression is associated with a store pipeline that does not allow speculative stores under synchronous MTE, making consecutive stores wait on earlier tag checks. On the Pixel Big core, ASYNC can still create backend stalls when random pointer dereferences and sequential or strided accesses produce cache misses that require both data and tag work. On AmpereOne, a store-to-load forwarding path interacts inconsistently with MTE; disabling forwarding makes the hmmer overhead negligible and reduces the suite geomean from 1.10× to 1.05×, although another benchmark then worsens. These cases are distinct failure surfaces, not three measurements of one unavoidable tax.

The full-stack server result adds a fourth kind of explanation. Memcached initially slows by as much as 1.40× in some many-core, read-heavy tests, even when the application itself does not use MTE. The study traces this to unnecessary kernel tag checks in the tested AmpereOne Linux configuration and reduces the worst case to about 1.05× with a kernel fix. In a remote multi-server setup, Memcached and Nginx show no statistically significant throughput difference with MTE. The local machine still had a measurable path-level cost; the remote service arrangement simply had a different visible bottleneck.

These results make “no single cost” more accurate than either extreme. “Negligible” ignores the tail and the conditions that produce it. “Too expensive” treats implementation limitations, configuration mistakes, and narrow workload interactions as if they were the definition of the architecture. The evidence instead supports a conditional conclusion: MTE is often practical, sometimes sharply costly, and diagnosable when the measurement preserves enough context to locate the work.

Protection value must be judged with its limits attached

Performance is only one side of the decision. MTE’s security value comes from making many temporal and spatial memory errors unreliable or detectable without demanding a fully memory-safe rewrite. Its 4-bit tags and 16-byte granules give broad hardware coverage, but random tagging is probabilistic: a mismatched tag is caught with a 15/16 chance under the ordinary model. Small overflows within a granule, intra-object violations, and attacks that learn tags or manipulate pointer bits remain outside that simple guarantee.

That limitation does not cancel the operational value of a detected failure.