linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Julien Thierry <julien.thierry@arm.com>
To: Suzuki K Poulose <suzuki.poulose@arm.com>,
	Andrew Murray <andrew.murray@arm.com>,
	Christoffer Dall <christoffer.dall@arm.com>,
	Marc Zyngier <marc.zyngier@arm.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Mark Rutland <mark.rutland@arm.com>
Cc: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v8 4/5] arm64: arm_pmu: Add support for exclude_host/exclude_guest attributes
Date: Wed, 12 Dec 2018 10:47:41 +0000	[thread overview]
Message-ID: <5fe821a9-a2b2-c40d-7a83-b014d7b8f4d1@arm.com> (raw)
In-Reply-To: <89242306-a445-017b-553e-105ae52d8cbe@arm.com>



On 12/12/2018 10:42, Suzuki K Poulose wrote:
> 
> 
> On 12/12/2018 10:29, 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 :G events
>> as per the events exclude_host attribute.
>>
>> With both VHE and non-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. However when using :H unless exclude_hv is set
>> on non-VHE then 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 | 51
>> ++++++++++++++++++++++++++++++++++++------
>>   1 file changed, 44 insertions(+), 7 deletions(-)
>>
>> diff --git a/arch/arm64/kernel/perf_event.c
>> b/arch/arm64/kernel/perf_event.c
>> index de564ae..4a3c73d 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>
>> @@ -647,11 +648,26 @@ 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;
>> +    int flags = 0;
>> +    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));
>> +
>> +    if (!attr->exclude_host)
>> +        flags |= KVM_PMU_EVENTS_HOST;
>> +    if (!attr->exclude_guest)
>> +        flags |= KVM_PMU_EVENTS_GUEST;
>> +
>> +    kvm_set_pmu_events(counter_bits, flags);
>> +
>> +    if (!attr->exclude_host) {
>> +        armv8pmu_enable_counter(idx);
>> +        if (armv8pmu_event_is_chained(event))
>> +            armv8pmu_enable_counter(idx - 1);
>> +    }
>>   }
>>     static inline int armv8pmu_disable_counter(int idx)
>> @@ -664,11 +680,20 @@ 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);
>> +
>> +    if (!attr->exclude_host) {
>> +        if (armv8pmu_event_is_chained(event))
>> +            armv8pmu_disable_counter(idx - 1);
>> +        armv8pmu_disable_counter(idx);
>> +    }
> 
> Shouldn't we disable the events, irrespective of whether it is for host
> or/and guest ? Otherwise looks good to me.
> 

I made the opposite remark on one of the early version. My reasoning is
that, if we rely on the hypervisor to enable event that exclude the
host, we should also rely on the hypervisor disabling these events.

At least in my mind it makes more sense this way.

Cheers,

-- 
Julien Thierry

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2018-12-12 10:48 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-12 10:29 [PATCH v8 0/5] arm64: Support perf event modifiers :G and :H Andrew Murray
2018-12-12 10:29 ` [PATCH v8 1/5] arm64: arm_pmu: remove unnecessary isb instruction Andrew Murray
2018-12-12 10:29 ` [PATCH v8 2/5] arm64: KVM: encapsulate kvm_cpu_context in kvm_host_data Andrew Murray
2018-12-12 10:37   ` Suzuki K Poulose
2018-12-12 12:31     ` Andrew Murray
2018-12-18 11:40   ` Christoffer Dall
2018-12-12 10:29 ` [PATCH v8 3/5] arm64: KVM: add accessors to track guest/host only counters Andrew Murray
2018-12-12 10:56   ` Suzuki K Poulose
2018-12-12 10:29 ` [PATCH v8 4/5] arm64: arm_pmu: Add support for exclude_host/exclude_guest attributes Andrew Murray
2018-12-12 10:42   ` Suzuki K Poulose
2018-12-12 10:47     ` Julien Thierry [this message]
2018-12-12 10:51       ` Suzuki K Poulose
2018-12-12 10:55   ` Suzuki K Poulose
2018-12-12 14:38     ` Andrew Murray
2018-12-18 12:02   ` Christoffer Dall
2018-12-18 13:25     ` Andrew Murray
2018-12-18 14:38       ` Christoffer Dall
2018-12-18 16:27         ` Andrew Murray
2018-12-18 18:51           ` Christoffer Dall
2018-12-18 19:19             ` Andrew Jones
2019-01-04 15:32     ` Will Deacon
2019-01-08 10:18       ` Christoffer Dall
2019-01-08 11:25         ` Andrew Murray
2019-01-08 11:50           ` Marc Zyngier
2019-01-08 12:03             ` Christoffer Dall
2019-01-08 12:12               ` Marc Zyngier
2019-01-08 12:20                 ` Christoffer Dall
2019-01-08 12:14           ` Christoffer Dall
2019-01-08 12:39             ` Andrew Murray
2018-12-12 10:29 ` [PATCH v8 5/5] arm64: KVM: Enable support for :G/:H perf event modifiers Andrew Murray
2018-12-12 10:53   ` Suzuki K Poulose
2018-12-12 14:46     ` 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=5fe821a9-a2b2-c40d-7a83-b014d7b8f4d1@arm.com \
    --to=julien.thierry@arm.com \
    --cc=andrew.murray@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=christoffer.dall@arm.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=suzuki.poulose@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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).