From: Andrew Murray <andrew.murray@arm.com> To: Will Deacon <will.deacon@arm.com> Cc: Marc Zyngier <marc.zyngier@arm.com>, Catalin Marinas <catalin.marinas@arm.com>, kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v12 4/8] arm64: arm_pmu: Add !VHE support for exclude_host/exclude_guest attributes Date: Thu, 4 Apr 2019 20:48:44 +0100 [thread overview] Message-ID: <20190404194843.GR53702@e119886-lin.cambridge.arm.com> (raw) In-Reply-To: <20190404163400.GA28903@fuggles.cambridge.arm.com> On Thu, Apr 04, 2019 at 05:34:00PM +0100, Will Deacon wrote: > On Thu, Mar 28, 2019 at 10:37:27AM +0000, Andrew Murray wrote: > > Add support for the :G and :H attributes in perf by handling the > > exclude_host/exclude_guest event attributes. > > > > We notify KVM of counters that we wish to be enabled or disabled on > > guest entry/exit and thus defer from starting or stopping events based > > on their event attributes. > > > > With !VHE we switch the counters between host/guest at EL2. We are able > > to eliminate counters counting host events on the boundaries of guest > > entry/exit when using :G by filtering out EL2 for exclude_host. When > > using !exclude_hv there is a small blackout window at the guest > > entry/exit where host events are not captured. > > > > Signed-off-by: Andrew Murray <andrew.murray@arm.com> > > --- > > arch/arm64/kernel/perf_event.c | 43 ++++++++++++++++++++++++++++------ > > 1 file changed, 36 insertions(+), 7 deletions(-) > > > > diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c > > index cccf4fc86d67..6bb28aaf5aea 100644 > > --- a/arch/arm64/kernel/perf_event.c > > +++ b/arch/arm64/kernel/perf_event.c > > @@ -26,6 +26,7 @@ > > > > #include <linux/acpi.h> > > #include <linux/clocksource.h> > > +#include <linux/kvm_host.h> > > #include <linux/of.h> > > #include <linux/perf/arm_pmu.h> > > #include <linux/platform_device.h> > > @@ -528,11 +529,21 @@ static inline int armv8pmu_enable_counter(int idx) > > > > static inline void armv8pmu_enable_event_counter(struct perf_event *event) > > { > > + struct perf_event_attr *attr = &event->attr; > > int idx = event->hw.idx; > > + u32 counter_bits = BIT(ARMV8_IDX_TO_COUNTER(idx)); > > > > - armv8pmu_enable_counter(idx); > > if (armv8pmu_event_is_chained(event)) > > - armv8pmu_enable_counter(idx - 1); > > + counter_bits |= BIT(ARMV8_IDX_TO_COUNTER(idx - 1)); > > + > > + kvm_set_pmu_events(counter_bits, attr); > > + > > + /* We rely on the hypervisor switch code to enable guest counters */ > > + if (!kvm_pmu_counter_deferred(attr)) { > > + armv8pmu_enable_counter(idx); > > + if (armv8pmu_event_is_chained(event)) > > + armv8pmu_enable_counter(idx - 1); > > + } > > } > > > > static inline int armv8pmu_disable_counter(int idx) > > @@ -545,11 +556,21 @@ static inline int armv8pmu_disable_counter(int idx) > > static inline void armv8pmu_disable_event_counter(struct perf_event *event) > > { > > struct hw_perf_event *hwc = &event->hw; > > + struct perf_event_attr *attr = &event->attr; > > int idx = hwc->idx; > > + u32 counter_bits = BIT(ARMV8_IDX_TO_COUNTER(idx)); > > > > if (armv8pmu_event_is_chained(event)) > > - armv8pmu_disable_counter(idx - 1); > > - armv8pmu_disable_counter(idx); > > + counter_bits |= BIT(ARMV8_IDX_TO_COUNTER(idx - 1)); > > + > > + kvm_clr_pmu_events(counter_bits); > > + > > + /* We rely on the hypervisor switch code to disable guest counters */ > > + if (!kvm_pmu_counter_deferred(attr)) { > > + if (armv8pmu_event_is_chained(event)) > > + armv8pmu_disable_counter(idx - 1); > > + armv8pmu_disable_counter(idx); > > + } > > } > > > > static inline int armv8pmu_enable_intens(int idx) > > @@ -829,11 +850,16 @@ static int armv8pmu_set_event_filter(struct hw_perf_event *event, > > if (!attr->exclude_kernel) > > config_base |= ARMV8_PMU_INCLUDE_EL2; > > } else { > > - if (attr->exclude_kernel) > > - config_base |= ARMV8_PMU_EXCLUDE_EL1; > > - if (!attr->exclude_hv) > > + if (!attr->exclude_hv && !attr->exclude_host) > > config_base |= ARMV8_PMU_INCLUDE_EL2; > > FWIW, that doesn't align with my personal view of what the host is, but > I'm not going to argue if Marc and Christoffer are happy with it. Ideally armv8pmu_set_event_filter needs no knowledge of exclude_guest and exclude_host as we leave the config_base alone and instead rely on turning the counters on/off at guest entry/exit... The addition of "&& !attr->exclude_host" here (!VHE) and likewise for VHE in "arm64: KVM: Enable VHE support for :G/:H perf event modifiers" (in case you missed it) is to eliminate counters counting host events on the boundaries of guest entry/exit when counting for guest_only (:G). Thus this is really an optimisation for more accurate counting. Consider the case where a user wants to record guest events only - we switch over to the guest counters at EL2 on world-switch (both VHE and !VHE host) - now there is a small period of time between when we start the guest counters and when we actually jump into the guest. This period of time in the host shouldn't be counted - therefore so long as exclude_host is set we can filter EL2 to remove these unwanted counts. Therefore the above hunks likely won't describe what our view of the host is. > > Anyway, thanks for persevering with this: It's fun even though it hurts my head every time each time I come back to this. > > Acked-by: Will Deacon <will.deacon@arm.com> Thanks, Andrew Murray > > Will
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Murray <andrew.murray@arm.com> To: Will Deacon <will.deacon@arm.com> Cc: Mark Rutland <mark.rutland@arm.com>, Suzuki K Poulose <suzuki.poulose@arm.com>, Marc Zyngier <marc.zyngier@arm.com>, Catalin Marinas <catalin.marinas@arm.com>, Julien Thierry <julien.thierry@arm.com>, Christoffer Dall <christoffer.dall@arm.com>, kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v12 4/8] arm64: arm_pmu: Add !VHE support for exclude_host/exclude_guest attributes Date: Thu, 4 Apr 2019 20:48:44 +0100 [thread overview] Message-ID: <20190404194843.GR53702@e119886-lin.cambridge.arm.com> (raw) In-Reply-To: <20190404163400.GA28903@fuggles.cambridge.arm.com> On Thu, Apr 04, 2019 at 05:34:00PM +0100, Will Deacon wrote: > On Thu, Mar 28, 2019 at 10:37:27AM +0000, Andrew Murray wrote: > > Add support for the :G and :H attributes in perf by handling the > > exclude_host/exclude_guest event attributes. > > > > We notify KVM of counters that we wish to be enabled or disabled on > > guest entry/exit and thus defer from starting or stopping events based > > on their event attributes. > > > > With !VHE we switch the counters between host/guest at EL2. We are able > > to eliminate counters counting host events on the boundaries of guest > > entry/exit when using :G by filtering out EL2 for exclude_host. When > > using !exclude_hv there is a small blackout window at the guest > > entry/exit where host events are not captured. > > > > Signed-off-by: Andrew Murray <andrew.murray@arm.com> > > --- > > arch/arm64/kernel/perf_event.c | 43 ++++++++++++++++++++++++++++------ > > 1 file changed, 36 insertions(+), 7 deletions(-) > > > > diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c > > index cccf4fc86d67..6bb28aaf5aea 100644 > > --- a/arch/arm64/kernel/perf_event.c > > +++ b/arch/arm64/kernel/perf_event.c > > @@ -26,6 +26,7 @@ > > > > #include <linux/acpi.h> > > #include <linux/clocksource.h> > > +#include <linux/kvm_host.h> > > #include <linux/of.h> > > #include <linux/perf/arm_pmu.h> > > #include <linux/platform_device.h> > > @@ -528,11 +529,21 @@ static inline int armv8pmu_enable_counter(int idx) > > > > static inline void armv8pmu_enable_event_counter(struct perf_event *event) > > { > > + struct perf_event_attr *attr = &event->attr; > > int idx = event->hw.idx; > > + u32 counter_bits = BIT(ARMV8_IDX_TO_COUNTER(idx)); > > > > - armv8pmu_enable_counter(idx); > > if (armv8pmu_event_is_chained(event)) > > - armv8pmu_enable_counter(idx - 1); > > + counter_bits |= BIT(ARMV8_IDX_TO_COUNTER(idx - 1)); > > + > > + kvm_set_pmu_events(counter_bits, attr); > > + > > + /* We rely on the hypervisor switch code to enable guest counters */ > > + if (!kvm_pmu_counter_deferred(attr)) { > > + armv8pmu_enable_counter(idx); > > + if (armv8pmu_event_is_chained(event)) > > + armv8pmu_enable_counter(idx - 1); > > + } > > } > > > > static inline int armv8pmu_disable_counter(int idx) > > @@ -545,11 +556,21 @@ static inline int armv8pmu_disable_counter(int idx) > > static inline void armv8pmu_disable_event_counter(struct perf_event *event) > > { > > struct hw_perf_event *hwc = &event->hw; > > + struct perf_event_attr *attr = &event->attr; > > int idx = hwc->idx; > > + u32 counter_bits = BIT(ARMV8_IDX_TO_COUNTER(idx)); > > > > if (armv8pmu_event_is_chained(event)) > > - armv8pmu_disable_counter(idx - 1); > > - armv8pmu_disable_counter(idx); > > + counter_bits |= BIT(ARMV8_IDX_TO_COUNTER(idx - 1)); > > + > > + kvm_clr_pmu_events(counter_bits); > > + > > + /* We rely on the hypervisor switch code to disable guest counters */ > > + if (!kvm_pmu_counter_deferred(attr)) { > > + if (armv8pmu_event_is_chained(event)) > > + armv8pmu_disable_counter(idx - 1); > > + armv8pmu_disable_counter(idx); > > + } > > } > > > > static inline int armv8pmu_enable_intens(int idx) > > @@ -829,11 +850,16 @@ static int armv8pmu_set_event_filter(struct hw_perf_event *event, > > if (!attr->exclude_kernel) > > config_base |= ARMV8_PMU_INCLUDE_EL2; > > } else { > > - if (attr->exclude_kernel) > > - config_base |= ARMV8_PMU_EXCLUDE_EL1; > > - if (!attr->exclude_hv) > > + if (!attr->exclude_hv && !attr->exclude_host) > > config_base |= ARMV8_PMU_INCLUDE_EL2; > > FWIW, that doesn't align with my personal view of what the host is, but > I'm not going to argue if Marc and Christoffer are happy with it. Ideally armv8pmu_set_event_filter needs no knowledge of exclude_guest and exclude_host as we leave the config_base alone and instead rely on turning the counters on/off at guest entry/exit... The addition of "&& !attr->exclude_host" here (!VHE) and likewise for VHE in "arm64: KVM: Enable VHE support for :G/:H perf event modifiers" (in case you missed it) is to eliminate counters counting host events on the boundaries of guest entry/exit when counting for guest_only (:G). Thus this is really an optimisation for more accurate counting. Consider the case where a user wants to record guest events only - we switch over to the guest counters at EL2 on world-switch (both VHE and !VHE host) - now there is a small period of time between when we start the guest counters and when we actually jump into the guest. This period of time in the host shouldn't be counted - therefore so long as exclude_host is set we can filter EL2 to remove these unwanted counts. Therefore the above hunks likely won't describe what our view of the host is. > > Anyway, thanks for persevering with this: It's fun even though it hurts my head every time each time I come back to this. > > Acked-by: Will Deacon <will.deacon@arm.com> Thanks, Andrew Murray > > Will _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-04-04 19:48 UTC|newest] Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-03-28 10:37 [PATCH v12 0/8] arm64: Support perf event modifiers :G and :H Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 1/8] arm64: arm_pmu: remove unnecessary isb instruction Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 2/8] arm64: KVM: encapsulate kvm_cpu_context in kvm_host_data Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-03-28 15:28 ` Suzuki K Poulose 2019-03-28 15:28 ` Suzuki K Poulose 2019-04-09 10:52 ` Andrew Murray 2019-04-09 10:52 ` Andrew Murray 2019-04-09 10:52 ` Andrew Murray 2019-04-04 16:09 ` Will Deacon 2019-04-04 16:09 ` Will Deacon 2019-04-04 16:14 ` Will Deacon 2019-04-04 16:14 ` Will Deacon 2019-04-04 19:34 ` Andrew Murray 2019-04-04 19:34 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 3/8] arm64: KVM: add accessors to track guest/host only counters Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 4/8] arm64: arm_pmu: Add !VHE support for exclude_host/exclude_guest attributes Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-04-04 16:34 ` Will Deacon 2019-04-04 16:34 ` Will Deacon 2019-04-04 19:48 ` Andrew Murray [this message] 2019-04-04 19:48 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 5/8] arm64: KVM: Enable !VHE support for :G/:H perf event modifiers Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 6/8] arm64: KVM: Enable VHE " Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-04-09 17:52 ` Will Deacon 2019-04-09 17:52 ` Will Deacon 2019-04-09 17:52 ` Will Deacon 2019-04-09 19:13 ` Andrew Murray 2019-04-09 19:13 ` Andrew Murray 2019-04-09 19:13 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 7/8] arm64: KVM: avoid isb's by using direct pmxevtyper sysreg Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-03-28 10:37 ` [PATCH v12 8/8] arm64: docs: document perf event attributes Andrew Murray 2019-03-28 10:37 ` Andrew Murray 2019-04-04 16:21 ` Will Deacon 2019-04-04 16:21 ` Will Deacon 2019-04-04 19:33 ` Andrew Murray 2019-04-04 19:33 ` Andrew Murray 2019-04-05 12:43 ` Will Deacon 2019-04-05 12:43 ` Will Deacon 2019-04-09 11:00 ` Andrew Murray 2019-04-09 11:00 ` Andrew Murray 2019-04-09 11:00 ` Andrew Murray
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190404194843.GR53702@e119886-lin.cambridge.arm.com \ --to=andrew.murray@arm.com \ --cc=catalin.marinas@arm.com \ --cc=kvmarm@lists.cs.columbia.edu \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=marc.zyngier@arm.com \ --cc=will.deacon@arm.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.