On 04/01/2024 16:27, James Clark wrote:
> Add an interface for the Coresight driver to use to set the value of the
> TRFCR register for the guest. This register controls the exclude
> settings for trace at different exception levels, and is used to honor
> the exclude_host and exclude_guest parameters from the Perf session.
> This will be used to later write TRFCR_EL1 on nVHE at guest switch. For
> VHE, the host trace is controlled by TRFCR_EL2 and thus we can write to
> the TRFCR_EL1 immediately. Because guest writes to the register are
> trapped, the value will persist and can't be modified.
>
> Signed-off-by: James Clark <james.clark(a)arm.com>
> ---
> arch/arm64/include/asm/kvm_host.h | 3 +++
> arch/arm64/kvm/debug.c | 24 ++++++++++++++++++++++++
> 2 files changed, 27 insertions(+)
>
> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> index 4864a1fcdf89..ee6cba7ee6ee 100644
> --- a/arch/arm64/include/asm/kvm_host.h
> +++ b/arch/arm64/include/asm/kvm_host.h
> @@ -471,6 +471,7 @@ struct kvm_host_global_state {
> u32 events_host;
> u32 events_guest;
> } pmu_events;
> + u64 guest_trfcr_el1;
> } ____cacheline_aligned;
> extern struct kvm_host_global_state kvm_host_global_state[NR_CPUS];
>
> @@ -1145,6 +1146,7 @@ void kvm_arch_vcpu_put_debug_state_flags(struct kvm_vcpu *vcpu);
> void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr);
> void kvm_clr_pmu_events(u32 clr);
> bool kvm_set_pmuserenr(u64 val);
> +void kvm_etm_set_guest_trfcr(u64 trfcr_guest);
> #else
> static inline void kvm_set_pmu_events(u32 set, struct perf_event_attr *attr) {}
> static inline void kvm_clr_pmu_events(u32 clr) {}
> @@ -1152,6 +1154,7 @@ static inline bool kvm_set_pmuserenr(u64 val)
> {
> return false;
> }
> +static inline void kvm_etm_set_guest_trfcr(u64 trfcr_guest) {}
> #endif
>
> void kvm_vcpu_load_vhe(struct kvm_vcpu *vcpu);
> diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c
> index f86cbfae60f3..d69a0b9d9575 100644
> --- a/arch/arm64/kvm/debug.c
> +++ b/arch/arm64/kvm/debug.c
> @@ -358,3 +358,27 @@ void kvm_arch_vcpu_put_debug_state_flags(struct kvm_vcpu *vcpu)
> vcpu_clear_flag(vcpu, DEBUG_STATE_SAVE_TRBE);
> vcpu_clear_flag(vcpu, DEBUG_STATE_SAVE_TRFCR);
> }
> +
> +/*
> + * Interface for the Coresight driver to use to set the value of the TRFCR
> + * register for the guest. This register controls the exclude settings for trace
> + * at different exception levels, and is used to honor the exclude_host and
> + * exclude_guest parameters from the Perf session.
> + *
> + * This will be used to later write TRFCR_EL1 on nVHE at guest switch. For VHE,
> + * the host trace is controlled by TRFCR_EL2 and thus we can write to the
> + * TRFCR_EL1 immediately. Because guest writes to the register are trapped, the
> + * value will persist and can't be modified.
> + */
> +void kvm_etm_set_guest_trfcr(u64 trfcr_guest)
> +{
> + if (!cpuid_feature_extract_unsigned_field(read_sysreg(id_aa64dfr0_el1),
> + ID_AA64DFR0_EL1_TraceFilt_SHIFT))
Perhaps WARN_ON_ONCE() ?
Otherwise,
Reviewed-by: Suzuki K Poulose <suzuki.poulose(a)arm.com>
> + return;
> +
> + if (has_vhe())
> + write_sysreg_s(trfcr_guest, SYS_TRFCR_EL12);
> + else
> + kvm_host_global_state[smp_processor_id()].guest_trfcr_el1 = trfcr_guest;
> +}
> +EXPORT_SYMBOL_GPL(kvm_etm_set_guest_trfcr);
finalise_host_mappings() became fix_host_ownership() in
commit 0d16d12eb26e ("KVM: arm64: Fix-up hyp stage-1 refcounts for all
pages mapped at EL2") so update the comment.
Signed-off-by: James Clark <james.clark(a)arm.com>
---
arch/arm64/kvm/hyp/nvhe/setup.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
index cd2f39388251..b5452e58c49a 100644
--- a/arch/arm64/kvm/hyp/nvhe/setup.c
+++ b/arch/arm64/kvm/hyp/nvhe/setup.c
@@ -150,7 +150,7 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
* can't be donated or shared with another entity.
*
* The ownership transition requires matching changes in the host
- * stage-2. This will be done later (see finalize_host_mappings()) once
+ * stage-2. This will be done later (see fix_host_ownership()) once
* the hyp_vmemmap is addressable.
*/
prot = pkvm_mkstate(PAGE_HYP_RO, PKVM_PAGE_SHARED_OWNED);
--
2.34.1
On 26/12/2023 09:36, Krzysztof Kozlowski wrote:
> On 26/12/2023 02:50, Jinlong Mao wrote:
>>
>>
>> On 12/21/2023 4:44 PM, Krzysztof Kozlowski wrote:
>>> On 21/12/2023 09:36, Jinlong Mao wrote:
>>>>
>>>>
>>>> On 12/21/2023 4:17 PM, Krzysztof Kozlowski wrote:
>>>>> On 21/12/2023 09:15, Jinlong Mao wrote:
>>>>>>
>>>>>>
>>>>>> On 12/21/2023 4:12 PM, Krzysztof Kozlowski wrote:
>>>>>>> On 21/12/2023 04:28, Jinlong Mao wrote:
>>>>>>>>>> diff --git a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>>>>>> index f725e6940993..cbf583d34029 100644
>>>>>>>>>> --- a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>>>>>> +++ b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>>>>>> @@ -23,7 +23,7 @@ description: |
>>>>>>>>>>
>>>>>>>>>> properties:
>>>>>>>>>> $nodename:
>>>>>>>>>> - pattern: "^ete([0-9a-f]+)$"
>>>>>>>>>> + pattern: "^ete-([0-9a-f]+)$"
>>>>>>>>>
>>>>>>>>> My concerns are not resolved. Why is it here in the first place?
>>>>>>>>
>>>>>>>> Hi Krzysztof,
>>>>>>>>
>>>>>>>> ETE is acronym of embedded trace extension. The number of the name is
>>>>>>>> the same as the number of the CPU it belongs to.
>>>>>>>
>>>>>>> This is obvious and was not my question.
>
> You already said it here...
>
>>>>>>
>>>>>> Do you mean why the pattern match of the node name is added here ?
>>>>>
>>>>> Yes, especially that it is requiring a non-generic name.
>>>>>
>>>>>>
>>>>>> This node should not have the node name match, right ?
>>>>>
>>>>> Usually. For sure shouldn't be for non-generic names.
>>>>>
>>>> Hi Suzuki,
>>>>
>>>> Can we remove the pattern match of the node name and use a generic name
>>>> "ete" for the ete DT nodes ?
>>>
>>> "ete" is not a generic name. What is generic here? It's an acronym of
>>> some specific device name.
>>>
>>
>> The device full name is embedded trace extension. So use ETE as the name
>> here.
>
> That's obvious and my comment was not about it. Second time... This is
> my unlucky day... I said, why do you even want to enforce name which is
> not generic, since the names should be generic?
>
I think we can just drop the enforced name if it's getting in the way.
It doesn't really do anything and other Coresight bindings don't have it
anyway.
> I assume you read the DT specification:
> https://devicetree-specification.readthedocs.io/en/latest/chapter2-devicetr…
>
>
> Best regards,
> Krzysztof
>
I couldn't find anything in that list that would be a good fit for a
name, and it seems like all of the Coresight devices have already been
added with non generic names (like funnel and replicator etc), so it
might be a bit late now.
But if we drop the enforced name then it's probably fine.
James
On 12/21/2023 4:44 PM, Krzysztof Kozlowski wrote:
> On 21/12/2023 09:36, Jinlong Mao wrote:
>>
>>
>> On 12/21/2023 4:17 PM, Krzysztof Kozlowski wrote:
>>> On 21/12/2023 09:15, Jinlong Mao wrote:
>>>>
>>>>
>>>> On 12/21/2023 4:12 PM, Krzysztof Kozlowski wrote:
>>>>> On 21/12/2023 04:28, Jinlong Mao wrote:
>>>>>>>> diff --git a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>>>> index f725e6940993..cbf583d34029 100644
>>>>>>>> --- a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>>>> +++ b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>>>> @@ -23,7 +23,7 @@ description: |
>>>>>>>>
>>>>>>>> properties:
>>>>>>>> $nodename:
>>>>>>>> - pattern: "^ete([0-9a-f]+)$"
>>>>>>>> + pattern: "^ete-([0-9a-f]+)$"
>>>>>>>
>>>>>>> My concerns are not resolved. Why is it here in the first place?
>>>>>>
>>>>>> Hi Krzysztof,
>>>>>>
>>>>>> ETE is acronym of embedded trace extension. The number of the name is
>>>>>> the same as the number of the CPU it belongs to.
>>>>>
>>>>> This is obvious and was not my question.
>>>>
>>>> Do you mean why the pattern match of the node name is added here ?
>>>
>>> Yes, especially that it is requiring a non-generic name.
>>>
>>>>
>>>> This node should not have the node name match, right ?
>>>
>>> Usually. For sure shouldn't be for non-generic names.
>>>
>> Hi Suzuki,
>>
>> Can we remove the pattern match of the node name and use a generic name
>> "ete" for the ete DT nodes ?
>
> "ete" is not a generic name. What is generic here? It's an acronym of
> some specific device name.
>
The device full name is embedded trace extension. So use ETE as the name
here.
Thanks
Jinlong Mao
>
On 20/12/2023 16:16, Adrian Hunter wrote:
> On 20/12/23 17:54, James Clark wrote:
>>
>>
>> On 08/12/2023 17:24, Adrian Hunter wrote:
>>> Hardware traces, such as instruction traces, can produce a vast amount of
>>> trace data, so being able to reduce tracing to more specific circumstances
>>> can be useful.
>>>
>>> The ability to pause or resume tracing when another event happens, can do
>>> that.
>>>
>>> Add ability for an event to "pause" or "resume" AUX area tracing.
>>>
>>> Add aux_pause bit to perf_event_attr to indicate that, if the event
>>> happens, the associated AUX area tracing should be paused. Ditto
>>> aux_resume. Do not allow aux_pause and aux_resume to be set together.
>>>
>>> Add aux_start_paused bit to perf_event_attr to indicate to an AUX area
>>> event that it should start in a "paused" state.
>>>
>>> Add aux_paused to struct perf_event for AUX area events to keep track of
>>> the "paused" state. aux_paused is initialized to aux_start_paused.
>>>
>>> Add PERF_EF_PAUSE and PERF_EF_RESUME modes for ->stop() and ->start()
>>> callbacks. Call as needed, during __perf_event_output(). Add
>>> aux_in_pause_resume to struct perf_buffer to prevent races with the NMI
>>> handler. Pause/resume in NMI context will miss out if it coincides with
>>> another pause/resume.
>>>
>>> To use aux_pause or aux_resume, an event must be in a group with the AUX
>>> area event as the group leader.
>>>
>>> Example (requires Intel PT and tools patches also):
>>>
>>> $ perf record --kcore -e '{intel_pt/aux-start-paused/k,syscalls:sys_enter_newuname/aux-resume/,syscalls:sys_exit_newuname/aux-pause/}' uname
>>
>> I think it might be useful to have an aux-toggle option as well, and
>> then you could do sampling if you put it on a PMU counter with an
>> interval. Unless you can make two events for the same counter with
>> different intervals, and one does resume and the other does pause? I'm
>> not sure if that would work?
>
> There is already ->snapshot_aux() for sampling. Is that what you mean?
>
I suppose that mostly handles that use case yes. Although there are some
slight differences. It looks like for SAMPLE_AUX, the buffer size for
each sample is fixed and limited to 16 bits in size, whereas between
pause and resume you could potentially have multiple buffers delivered
to userspace of any size.
And it looks like SAMPLE_AUX would leave the trace running even when no
samples were being collected. I suppose you might not want to consume
the memory bandwidth and turn the trace off between samples, which
pause/resume does. Especially if you intend to have long periods between
the samples.
I think if it did turn out to be useful the toggle function can easily
be added later, so I don't intend this comment to be a blocking one.
>>
>> Other than that it looks ok. I got Coresight working with a couple of
>> changes to what you posted on here, but that can always be done more
>> thoroughly later if we leave PERF_PMU_CAP_AUX_PAUSE off Coresight for now.
>
> Thanks a lot for looking at this!
>
On 12/21/2023 4:17 PM, Krzysztof Kozlowski wrote:
> On 21/12/2023 09:15, Jinlong Mao wrote:
>>
>>
>> On 12/21/2023 4:12 PM, Krzysztof Kozlowski wrote:
>>> On 21/12/2023 04:28, Jinlong Mao wrote:
>>>>>> diff --git a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>> index f725e6940993..cbf583d34029 100644
>>>>>> --- a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>> +++ b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>>>> @@ -23,7 +23,7 @@ description: |
>>>>>>
>>>>>> properties:
>>>>>> $nodename:
>>>>>> - pattern: "^ete([0-9a-f]+)$"
>>>>>> + pattern: "^ete-([0-9a-f]+)$"
>>>>>
>>>>> My concerns are not resolved. Why is it here in the first place?
>>>>
>>>> Hi Krzysztof,
>>>>
>>>> ETE is acronym of embedded trace extension. The number of the name is
>>>> the same as the number of the CPU it belongs to.
>>>
>>> This is obvious and was not my question.
>>
>> Do you mean why the pattern match of the node name is added here ?
>
> Yes, especially that it is requiring a non-generic name.
>
>>
>> This node should not have the node name match, right ?
>
> Usually. For sure shouldn't be for non-generic names.
>
Hi Suzuki,
Can we remove the pattern match of the node name and use a generic name
"ete" for the ete DT nodes ?
Thanks
Jinlong Mao
> Best regards,
> Krzysztof
>
On 12/21/2023 4:12 PM, Krzysztof Kozlowski wrote:
> On 21/12/2023 04:28, Jinlong Mao wrote:
>>>> diff --git a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>> index f725e6940993..cbf583d34029 100644
>>>> --- a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>> +++ b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>>>> @@ -23,7 +23,7 @@ description: |
>>>>
>>>> properties:
>>>> $nodename:
>>>> - pattern: "^ete([0-9a-f]+)$"
>>>> + pattern: "^ete-([0-9a-f]+)$"
>>>
>>> My concerns are not resolved. Why is it here in the first place?
>>
>> Hi Krzysztof,
>>
>> ETE is acronym of embedded trace extension. The number of the name is
>> the same as the number of the CPU it belongs to.
>
> This is obvious and was not my question.
Do you mean why the pattern match of the node name is added here ?
This node should not have the node name match, right ?
Thanks
Jinlong Mao
>
> Best regards,
> Krzysztof
>
On 12/20/2023 11:50 PM, Krzysztof Kozlowski wrote:
> On 20/12/2023 15:05, Mao Jinlong wrote:
>> Update the suffix for ete node name to be with "-".
>>
>> Signed-off-by: Mao Jinlong <quic_jinlmao(a)quicinc.com>
>> ---
>> .../bindings/arm/arm,embedded-trace-extension.yaml | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>> index f725e6940993..cbf583d34029 100644
>> --- a/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>> +++ b/Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
>> @@ -23,7 +23,7 @@ description: |
>>
>> properties:
>> $nodename:
>> - pattern: "^ete([0-9a-f]+)$"
>> + pattern: "^ete-([0-9a-f]+)$"
>
> My concerns are not resolved. Why is it here in the first place?
Hi Krzysztof,
ETE is acronym of embedded trace extension. The number of the name is
the same as the number of the CPU it belongs to.
Hi Suzuki,
Please help to comment on this.
Thanks
Jinlong Mao
>
> Best regards,
> Krzysztof
>
On 15/12/2023 06:42, Adrian Hunter wrote:
> For discussion only, un-tested...
>
If anyone wants to test Coresight, the diff below is required to get the
most basic use case working. It also probably needs more thought and
some edge case handling:
diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c
index 596c01e37624..bd0767356277 100644
--- a/drivers/hwtracing/coresight/coresight-etm-perf.c
+++ b/drivers/hwtracing/coresight/coresight-etm-perf.c
@@ -556,7 +556,8 @@ static void etm_event_stop(struct perf_event *event, int mode)
struct etm_event_data *event_data;
struct list_head *path;
- if (mode & PERF_EF_PAUSE && !READ_ONCE(ctxt->pr_allowed))
+ if ((mode & PERF_EF_PAUSE && !READ_ONCE(ctxt->pr_allowed)) ||
+ event->hw.state == PERF_HES_STOPPED)
return;
WRITE_ONCE(ctxt->pr_allowed, 0);
@@ -573,9 +574,6 @@ static void etm_event_stop(struct perf_event *event, int mode)
/* Clear the event_data as this ETM is stopping the trace. */
ctxt->event_data = NULL;
- if (event->hw.state == PERF_HES_STOPPED)
- goto out_pr_allowed;
-
/* We must have a valid event_data for a running event */
if (WARN_ON(!event_data))
return;
@@ -586,7 +584,7 @@ static void etm_event_stop(struct perf_event *event, int mode)
* nothing needs to be torn down other than outputting a
* zero sized record.
*/
- if (handle->event && (mode & PERF_EF_UPDATE) &&
+ if (handle->event && (mode & (PERF_EF_UPDATE | PERF_EF_PAUSE)) &&
!cpumask_test_cpu(cpu, &event_data->mask)) {
event->hw.state = PERF_HES_STOPPED;
perf_aux_output_end(handle, 0);
@@ -616,7 +614,7 @@ static void etm_event_stop(struct perf_event *event, int mode)
* handle due to lack of buffer space), we don't
* have to do anything here.
*/
- if (handle->event && (mode & PERF_EF_UPDATE)) {
+ if (handle->event && (mode & (PERF_EF_UPDATE | PERF_EF_PAUSE))) {
if (WARN_ON_ONCE(handle->event != event))
return;
@@ -646,7 +644,6 @@ static void etm_event_stop(struct perf_event *event, int mode)
/* Disabling the path make its elements available to other sessions */
coresight_disable_path(path);
-out_pr_allowed:
if (mode & PERF_EF_PAUSE)
WRITE_ONCE(ctxt->pr_allowed, 1);
}
@@ -656,7 +653,7 @@ static int etm_event_add(struct perf_event *event, int mode)
int ret = 0;
struct hw_perf_event *hwc = &event->hw;
- if (mode & PERF_EF_START && !READ_ONCE(event->aux_paused)) {
+ if (mode & PERF_EF_START) {
etm_event_start(event, 0);
if (hwc->state & PERF_HES_STOPPED)
ret = -EINVAL;
--
2.34.1