Messages in this thread | | | Date | Tue, 29 Nov 2022 15:53:32 +0000 | Subject | Re: [PATCH V5 6/7] arm64/perf: Add BRBE driver | From | James Clark <> |
| |
On 07/11/2022 06:25, Anshuman Khandual wrote: > This adds a BRBE driver which implements all the required helper functions > for struct arm_pmu. Following functions are defined by this driver which > will configure, enable, capture, reset and disable BRBE buffer HW as and > when requested via perf branch stack sampling framework.
Hi Anshuman,
I've got a rough version of an updated test for branch stacks here [1]. A couple of interesting things that I've noticed running it:
First one is that sometimes I get (null) for the branch type. Debugging in GDB shows me that the type is actually type == PERF_BR_EXTEND_ABI && new_type == 11. I can't see how this is possible looking at the driver code. I think I saw this on a previous version of the patchset too but didn't mention it because I thought it wasn't significant, but now I see that something strange is going on. An interesting pattern is that they are always after ERET samples and go from userspace to kernel:
41992866945460 0x6e8 [0x360]: PERF_RECORD_SAMPLE(IP, 0x1): 501/501: 0xffff800008010118 period: 1229 addr: 0 ... branch stack: nr:34 .. 007a9988 -> 00000000 0 cycles P 9fbfbfbf IRQ .. 00000000 -> 007a9988 0 cycles P 9fbfbfbf ERET .. 007a9988 -> 00000000 0 cycles P 9fbfbfbf (null) .. 00747668 -> 007a9988 0 cycles P 9fbfbfbf CALL .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00747664 -> 00747660 0 cycles P 9fbfbfbf COND .. 00000000 -> 00747658 0 cycles P 9fbfbfbf ERET .. 00747658 -> 00000000 0 cycles P 9fbfbfbf ARM64_DEBUG_DATA .. 00000000 -> 00747650 0 cycles P 9fbfbfbf ERET .. 00747650 -> 00000000 0 cycles P 9fbfbfbf ARM64_DEBUG_DATA .. 00747624 -> 00747634 0 cycles P 9fbfbfbf COND .. 00000000 -> 007475f4 0 cycles P 9fbfbfbf ERET .. 007475f4 -> 00000000 0 cycles P 9fbfbfbf ARM64_DEBUG_DATA .. 00000000 -> 007475e8 0 cycles P 9fbfbfbf ERET .. 007475e8 -> 00000000 0 cycles P 9fbfbfbf (null) .. 004005ac -> 007475e8 0 cycles P 9fbfbfbf CALL .. 00000000 -> 00400564 0 cycles P 9fbfbfbf ERET .. 00400564 -> 00000000 0 cycles P 9fbfbfbf (null) .. 00000000 -> 00400564 0 cycles P 9fbfbfbf ERET .. thread: perf:501 ...... dso: [kernel.kallsyms]
The second one is that sometimes I get kernel addresses and RET branches even if the option is any_call,u. The pattern here is that it's the last non empty branch stack of a run, so maybe there is some disable path where the filters aren't configured properly:
armv8pmu_brbe_enable+0xc/arm64_pmu_brbe_enable+0x0/P/-/-/0/CALL armpmu_start+0xe0/armv8pmu_brbe_enable+0x0/P/-/-/0/IND_CALL armv8pmu_brbe_reset+0x18/armpmu_start+0xd0/P/-/-/0/RET arm64_pmu_brbe_reset+0x18/armv8pmu_brbe_reset+0x10/P/-/-/0/RET
[1]: https://gitlab.arm.com/linux-arm/linux-jc/-/commit/7260b7bef06ac161eac88d05266e8c5c303d9881
| |