• Kan Liang's avatar
    perf/x86/intel/lbr: Optimize context switches for the LBR call stack · 8b077e4a
    Kan Liang authored
    Context switches with perf LBR call stack context are fairly expensive
    because they do a lot of MSR writes. Currently we unconditionally do the
    expensive operation when LBR call stack is enabled. It's not necessary
    for some common cases, e.g task -> other kernel thread -> same task.
    The LBR registers are not changed, hence they don't need to be
    rewritten/restored.
    
    Introduce per-CPU variables to track the last LBR call stack context.
    If the same context is scheduled in, the rewrite/restore is not
    required, with the following two exceptions:
    
     - The LBR registers may be modified by a normal LBR event, i.e., adding
       a new LBR event or scheduling an existing LBR event. In both cases,
       the LBR registers are reset first. The last LBR call stack information
       is cleared in intel_pmu_lbr_reset(). Restoring the LBR registers is
       required.
    
     - The LBR registers are initialized to zero in C6.
       If the LBR registers which TOS points is cleared, C6 must be entered
       while swapped out. Restoring the LBR registers is required as well.
    
    These exceptions are not common.
    Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: acme@kernel.org
    Cc: eranian@google.com
    Link: https://lore.kernel.org/lkml/1528213126-4312-2-git-send-email-kan.liang@linux.intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    8b077e4a
lbr.c 31.9 KB