Skip to content

Commit

Permalink
perf arm-spe: Fill address info for samples
Browse files Browse the repository at this point in the history
To properly handle memory and branch samples, this patch divides into
two functions for generating samples: arm_spe__synth_mem_sample() is for
synthesizing memory and TLB samples; arm_spe__synth_branch_sample() is
to synthesize branch samples.

Arm SPE backend decoder has passed virtual and physical address through
packets, the address info is stored into the synthesize samples in the
function arm_spe__synth_mem_sample().

Committer notes:

Fixed this:

  36    46.77 fedora:27                     : FAIL clang version 5.0.2 (tags/RELEASE_502/final)

    util/arm-spe.c:269:34: error: missing field 'pid' initializer [-Werror,-Wmissing-field-initializers]
            struct perf_sample sample = { 0 };
                                            ^
    util/arm-spe.c:288:34: error: missing field 'pid' initializer [-Werror,-Wmissing-field-initializers]
            struct perf_sample sample = { 0 };

By using = { .ip = 0, };

Signed-off-by: Leo Yan <leo.yan@linaro.org>
Reviewed-by: James Clark <james.clark@arm.com>
Tested-by: James Clark <james.clark@arm.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Al Grant <al.grant@arm.com>
Cc: Andre Przywara <andre.przywara@arm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: John Garry <john.garry@huawei.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Wei Li <liwei391@huawei.com>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: James Clark <james.clark@arm.com>
Link: https://lore.kernel.org/r/20210211133856.2137-4-james.clark@arm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
  • Loading branch information
Leo Yan authored and Arnaldo Carvalho de Melo committed Feb 16, 2021
1 parent 97ae666 commit 54f7815
Showing 1 changed file with 30 additions and 20 deletions.
50 changes: 30 additions & 20 deletions tools/perf/util/arm-spe.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,6 @@ static void arm_spe_prep_sample(struct arm_spe *spe,
sample->cpumode = arm_spe_cpumode(spe, sample->ip);
sample->pid = speq->pid;
sample->tid = speq->tid;
sample->addr = record->to_ip;
sample->period = 1;
sample->cpu = speq->cpu;

Expand All @@ -259,18 +258,37 @@ arm_spe_deliver_synth_event(struct arm_spe *spe,
return ret;
}

static int
arm_spe_synth_spe_events_sample(struct arm_spe_queue *speq,
u64 spe_events_id)
static int arm_spe__synth_mem_sample(struct arm_spe_queue *speq,
u64 spe_events_id)
{
struct arm_spe *spe = speq->spe;
struct arm_spe_record *record = &speq->decoder->record;
union perf_event *event = speq->event_buf;
struct perf_sample sample = { .ip = 0, };

arm_spe_prep_sample(spe, speq, event, &sample);

sample.id = spe_events_id;
sample.stream_id = spe_events_id;
sample.addr = record->virt_addr;
sample.phys_addr = record->phys_addr;

return arm_spe_deliver_synth_event(spe, speq, event, &sample);
}

static int arm_spe__synth_branch_sample(struct arm_spe_queue *speq,
u64 spe_events_id)
{
struct arm_spe *spe = speq->spe;
struct arm_spe_record *record = &speq->decoder->record;
union perf_event *event = speq->event_buf;
struct perf_sample sample = { .ip = 0, };

arm_spe_prep_sample(spe, speq, event, &sample);

sample.id = spe_events_id;
sample.stream_id = spe_events_id;
sample.addr = record->to_ip;

return arm_spe_deliver_synth_event(spe, speq, event, &sample);
}
Expand All @@ -283,63 +301,55 @@ static int arm_spe_sample(struct arm_spe_queue *speq)

if (spe->sample_flc) {
if (record->type & ARM_SPE_L1D_MISS) {
err = arm_spe_synth_spe_events_sample(
speq, spe->l1d_miss_id);
err = arm_spe__synth_mem_sample(speq, spe->l1d_miss_id);
if (err)
return err;
}

if (record->type & ARM_SPE_L1D_ACCESS) {
err = arm_spe_synth_spe_events_sample(
speq, spe->l1d_access_id);
err = arm_spe__synth_mem_sample(speq, spe->l1d_access_id);
if (err)
return err;
}
}

if (spe->sample_llc) {
if (record->type & ARM_SPE_LLC_MISS) {
err = arm_spe_synth_spe_events_sample(
speq, spe->llc_miss_id);
err = arm_spe__synth_mem_sample(speq, spe->llc_miss_id);
if (err)
return err;
}

if (record->type & ARM_SPE_LLC_ACCESS) {
err = arm_spe_synth_spe_events_sample(
speq, spe->llc_access_id);
err = arm_spe__synth_mem_sample(speq, spe->llc_access_id);
if (err)
return err;
}
}

if (spe->sample_tlb) {
if (record->type & ARM_SPE_TLB_MISS) {
err = arm_spe_synth_spe_events_sample(
speq, spe->tlb_miss_id);
err = arm_spe__synth_mem_sample(speq, spe->tlb_miss_id);
if (err)
return err;
}

if (record->type & ARM_SPE_TLB_ACCESS) {
err = arm_spe_synth_spe_events_sample(
speq, spe->tlb_access_id);
err = arm_spe__synth_mem_sample(speq, spe->tlb_access_id);
if (err)
return err;
}
}

if (spe->sample_branch && (record->type & ARM_SPE_BRANCH_MISS)) {
err = arm_spe_synth_spe_events_sample(speq,
spe->branch_miss_id);
err = arm_spe__synth_branch_sample(speq, spe->branch_miss_id);
if (err)
return err;
}

if (spe->sample_remote_access &&
(record->type & ARM_SPE_REMOTE_ACCESS)) {
err = arm_spe_synth_spe_events_sample(speq,
spe->remote_access_id);
err = arm_spe__synth_mem_sample(speq, spe->remote_access_id);
if (err)
return err;
}
Expand Down

0 comments on commit 54f7815

Please sign in to comment.