• Kan Liang's avatar
    x86/fpu/xstate: Support dynamic supervisor feature for LBR · f0dccc9d
    Kan Liang authored
    Last Branch Records (LBR) registers are used to log taken branches and
    other control flows. In perf with call stack mode, LBR information is
    used to reconstruct a call stack. To get the complete call stack, perf
    has to save/restore all LBR registers during a context switch. Due to
    the large number of the LBR registers, e.g., the current platform has
    96 LBR registers, this process causes a high CPU overhead. To reduce
    the CPU overhead during a context switch, an LBR state component that
    contains all the LBR related registers is introduced in hardware. All
    LBR registers can be saved/restored together using one XSAVES/XRSTORS
    instruction.
    
    However, the kernel should not save/restore the LBR state component at
    each context switch, like other state components, because of the
    following unique features of LBR:
    - The LBR state component only contains valuable information when LBR
      is enabled in the perf subsystem, but for most of the time, LBR is
      disabled.
    - The size of the LBR state component is huge. For the current
      platform, it's 808 bytes.
    If the kernel saves/restores the LBR state at each context switch, for
    most of the time, it is just a waste of space and cycles.
    
    To efficiently support the LBR state component, it is desired to have:
    - only context-switch the LBR when the LBR feature is enabled in perf.
    - only allocate an LBR-specific XSAVE buffer on demand.
      (Besides the LBR state, a legacy region and an XSAVE header have to be
       included in the buffer as well. There is a total of (808+576) byte
       overhead for the LBR-specific XSAVE buffer. The overhead only happens
       when the perf is actively using LBRs. There is still a space-saving,
       on average, when it replaces the constant 808 bytes of overhead for
       every task, all the time on the systems that support architectural
       LBR.)
    - be able to use XSAVES/XRSTORS for accessing LBR at run time.
      However, the IA32_XSS should not be adjusted at run time.
      (The XCR0 | IA32_XSS are used to determine the requested-feature
      bitmap (RFBM) of XSAVES.)
    
    A solution, called dynamic supervisor feature, is introduced to address
    this issue, which
    - does not allocate a buffer in each task->fpu;
    - does not save/restore a state component at each context switch;
    - sets the bit corresponding to the dynamic supervisor feature in
      IA32_XSS at boot time, and avoids setting it at run time.
    - dynamically allocates a specific buffer for a state component
      on demand, e.g. only allocates LBR-specific XSAVE buffer when LBR is
      enabled in perf. (Note: The buffer has to include the LBR state
      component, a legacy region and a XSAVE header space.)
      (Implemented in a later patch)
    - saves/restores a state component on demand, e.g. manually invokes
      the XSAVES/XRSTORS instruction to save/restore the LBR state
      to/from the buffer when perf is active and a call stack is required.
      (Implemented in a later patch)
    
    A new mask XFEATURE_MASK_DYNAMIC and a helper xfeatures_mask_dynamic()
    are introduced to indicate the dynamic supervisor feature. For the
    systems which support the Architecture LBR, LBR is the only dynamic
    supervisor feature for now. For the previous systems, there is no
    dynamic supervisor feature available.
    Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarDave Hansen <dave.hansen@intel.com>
    Link: https://lkml.kernel.org/r/1593780569-62993-21-git-send-email-kan.liang@linux.intel.com
    f0dccc9d
types.h 7.88 KB