lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 293/329] perf/x86/intel: Properly save/restore the PMU state in the NMI handler
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Kan Liang <kan.liang@linux.intel.com>

    [ Upstream commit 82d71ed0277efc45360828af8c4e4d40e1b45352 ]

    The PMU is disabled in intel_pmu_handle_irq(), but cpuc->enabled is not updated
    accordingly.

    This is fine in current usage because no-one checks it - but fix it
    for future code: for example, the drain_pebs() will be modified to
    fix an auto-reload bug.

    Properly save/restore the old PMU state.

    Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Cc: acme@kernel.org
    Cc: kernel test robot <fengguang.wu@intel.com>
    Link: http://lkml.kernel.org/r/6f44ee84-56f8-79f1-559b-08e371eaeb78@linux.intel.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/events/intel/core.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    --- a/arch/x86/events/intel/core.c
    +++ b/arch/x86/events/intel/core.c
    @@ -2066,16 +2066,23 @@ static int intel_pmu_handle_irq(struct p
    int bit, loops;
    u64 status;
    int handled;
    + int pmu_enabled;

    cpuc = this_cpu_ptr(&cpu_hw_events);

    /*
    + * Save the PMU state.
    + * It needs to be restored when leaving the handler.
    + */
    + pmu_enabled = cpuc->enabled;
    + /*
    * No known reason to not always do late ACK,
    * but just in case do it opt-in.
    */
    if (!x86_pmu.late_ack)
    apic_write(APIC_LVTPC, APIC_DM_NMI);
    intel_bts_disable_local();
    + cpuc->enabled = 0;
    __intel_pmu_disable_all();
    handled = intel_pmu_drain_bts_buffer();
    handled += intel_bts_interrupt();
    @@ -2173,7 +2180,8 @@ again:

    done:
    /* Only restore PMU state when it's active. See x86_pmu_disable(). */
    - if (cpuc->enabled)
    + cpuc->enabled = pmu_enabled;
    + if (pmu_enabled)
    __intel_pmu_enable_all(0, true);
    intel_bts_enable_local();


    \
     
     \ /
      Last update: 2018-05-28 15:57    [W:4.200 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site