On Tue, Jan 08, 2019 at 12:12:13PM +0000, Marc Zyngier wrote: > On 08/01/2019 12:03, Christoffer Dall wrote: > > On Tue, Jan 08, 2019 at 11:50:59AM +0000, Marc Zyngier wrote: > >> On Tue, 08 Jan 2019 11:25:13 +0000, > >> Andrew Murray <andrew.murray@xxxxxxx> wrote: > >> > >> Hi Andrew, > >> > >>> My only doubt about this is as follows. If, on a KVM host you run this: > >>> > >>> perf stat -e cycles:H lkvm run ... > >>> > >>> then on the VHE host the cycles reported represents the entire non-guest cycles > >>> associated with running the guest. > >>> > >>> On a !VHE, the cycles reported exclude EL2 (with or without this patch) and > >>> thus you don't get a representation of all the non-guest cycles associated with > >>> the guest. However without this patch you could at least still run: > >>> > >>> perf stat -e cycles:H -e cycles:h lkvm run ... > >>> > >>> and then add the two cycle counts together to get something comparative with > >>> the VHE host. > >>> > >>> If the above patch represents the desired semantics, then perhaps we must count > >>> both EL1 and *EL2* for !exclude_kernel on !VHE. In fact I think we should do > >>> this anyway and remove a little complexity from armv8pmu_set_event_filter. > >>> Thoughts? > >> > >> I'm not sure we should hide the architectural differences between VHE > >> and !VHE. If you're trying to measure what is happening at in the > >> hypervisor, you can't reason about it while ignoring the dual nature > >> of !VHE. > >> > > > > How do you define hypervisor here? Is that just the code that runs at > > EL2 or also parts of KVM that runs at EL1? > > I define it as "not a guest". Whatever is used to support a guest is the > hypervisor. > > > It remains unclear to me why you'd want to measure a subset of KVM, > > which happens to run in EL2, in your host (and hypervisor-enabled) > > kernel, and you are even precluded from measuring a comparable portion > > of your implementation on other Arm systems (VHE). > > Because I'm not trying to compare apples (VHE) and oranges (!VHE). My > use-case for perf is to measure the impact of a change on a given > implementation, and the more I can narrow the impact of that change, the > better (specially when !VHE precludes the use of other techniques such > as sampling). > Fair enough. I don't know if that's the only use case for perf we should consider though. > > Admittedly, I'm not at export in using perf, but I find this EL1/EL2 > > distinction out of place as it relates to exlude_kernel, exlude_user, > > and exlude_hv. Will we have a fourth Arm-specific flag which takes the > > place of exclude_hv on PowerPC, which excludes an underlying hypervisor > > when running a guest, should we ever support counting that in the > > future? > In all honestly, exclude_hv doesn't make much sense to me on a VHE > system, unless you define an arbitrary cutting point where things are on > one side or the other. As for a fourth flag, I have no idea. > I think this all boils down to how these flags are interpreted and represented to a user via tooling. If these flags must be considered in complete isolation on a particular system and architecture, then fine, we can define it as whatever we want, giving us a little bit more insight on where things happen on a !VHE system. If we care about these flags representing similar semantics to other architectures, then I contend that we are abusing the exclude_hv flag today, and exclude_hv should only ever have an effect when set within a guest, not in a host. Thanks, Christoffer _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm