lkml.org 
[lkml]   [2018]   [Apr]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 2/6] MIPS: perf: Use correct VPE ID when setting up VPE tracing
    Date
    There are a couple of FIXME's in the perf code which state that
    cpu_data[event->cpu].vpe_id reports 0 for both CPUs. This is no longer
    the case, since the vpe_id is used extensively by SMP CPS.

    VPE local counting gets around this by using smp_processor_id() instead.
    As it happens this does work correctly to count events on the right VPE,
    but relies on 2 assumptions:
    a) Always having 2 VPEs / core.
    b) The hardware only paying attention to the least significant bit of
    the PERFCTL.VPEID field.
    If either of these assumptions change then the incorrect VPEs events
    will be counted.

    Fix this by replacing smp_processor_id() with
    cpu_vpe_id(&current_cpu_data), in the vpe_id() macro, and pass vpe_id()
    to M_PERFCTL_VPEID() when setting up PERFCTL.VPEID. The FIXME's can also
    be removed since they no longer apply.

    Signed-off-by: Matt Redfearn <matt.redfearn@mips.com>
    ---

    Changes in v2: None

    arch/mips/kernel/perf_event_mipsxx.c | 12 ++----------
    1 file changed, 2 insertions(+), 10 deletions(-)

    diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c
    index f3ec4a36921d..239c4ca89fb0 100644
    --- a/arch/mips/kernel/perf_event_mipsxx.c
    +++ b/arch/mips/kernel/perf_event_mipsxx.c
    @@ -137,12 +137,8 @@ static DEFINE_RWLOCK(pmuint_rwlock);
    #define vpe_id() (cpu_has_mipsmt_pertccounters ? \
    0 : (smp_processor_id() & MIPS_CPUID_TO_COUNTER_MASK))
    #else
    -/*
    - * FIXME: For VSMP, vpe_id() is redefined for Perf-events, because
    - * cpu_data[cpuid].vpe_id reports 0 for _both_ CPUs.
    - */
    #define vpe_id() (cpu_has_mipsmt_pertccounters ? \
    - 0 : smp_processor_id())
    + 0 : cpu_vpe_id(&current_cpu_data))
    #endif

    /* Copied from op_model_mipsxx.c */
    @@ -1279,11 +1275,7 @@ static void check_and_calc_range(struct perf_event *event,
    */
    hwc->config_base |= M_TC_EN_ALL;
    } else {
    - /*
    - * FIXME: cpu_data[event->cpu].vpe_id reports 0
    - * for both CPUs.
    - */
    - hwc->config_base |= M_PERFCTL_VPEID(event->cpu);
    + hwc->config_base |= M_PERFCTL_VPEID(vpe_id());
    hwc->config_base |= M_TC_EN_VPE;
    }
    } else
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-04-12 11:38    [W:3.179 / U:1.600 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site