• Kan Liang's avatar
    perf/x86/intel: Generic support for hardware TopDown metrics · 7b2c05a1
    Kan Liang authored
    Intro
    =====
    
    The TopDown Microarchitecture Analysis (TMA) Method is a structured
    analysis methodology to identify critical performance bottlenecks in
    out-of-order processors. Current perf has supported the method.
    
    The method works well, but there is one problem. To collect the TopDown
    events, several GP counters have to be used. If a user wants to collect
    other events at the same time, the multiplexing probably be triggered,
    which impacts the accuracy.
    
    To free up the scarce GP counters, the hardware TopDown metrics feature
    is introduced from Ice Lake. The hardware implements an additional
    "metrics" register and a new Fixed Counter 3 that measures pipeline
    "slots". The TopDown events can be calculated from them instead.
    
    Events
    ======
    
    The level 1 TopDown has four metrics. There is no event-code assigned to
    the TopDown metrics. Four metric events are exported as separate perf
    events, which map to the internal "metrics" counter register. Those
    events do not exist in hardware, but can be allocated by the scheduler.
    
    For the event mapping, a special 0x00 event code is used, which is
    reserved for fake events. The metric events start from umask 0x10.
    
    When setting up the metric events, they point to the Fixed Counter 3.
    They have to be specially handled.
    - Add the update_topdown_event() callback to read the additional metrics
      MSR and generate the metrics.
    - Add the set_topdown_event_period() callback to initialize metrics MSR
      and the fixed counter 3.
    - Add a variable n_metric_event to track the number of the accepted
      metrics events. The sharing between multiple users of the same metric
      without multiplexing is not allowed.
    - Only enable/disable the fixed counter 3 when there are no other active
      TopDown events, which avoid the unnecessary writing of the fixed
      control register.
    - Disable the PMU when reading the metrics event. The metrics MSR and
      the fixed counter 3 are read separately. The values may be modified by
      an NMI.
    
    All four metric events don't support sampling. Since they will be
    handled specially for event update, a flag PERF_X86_EVENT_TOPDOWN is
    introduced to indicate this case.
    
    The slots event can support both sampling and counting.
    For counting, the flag is also applied.
    For sampling, it will be handled normally as other normal events.
    
    Groups
    ======
    
    The slots event is required in a Topdown group.
    To avoid reading the METRICS register multiple times, the metrics and
    slots value can only be updated by slots event in a group.
    All active slots and metrics events will be updated one time.
    Therefore, the slots event must be before any metric events in a Topdown
    group.
    
    NMI
    ======
    
    The METRICS related register may be overflow. The bit 48 of the STATUS
    register will be set. If so, PERF_METRICS and Fixed counter 3 are
    required to be reset. The patch also update all active slots and
    metrics events in the NMI handler.
    
    The update_topdown_event() has to read two registers separately. The
    values may be modified by an NMI. PMU has to be disabled before calling
    the function.
    
    RDPMC
    ======
    
    RDPMC is temporarily disabled. A later patch will enable it.
    Suggested-by: default avatarPeter Zijlstra <peterz@infradead.org>
    Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lkml.kernel.org/r/20200723171117.9918-9-kan.liang@linux.intel.com
    7b2c05a1
core.c 63.3 KB