lkml.org 
[lkml]   [2010]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 4/5] perf, x86: Clear the LBRs on init
    Some CPUs have errata where the LBR is not cleared on Power-On. So
    always clear the LBRs before use.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    ---
    arch/x86/kernel/cpu/perf_event_intel.c | 18 ++++++++++++++++--
    arch/x86/kernel/cpu/perf_event_intel_lbr.c | 3 +++
    2 files changed, 19 insertions(+), 2 deletions(-)

    Index: linux-2.6/arch/x86/kernel/cpu/perf_event_intel.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/cpu/perf_event_intel.c
    +++ linux-2.6/arch/x86/kernel/cpu/perf_event_intel.c
    @@ -775,6 +775,20 @@ static __initconst struct x86_pmu core_p
    .event_constraints = intel_core_event_constraints,
    };

    +static void intel_pmu_cpu_starting(int cpu)
    +{
    + init_debug_store_on_cpu(cpu);
    + /*
    + * Deal with CPUs that don't clear their LBRs on power-up.
    + */
    + intel_pmu_lbr_reset();
    +}
    +
    +static void intel_pmu_cpu_dying(int cpu)
    +{
    + fini_debug_store_on_cpu(cpu);
    +}
    +
    static __initconst struct x86_pmu intel_pmu = {
    .name = "Intel",
    .handle_irq = intel_pmu_handle_irq,
    @@ -796,8 +810,8 @@ static __initconst struct x86_pmu intel_
    .max_period = (1ULL << 31) - 1,
    .get_event_constraints = intel_get_event_constraints,

    - .cpu_starting = init_debug_store_on_cpu,
    - .cpu_dying = fini_debug_store_on_cpu,
    + .cpu_starting = intel_pmu_cpu_starting,
    + .cpu_dying = intel_pmu_cpu_dying,
    };

    static void intel_clowertown_quirks(void)
    Index: linux-2.6/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    ===================================================================
    --- linux-2.6.orig/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    +++ linux-2.6/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    @@ -53,6 +53,9 @@ static void intel_pmu_lbr_reset_64(void)

    static void intel_pmu_lbr_reset(void)
    {
    + if (!x86_pmu.lbr_nr)
    + return;
    +
    if (x86_pmu.intel_cap.lbr_format == LBR_FORMAT_32)
    intel_pmu_lbr_reset_32();
    else
    --



    \
     
     \ /
      Last update: 2010-03-05 16:45    [W:0.023 / U:0.080 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site