-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64: docs: Document perf event attributes
The interaction between the exclude_{host,guest} flags, exclude_{user,kernel,hv} flags and presence of VHE can result in different exception levels being filtered by the ARMv8 PMU. As this can be confusing let's document how they work on arm64. Signed-off-by: Andrew Murray <andrew.murray@arm.com> Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com> Acked-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
- Loading branch information
Andrew Murray
authored and
Marc Zyngier
committed
Apr 24, 2019
1 parent
39e3406
commit a9bf313
Showing
1 changed file
with
85 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
Perf Event Attributes | ||
===================== | ||
|
||
Author: Andrew Murray <andrew.murray@arm.com> | ||
Date: 2019-03-06 | ||
|
||
exclude_user | ||
------------ | ||
|
||
This attribute excludes userspace. | ||
|
||
Userspace always runs at EL0 and thus this attribute will exclude EL0. | ||
|
||
|
||
exclude_kernel | ||
-------------- | ||
|
||
This attribute excludes the kernel. | ||
|
||
The kernel runs at EL2 with VHE and EL1 without. Guest kernels always run | ||
at EL1. | ||
|
||
For the host this attribute will exclude EL1 and additionally EL2 on a VHE | ||
system. | ||
|
||
For the guest this attribute will exclude EL1. Please note that EL2 is | ||
never counted within a guest. | ||
|
||
|
||
exclude_hv | ||
---------- | ||
|
||
This attribute excludes the hypervisor. | ||
|
||
For a VHE host this attribute is ignored as we consider the host kernel to | ||
be the hypervisor. | ||
|
||
For a non-VHE host this attribute will exclude EL2 as we consider the | ||
hypervisor to be any code that runs at EL2 which is predominantly used for | ||
guest/host transitions. | ||
|
||
For the guest this attribute has no effect. Please note that EL2 is | ||
never counted within a guest. | ||
|
||
|
||
exclude_host / exclude_guest | ||
---------------------------- | ||
|
||
These attributes exclude the KVM host and guest, respectively. | ||
|
||
The KVM host may run at EL0 (userspace), EL1 (non-VHE kernel) and EL2 (VHE | ||
kernel or non-VHE hypervisor). | ||
|
||
The KVM guest may run at EL0 (userspace) and EL1 (kernel). | ||
|
||
Due to the overlapping exception levels between host and guests we cannot | ||
exclusively rely on the PMU's hardware exception filtering - therefore we | ||
must enable/disable counting on the entry and exit to the guest. This is | ||
performed differently on VHE and non-VHE systems. | ||
|
||
For non-VHE systems we exclude EL2 for exclude_host - upon entering and | ||
exiting the guest we disable/enable the event as appropriate based on the | ||
exclude_host and exclude_guest attributes. | ||
|
||
For VHE systems we exclude EL1 for exclude_guest and exclude both EL0,EL2 | ||
for exclude_host. Upon entering and exiting the guest we modify the event | ||
to include/exclude EL0 as appropriate based on the exclude_host and | ||
exclude_guest attributes. | ||
|
||
The statements above also apply when these attributes are used within a | ||
non-VHE guest however please note that EL2 is never counted within a guest. | ||
|
||
|
||
Accuracy | ||
-------- | ||
|
||
On non-VHE hosts we enable/disable counters on the entry/exit of host/guest | ||
transition at EL2 - however there is a period of time between | ||
enabling/disabling the counters and entering/exiting the guest. We are | ||
able to eliminate counters counting host events on the boundaries of guest | ||
entry/exit when counting guest events by filtering out EL2 for | ||
exclude_host. However when using !exclude_hv there is a small blackout | ||
window at the guest entry/exit where host events are not captured. | ||
|
||
On VHE systems there are no blackout windows. |