lkml.org 
[lkml]   [2014]   [Nov]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V7 08/17] perf, x86: track number of events that use LBR callstack
    Date
    From: Yan, Zheng <zheng.z.yan@intel.com>

    When enabling/disabling an event, check if the event uses the LBR
    callstack feature, adjust the LBR callstack usage count accordingly.
    Later patch will use the usage count to decide if LBR stack should
    be saved/restored.

    Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
    Signed-off-by: Kan Liang <kan.liang@intel.com>
    ---
    arch/x86/kernel/cpu/perf_event_intel_lbr.c | 19 +++++++++++++++++++
    1 file changed, 19 insertions(+)

    diff --git a/arch/x86/kernel/cpu/perf_event_intel_lbr.c b/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    index 4a29bf5..c0ec384 100644
    --- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c
    @@ -205,9 +205,15 @@ void intel_pmu_lbr_sched_task(struct perf_event_context *ctx, bool sched_in)
    }
    }

    +static inline bool branch_user_callstack(unsigned br_sel)
    +{
    + return (br_sel & X86_BR_USER) && (br_sel & X86_BR_CALL_STACK);
    +}
    +
    void intel_pmu_lbr_enable(struct perf_event *event)
    {
    struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
    + struct x86_perf_task_context *task_ctx;

    if (!x86_pmu.lbr_nr)
    return;
    @@ -222,6 +228,12 @@ void intel_pmu_lbr_enable(struct perf_event *event)
    }
    cpuc->br_sel = event->hw.branch_reg.reg;

    + if (branch_user_callstack(cpuc->br_sel) && event->ctx &&
    + event->ctx->task_ctx_data) {
    + task_ctx = event->ctx->task_ctx_data;
    + task_ctx->lbr_callstack_users++;
    + }
    +
    cpuc->lbr_users++;
    perf_sched_cb_inc(event->ctx->pmu);
    }
    @@ -229,10 +241,17 @@ void intel_pmu_lbr_enable(struct perf_event *event)
    void intel_pmu_lbr_disable(struct perf_event *event)
    {
    struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
    + struct x86_perf_task_context *task_ctx;

    if (!x86_pmu.lbr_nr)
    return;

    + if (branch_user_callstack(cpuc->br_sel) && event->ctx &&
    + event->ctx->task_ctx_data) {
    + task_ctx = event->ctx->task_ctx_data;
    + task_ctx->lbr_callstack_users--;
    + }
    +
    cpuc->lbr_users--;
    WARN_ON_ONCE(cpuc->lbr_users < 0);
    perf_sched_cb_dec(event->ctx->pmu);
    --
    1.8.3.2


    \
     
     \ /
      Last update: 2014-11-05 04:41    [W:4.089 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site