Page MenuHomeFreeBSD

hwpmc(4): stop overwalking past _start on amd64 user callchains
ClosedPublic

Authored by nickbanks_netflix.com on Thu, Aug 27, 7:32 PM.
Tags
None
Referenced Files
Unknown Object (File)
Sun, Sep 20, 4:08 PM
Unknown Object (File)
Sun, Sep 20, 6:57 AM
Unknown Object (File)
Sat, Sep 19, 11:20 PM
Unknown Object (File)
Thu, Sep 17, 12:35 PM
Unknown Object (File)
Wed, Sep 16, 11:09 PM
Unknown Object (File)
Wed, Sep 16, 12:06 AM
Unknown Object (File)
Tue, Sep 15, 8:35 PM
Unknown Object (File)
Sun, Sep 13, 11:17 PM
Subscribers

Details

Summary

pmc_save_user_callchain() emits the pc it just loaded before checking
whether fp is the ABI's zero frame-chain terminator. At the bottom of
a well-formed chain under _start, fp comes back 0 as expected, but the
paired pc is stale rtld data left on the stack -- a legal userspace VA
that still passes PMC_IN_USERSPACE(), so it gets emitted as a bogus
extra frame. This shows up in flame graphs as a spurious hex-valued
root frame below _start.

Check fp == 0 alongside the existing checks before emitting, matching
how arm/arm64/powerpc already load the next fp before their check.

Measured via 1kHz hwpmc sampling on an OCA: stacks with any unresolved
hex frame drop from 23.9% to 1.3%, and stacks with hex at the root drop
from 5.5% to 0.3%.

Sponsored by: Netflix

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Not Applicable
Unit
Tests Not Applicable