]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 17 Sep 2019 01:47:53 +0000 (18:47 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 17 Sep 2019 01:47:53 +0000 (18:47 -0700)
Pull x86 cpu-feature updates from Ingo Molnar:

 - Rework the Intel model names symbols/macros, which were decades of
   ad-hoc extensions and added random noise. It's now a coherent, easy
   to follow nomenclature.

 - Add new Intel CPU model IDs:
    - "Tiger Lake" desktop and mobile models
    - "Elkhart Lake" model ID
    - and the "Lightning Mountain" variant of Airmont, plus support code

 - Add the new AVX512_VP2INTERSECT instruction to cpufeatures

 - Remove Intel MPX user-visible APIs and the self-tests, because the
   toolchain (gcc) is not supporting it going forward. This is the
   first, lowest-risk phase of MPX removal.

 - Remove X86_FEATURE_MFENCE_RDTSC

 - Various smaller cleanups and fixes

* 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (25 commits)
  x86/cpu: Update init data for new Airmont CPU model
  x86/cpu: Add new Airmont variant to Intel family
  x86/cpu: Add Elkhart Lake to Intel family
  x86/cpu: Add Tiger Lake to Intel family
  x86: Correct misc typos
  x86/intel: Add common OPTDIFFs
  x86/intel: Aggregate microserver naming
  x86/intel: Aggregate big core graphics naming
  x86/intel: Aggregate big core mobile naming
  x86/intel: Aggregate big core client naming
  x86/cpufeature: Explain the macro duplication
  x86/ftrace: Remove mcount() declaration
  x86/PCI: Remove superfluous returns from void functions
  x86/msr-index: Move AMD MSRs where they belong
  x86/cpu: Use constant definitions for CPU models
  lib: Remove redundant ftrace flag removal
  x86/crash: Remove unnecessary comparison
  x86/bitops: Use __builtin_constant_p() directly instead of IS_IMMEDIATE()
  x86: Remove X86_FEATURE_MFENCE_RDTSC
  x86/mpx: Remove MPX APIs
  ...

12 files changed:
1  2 
arch/x86/events/intel/core.c
arch/x86/events/intel/cstate.c
arch/x86/events/intel/pt.c
arch/x86/events/intel/rapl.c
arch/x86/events/msr.c
arch/x86/include/asm/msr-index.h
arch/x86/kernel/apic/apic.c
arch/x86/kernel/cpu/amd.c
drivers/edac/pnd2_edac.c
include/uapi/linux/prctl.h
kernel/sys.c
tools/arch/x86/include/asm/cpufeatures.h

index 43c966d1208ebe1b5abeef7058e884d0d6e81c14,1fc01d1f0a9bdee4af6fcc138e02faea956c2000..27ee47a7be6685db3c7b4d20bc0b5ef7ab7a0006
@@@ -18,7 -18,6 +18,7 @@@
  #include <asm/cpufeature.h>
  #include <asm/hardirq.h>
  #include <asm/intel-family.h>
 +#include <asm/intel_pt.h>
  #include <asm/apic.h>
  #include <asm/cpu_device_id.h>
  
@@@ -3299,13 -3298,6 +3299,13 @@@ static int intel_pmu_hw_config(struct p
                }
        }
  
 +      if (event->attr.aux_output) {
 +              if (!event->attr.precise_ip)
 +                      return -EINVAL;
 +
 +              event->hw.flags |= PERF_X86_EVENT_PEBS_VIA_PT;
 +      }
 +
        if (event->attr.type != PERF_TYPE_RAW)
                return 0;
  
@@@ -3824,14 -3816,6 +3824,14 @@@ static int intel_pmu_check_period(struc
        return intel_pmu_has_bts_period(event, value) ? -EINVAL : 0;
  }
  
 +static int intel_pmu_aux_output_match(struct perf_event *event)
 +{
 +      if (!x86_pmu.intel_cap.pebs_output_pt_available)
 +              return 0;
 +
 +      return is_intel_pt_event(event);
 +}
 +
  PMU_FORMAT_ATTR(offcore_rsp, "config1:0-63");
  
  PMU_FORMAT_ATTR(ldlat, "config1:0-15");
@@@ -3956,8 -3940,6 +3956,8 @@@ static __initconst const struct x86_pm
        .sched_task             = intel_pmu_sched_task,
  
        .check_period           = intel_pmu_check_period,
 +
 +      .aux_output_match       = intel_pmu_aux_output_match,
  };
  
  static __init void intel_clovertown_quirk(void)
  }
  
  static const struct x86_cpu_desc isolation_ucodes[] = {
-       INTEL_CPU_DESC(INTEL_FAM6_HASWELL_CORE,          3, 0x0000001f),
-       INTEL_CPU_DESC(INTEL_FAM6_HASWELL_ULT,           1, 0x0000001e),
-       INTEL_CPU_DESC(INTEL_FAM6_HASWELL_GT3E,          1, 0x00000015),
+       INTEL_CPU_DESC(INTEL_FAM6_HASWELL,               3, 0x0000001f),
+       INTEL_CPU_DESC(INTEL_FAM6_HASWELL_L,             1, 0x0000001e),
+       INTEL_CPU_DESC(INTEL_FAM6_HASWELL_G,             1, 0x00000015),
        INTEL_CPU_DESC(INTEL_FAM6_HASWELL_X,             2, 0x00000037),
        INTEL_CPU_DESC(INTEL_FAM6_HASWELL_X,             4, 0x0000000a),
-       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_CORE,        4, 0x00000023),
-       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_GT3E,        1, 0x00000014),
-       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_XEON_D,      2, 0x00000010),
-       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_XEON_D,      3, 0x07000009),
-       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_XEON_D,      4, 0x0f000009),
-       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_XEON_D,      5, 0x0e000002),
+       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL,             4, 0x00000023),
+       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_G,           1, 0x00000014),
+       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_D,           2, 0x00000010),
+       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_D,           3, 0x07000009),
+       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_D,           4, 0x0f000009),
+       INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_D,           5, 0x0e000002),
        INTEL_CPU_DESC(INTEL_FAM6_BROADWELL_X,           2, 0x0b000014),
        INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_X,             3, 0x00000021),
        INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_X,             4, 0x00000000),
-       INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_MOBILE,        3, 0x0000007c),
-       INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_DESKTOP,       3, 0x0000007c),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_DESKTOP,      9, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_MOBILE,       9, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_MOBILE,      10, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_MOBILE,      11, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_MOBILE,      12, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_DESKTOP,     10, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_DESKTOP,     11, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_DESKTOP,     12, 0x0000004e),
-       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_DESKTOP,     13, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE_L,             3, 0x0000007c),
+       INTEL_CPU_DESC(INTEL_FAM6_SKYLAKE,               3, 0x0000007c),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE,              9, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_L,            9, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_L,           10, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_L,           11, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE_L,           12, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE,             10, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE,             11, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE,             12, 0x0000004e),
+       INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE,             13, 0x0000004e),
        {}
  };
  
@@@ -4169,7 -4151,7 +4169,7 @@@ static const struct x86_cpu_desc counte
        INTEL_CPU_DESC(INTEL_FAM6_ATOM_GOLDMONT,         2, 0x0000000e),
        INTEL_CPU_DESC(INTEL_FAM6_ATOM_GOLDMONT,         9, 0x0000002e),
        INTEL_CPU_DESC(INTEL_FAM6_ATOM_GOLDMONT,        10, 0x00000008),
-       INTEL_CPU_DESC(INTEL_FAM6_ATOM_GOLDMONT_X,       1, 0x00000028),
+       INTEL_CPU_DESC(INTEL_FAM6_ATOM_GOLDMONT_D,       1, 0x00000028),
        INTEL_CPU_DESC(INTEL_FAM6_ATOM_GOLDMONT_PLUS,    1, 0x00000028),
        INTEL_CPU_DESC(INTEL_FAM6_ATOM_GOLDMONT_PLUS,    8, 0x00000006),
        {}
@@@ -4667,7 -4649,7 +4667,7 @@@ __init int intel_pmu_init(void
                break;
  
        case INTEL_FAM6_ATOM_SILVERMONT:
-       case INTEL_FAM6_ATOM_SILVERMONT_X:
+       case INTEL_FAM6_ATOM_SILVERMONT_D:
        case INTEL_FAM6_ATOM_SILVERMONT_MID:
        case INTEL_FAM6_ATOM_AIRMONT:
        case INTEL_FAM6_ATOM_AIRMONT_MID:
                break;
  
        case INTEL_FAM6_ATOM_GOLDMONT:
-       case INTEL_FAM6_ATOM_GOLDMONT_X:
+       case INTEL_FAM6_ATOM_GOLDMONT_D:
                x86_add_quirk(intel_counter_freezing_quirk);
                memcpy(hw_cache_event_ids, glm_hw_cache_event_ids,
                       sizeof(hw_cache_event_ids));
                name = "goldmont_plus";
                break;
  
-       case INTEL_FAM6_ATOM_TREMONT_X:
+       case INTEL_FAM6_ATOM_TREMONT_D:
                x86_pmu.late_ack = true;
                memcpy(hw_cache_event_ids, glp_hw_cache_event_ids,
                       sizeof(hw_cache_event_ids));
                break;
  
  
-       case INTEL_FAM6_HASWELL_CORE:
+       case INTEL_FAM6_HASWELL:
        case INTEL_FAM6_HASWELL_X:
-       case INTEL_FAM6_HASWELL_ULT:
-       case INTEL_FAM6_HASWELL_GT3E:
+       case INTEL_FAM6_HASWELL_L:
+       case INTEL_FAM6_HASWELL_G:
                x86_add_quirk(intel_ht_bug);
                x86_add_quirk(intel_pebs_isolation_quirk);
                x86_pmu.late_ack = true;
                name = "haswell";
                break;
  
-       case INTEL_FAM6_BROADWELL_CORE:
-       case INTEL_FAM6_BROADWELL_XEON_D:
-       case INTEL_FAM6_BROADWELL_GT3E:
+       case INTEL_FAM6_BROADWELL:
+       case INTEL_FAM6_BROADWELL_D:
+       case INTEL_FAM6_BROADWELL_G:
        case INTEL_FAM6_BROADWELL_X:
                x86_add_quirk(intel_pebs_isolation_quirk);
                x86_pmu.late_ack = true;
        case INTEL_FAM6_SKYLAKE_X:
                pmem = true;
                /* fall through */
-       case INTEL_FAM6_SKYLAKE_MOBILE:
-       case INTEL_FAM6_SKYLAKE_DESKTOP:
-       case INTEL_FAM6_KABYLAKE_MOBILE:
-       case INTEL_FAM6_KABYLAKE_DESKTOP:
+       case INTEL_FAM6_SKYLAKE_L:
+       case INTEL_FAM6_SKYLAKE:
+       case INTEL_FAM6_KABYLAKE_L:
+       case INTEL_FAM6_KABYLAKE:
                x86_add_quirk(intel_pebs_isolation_quirk);
                x86_pmu.late_ack = true;
                memcpy(hw_cache_event_ids, skl_hw_cache_event_ids, sizeof(hw_cache_event_ids));
                break;
  
        case INTEL_FAM6_ICELAKE_X:
-       case INTEL_FAM6_ICELAKE_XEON_D:
+       case INTEL_FAM6_ICELAKE_D:
                pmem = true;
                /* fall through */
-       case INTEL_FAM6_ICELAKE_MOBILE:
-       case INTEL_FAM6_ICELAKE_DESKTOP:
+       case INTEL_FAM6_ICELAKE_L:
+       case INTEL_FAM6_ICELAKE:
                x86_pmu.late_ack = true;
                memcpy(hw_cache_event_ids, skl_hw_cache_event_ids, sizeof(hw_cache_event_ids));
                memcpy(hw_cache_extra_regs, skl_hw_cache_extra_regs, sizeof(hw_cache_extra_regs));
index db498b5d4aae67802beb2811eac36f3dbad624ad,104c093b282bdfe8e1c437fc40e1ba14362a7295..9f2f39003d96eb2a9ae3a9917627536fe2cda4e8
@@@ -446,7 -446,7 +446,7 @@@ static int cstate_cpu_init(unsigned in
        return 0;
  }
  
 -const struct attribute_group *core_attr_update[] = {
 +static const struct attribute_group *core_attr_update[] = {
        &group_cstate_core_c1,
        &group_cstate_core_c3,
        &group_cstate_core_c6,
        NULL,
  };
  
 -const struct attribute_group *pkg_attr_update[] = {
 +static const struct attribute_group *pkg_attr_update[] = {
        &group_cstate_pkg_c2,
        &group_cstate_pkg_c3,
        &group_cstate_pkg_c6,
@@@ -593,40 -593,40 +593,40 @@@ static const struct x86_cpu_id intel_cs
        X86_CSTATES_MODEL(INTEL_FAM6_IVYBRIDGE,   snb_cstates),
        X86_CSTATES_MODEL(INTEL_FAM6_IVYBRIDGE_X, snb_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL_CORE, snb_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL_X,    snb_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL_GT3E, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL,   snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL_X, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL_G, snb_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL_ULT, hswult_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_HASWELL_L, hswult_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_SILVERMONT, slm_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_SILVERMONT_X, slm_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_AIRMONT,     slm_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_SILVERMONT,   slm_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_SILVERMONT_D, slm_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_AIRMONT,      slm_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL_CORE,   snb_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL_XEON_D, snb_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL_GT3E,   snb_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL_X,      snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL,   snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL_D, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL_G, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_BROADWELL_X, snb_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_MOBILE,  snb_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_DESKTOP, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_L, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE,   snb_cstates),
        X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_X, snb_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_KABYLAKE_MOBILE,  hswult_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_KABYLAKE_DESKTOP, hswult_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_KABYLAKE_L, hswult_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_KABYLAKE,   hswult_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_CANNONLAKE_MOBILE, cnl_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_CANNONLAKE_L, cnl_cstates),
  
        X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNL, knl_cstates),
        X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNM, knl_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT, glm_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT_X, glm_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT,   glm_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT_D, glm_cstates),
  
        X86_CSTATES_MODEL(INTEL_FAM6_ATOM_GOLDMONT_PLUS, glm_cstates),
  
-       X86_CSTATES_MODEL(INTEL_FAM6_ICELAKE_MOBILE, snb_cstates),
-       X86_CSTATES_MODEL(INTEL_FAM6_ICELAKE_DESKTOP, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_ICELAKE_L, snb_cstates),
+       X86_CSTATES_MODEL(INTEL_FAM6_ICELAKE,   snb_cstates),
        { },
  };
  MODULE_DEVICE_TABLE(x86cpu, intel_cstates_match);
index b1bb4d28e0be7ecbf162057357fc49715948b0b6,26af1f19f153f704eb10a09deab76c2a3fbc1c5a..74e80ed9c6c474551b57c6d8b4d548aeb3ea8e4d
@@@ -204,9 -204,9 +204,9 @@@ static int __init pt_pmu_hw_init(void
  
        /* model-specific quirks */
        switch (boot_cpu_data.x86_model) {
-       case INTEL_FAM6_BROADWELL_CORE:
-       case INTEL_FAM6_BROADWELL_XEON_D:
-       case INTEL_FAM6_BROADWELL_GT3E:
+       case INTEL_FAM6_BROADWELL:
+       case INTEL_FAM6_BROADWELL_D:
+       case INTEL_FAM6_BROADWELL_G:
        case INTEL_FAM6_BROADWELL_X:
                /* not setting BRANCH_EN will #GP, erratum BDM106 */
                pt_pmu.branch_en_always_on = true;
@@@ -545,62 -545,33 +545,62 @@@ static void pt_config_buffer(void *buf
        wrmsrl(MSR_IA32_RTIT_OUTPUT_MASK, reg);
  }
  
 -/*
 - * Keep ToPA table-related metadata on the same page as the actual table,
 - * taking up a few words from the top
 - */
 -
 -#define TENTS_PER_PAGE (((PAGE_SIZE - 40) / sizeof(struct topa_entry)) - 1)
 -
  /**
 - * struct topa - page-sized ToPA table with metadata at the top
 - * @table:    actual ToPA table entries, as understood by PT hardware
 + * struct topa - ToPA metadata
   * @list:     linkage to struct pt_buffer's list of tables
 - * @phys:     physical address of this page
   * @offset:   offset of the first entry in this table in the buffer
   * @size:     total size of all entries in this table
   * @last:     index of the last initialized entry in this table
 + * @z_count:  how many times the first entry repeats
   */
  struct topa {
 -      struct topa_entry       table[TENTS_PER_PAGE];
        struct list_head        list;
 -      u64                     phys;
        u64                     offset;
        size_t                  size;
        int                     last;
 +      unsigned int            z_count;
  };
  
 +/*
 + * Keep ToPA table-related metadata on the same page as the actual table,
 + * taking up a few words from the top
 + */
 +
 +#define TENTS_PER_PAGE        \
 +      ((PAGE_SIZE - sizeof(struct topa)) / sizeof(struct topa_entry))
 +
 +/**
 + * struct topa_page - page-sized ToPA table with metadata at the top
 + * @table:    actual ToPA table entries, as understood by PT hardware
 + * @topa:     metadata
 + */
 +struct topa_page {
 +      struct topa_entry       table[TENTS_PER_PAGE];
 +      struct topa             topa;
 +};
 +
 +static inline struct topa_page *topa_to_page(struct topa *topa)
 +{
 +      return container_of(topa, struct topa_page, topa);
 +}
 +
 +static inline struct topa_page *topa_entry_to_page(struct topa_entry *te)
 +{
 +      return (struct topa_page *)((unsigned long)te & PAGE_MASK);
 +}
 +
 +static inline phys_addr_t topa_pfn(struct topa *topa)
 +{
 +      return PFN_DOWN(virt_to_phys(topa_to_page(topa)));
 +}
 +
  /* make -1 stand for the last table entry */
 -#define TOPA_ENTRY(t, i) ((i) == -1 ? &(t)->table[(t)->last] : &(t)->table[(i)])
 +#define TOPA_ENTRY(t, i)                              \
 +      ((i) == -1                                      \
 +              ? &topa_to_page(t)->table[(t)->last]    \
 +              : &topa_to_page(t)->table[(i)])
 +#define TOPA_ENTRY_SIZE(t, i) (sizes(TOPA_ENTRY((t), (i))->size))
 +#define TOPA_ENTRY_PAGES(t, i) (1 << TOPA_ENTRY((t), (i))->size)
  
  /**
   * topa_alloc() - allocate page-sized ToPA table
  static struct topa *topa_alloc(int cpu, gfp_t gfp)
  {
        int node = cpu_to_node(cpu);
 -      struct topa *topa;
 +      struct topa_page *tp;
        struct page *p;
  
        p = alloc_pages_node(node, gfp | __GFP_ZERO, 0);
        if (!p)
                return NULL;
  
 -      topa = page_address(p);
 -      topa->last = 0;
 -      topa->phys = page_to_phys(p);
 +      tp = page_address(p);
 +      tp->topa.last = 0;
  
        /*
         * In case of singe-entry ToPA, always put the self-referencing END
         * link as the 2nd entry in the table
         */
        if (!intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries)) {
 -              TOPA_ENTRY(topa, 1)->base = topa->phys >> TOPA_SHIFT;
 -              TOPA_ENTRY(topa, 1)->end = 1;
 +              TOPA_ENTRY(&tp->topa, 1)->base = page_to_phys(p);
 +              TOPA_ENTRY(&tp->topa, 1)->end = 1;
        }
  
 -      return topa;
 +      return &tp->topa;
  }
  
  /**
@@@ -671,7 -643,7 +671,7 @@@ static void topa_insert_table(struct pt
  
        BUG_ON(last->last != TENTS_PER_PAGE - 1);
  
 -      TOPA_ENTRY(last, -1)->base = topa->phys >> TOPA_SHIFT;
 +      TOPA_ENTRY(last, -1)->base = topa_pfn(topa);
        TOPA_ENTRY(last, -1)->end = 1;
  }
  
@@@ -698,7 -670,7 +698,7 @@@ static bool topa_table_full(struct top
   *
   * Return:    0 on success or error code.
   */
 -static int topa_insert_pages(struct pt_buffer *buf, gfp_t gfp)
 +static int topa_insert_pages(struct pt_buffer *buf, int cpu, gfp_t gfp)
  {
        struct topa *topa = buf->last;
        int order = 0;
                order = page_private(p);
  
        if (topa_table_full(topa)) {
 -              topa = topa_alloc(buf->cpu, gfp);
 +              topa = topa_alloc(cpu, gfp);
                if (!topa)
                        return -ENOMEM;
  
                topa_insert_table(buf, topa);
        }
  
 +      if (topa->z_count == topa->last - 1) {
 +              if (order == TOPA_ENTRY(topa, topa->last - 1)->size)
 +                      topa->z_count++;
 +      }
 +
        TOPA_ENTRY(topa, -1)->base = page_to_phys(p) >> TOPA_SHIFT;
        TOPA_ENTRY(topa, -1)->size = order;
        if (!buf->snapshot &&
@@@ -746,26 -713,23 +746,26 @@@ static void pt_topa_dump(struct pt_buff
        struct topa *topa;
  
        list_for_each_entry(topa, &buf->tables, list) {
 +              struct topa_page *tp = topa_to_page(topa);
                int i;
  
 -              pr_debug("# table @%p (%016Lx), off %llx size %zx\n", topa->table,
 -                       topa->phys, topa->offset, topa->size);
 +              pr_debug("# table @%p, off %llx size %zx\n", tp->table,
 +                       topa->offset, topa->size);
                for (i = 0; i < TENTS_PER_PAGE; i++) {
                        pr_debug("# entry @%p (%lx sz %u %c%c%c) raw=%16llx\n",
 -                               &topa->table[i],
 -                               (unsigned long)topa->table[i].base << TOPA_SHIFT,
 -                               sizes(topa->table[i].size),
 -                               topa->table[i].end ?  'E' : ' ',
 -                               topa->table[i].intr ? 'I' : ' ',
 -                               topa->table[i].stop ? 'S' : ' ',
 -                               *(u64 *)&topa->table[i]);
 +                               &tp->table[i],
 +                               (unsigned long)tp->table[i].base << TOPA_SHIFT,
 +                               sizes(tp->table[i].size),
 +                               tp->table[i].end ?  'E' : ' ',
 +                               tp->table[i].intr ? 'I' : ' ',
 +                               tp->table[i].stop ? 'S' : ' ',
 +                               *(u64 *)&tp->table[i]);
                        if ((intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries) &&
 -                           topa->table[i].stop) ||
 -                          topa->table[i].end)
 +                           tp->table[i].stop) ||
 +                          tp->table[i].end)
                                break;
 +                      if (!i && topa->z_count)
 +                              i += topa->z_count;
                }
        }
  }
@@@ -807,7 -771,7 +807,7 @@@ static void pt_update_head(struct pt *p
  
        /* offset of the current output region within this table */
        for (topa_idx = 0; topa_idx < buf->cur_idx; topa_idx++)
 -              base += sizes(buf->cur->table[topa_idx].size);
 +              base += TOPA_ENTRY_SIZE(buf->cur, topa_idx);
  
        if (buf->snapshot) {
                local_set(&buf->data_size, base);
   */
  static void *pt_buffer_region(struct pt_buffer *buf)
  {
 -      return phys_to_virt(buf->cur->table[buf->cur_idx].base << TOPA_SHIFT);
 +      return phys_to_virt(TOPA_ENTRY(buf->cur, buf->cur_idx)->base << TOPA_SHIFT);
  }
  
  /**
   */
  static size_t pt_buffer_region_size(struct pt_buffer *buf)
  {
 -      return sizes(buf->cur->table[buf->cur_idx].size);
 +      return TOPA_ENTRY_SIZE(buf->cur, buf->cur_idx);
  }
  
  /**
@@@ -866,7 -830,7 +866,7 @@@ static void pt_handle_status(struct pt 
                 * know.
                 */
                if (!intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries) ||
 -                  buf->output_off == sizes(TOPA_ENTRY(buf->cur, buf->cur_idx)->size)) {
 +                  buf->output_off == pt_buffer_region_size(buf)) {
                        perf_aux_output_flag(&pt->handle,
                                             PERF_AUX_FLAG_TRUNCATED);
                        advance++;
  static void pt_read_offset(struct pt_buffer *buf)
  {
        u64 offset, base_topa;
 +      struct topa_page *tp;
  
        rdmsrl(MSR_IA32_RTIT_OUTPUT_BASE, base_topa);
 -      buf->cur = phys_to_virt(base_topa);
 +      tp = phys_to_virt(base_topa);
 +      buf->cur = &tp->topa;
  
        rdmsrl(MSR_IA32_RTIT_OUTPUT_MASK, offset);
        /* offset within current output region */
        buf->cur_idx = (offset & 0xffffff80) >> 7;
  }
  
 -/**
 - * pt_topa_next_entry() - obtain index of the first page in the next ToPA entry
 - * @buf:      PT buffer.
 - * @pg:               Page offset in the buffer.
 - *
 - * When advancing to the next output region (ToPA entry), given a page offset
 - * into the buffer, we need to find the offset of the first page in the next
 - * region.
 - */
 -static unsigned int pt_topa_next_entry(struct pt_buffer *buf, unsigned int pg)
 +static struct topa_entry *
 +pt_topa_entry_for_page(struct pt_buffer *buf, unsigned int pg)
  {
 -      struct topa_entry *te = buf->topa_index[pg];
 +      struct topa_page *tp;
 +      struct topa *topa;
 +      unsigned int idx, cur_pg = 0, z_pg = 0, start_idx = 0;
  
 -      /* one region */
 -      if (buf->first == buf->last && buf->first->last == 1)
 -              return pg;
 +      /*
 +       * Indicates a bug in the caller.
 +       */
 +      if (WARN_ON_ONCE(pg >= buf->nr_pages))
 +              return NULL;
 +
 +      /*
 +       * First, find the ToPA table where @pg fits. With high
 +       * order allocations, there shouldn't be many of these.
 +       */
 +      list_for_each_entry(topa, &buf->tables, list) {
 +              if (topa->offset + topa->size > pg << PAGE_SHIFT)
 +                      goto found;
 +      }
 +
 +      /*
 +       * Hitting this means we have a problem in the ToPA
 +       * allocation code.
 +       */
 +      WARN_ON_ONCE(1);
  
 -      do {
 -              pg++;
 -              pg &= buf->nr_pages - 1;
 -      } while (buf->topa_index[pg] == te);
 +      return NULL;
  
 -      return pg;
 +found:
 +      /*
 +       * Indicates a problem in the ToPA allocation code.
 +       */
 +      if (WARN_ON_ONCE(topa->last == -1))
 +              return NULL;
 +
 +      tp = topa_to_page(topa);
 +      cur_pg = PFN_DOWN(topa->offset);
 +      if (topa->z_count) {
 +              z_pg = TOPA_ENTRY_PAGES(topa, 0) * (topa->z_count + 1);
 +              start_idx = topa->z_count + 1;
 +      }
 +
 +      /*
 +       * Multiple entries at the beginning of the table have the same size,
 +       * ideally all of them; if @pg falls there, the search is done.
 +       */
 +      if (pg >= cur_pg && pg < cur_pg + z_pg) {
 +              idx = (pg - cur_pg) / TOPA_ENTRY_PAGES(topa, 0);
 +              return &tp->table[idx];
 +      }
 +
 +      /*
 +       * Otherwise, slow path: iterate through the remaining entries.
 +       */
 +      for (idx = start_idx, cur_pg += z_pg; idx < topa->last; idx++) {
 +              if (cur_pg + TOPA_ENTRY_PAGES(topa, idx) > pg)
 +                      return &tp->table[idx];
 +
 +              cur_pg += TOPA_ENTRY_PAGES(topa, idx);
 +      }
 +
 +      /*
 +       * Means we couldn't find a ToPA entry in the table that does match.
 +       */
 +      WARN_ON_ONCE(1);
 +
 +      return NULL;
 +}
 +
 +static struct topa_entry *
 +pt_topa_prev_entry(struct pt_buffer *buf, struct topa_entry *te)
 +{
 +      unsigned long table = (unsigned long)te & ~(PAGE_SIZE - 1);
 +      struct topa_page *tp;
 +      struct topa *topa;
 +
 +      tp = (struct topa_page *)table;
 +      if (tp->table != te)
 +              return --te;
 +
 +      topa = &tp->topa;
 +      if (topa == buf->first)
 +              topa = buf->last;
 +      else
 +              topa = list_prev_entry(topa, list);
 +
 +      tp = topa_to_page(topa);
 +
 +      return &tp->table[topa->last - 1];
  }
  
  /**
@@@ -1031,7 -925,8 +1031,7 @@@ static int pt_buffer_reset_markers(stru
        unsigned long idx, npages, wakeup;
  
        /* can't stop in the middle of an output region */
 -      if (buf->output_off + handle->size + 1 <
 -          sizes(TOPA_ENTRY(buf->cur, buf->cur_idx)->size)) {
 +      if (buf->output_off + handle->size + 1 < pt_buffer_region_size(buf)) {
                perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
                return -EINVAL;
        }
                return 0;
  
        /* clear STOP and INT from current entry */
 -      buf->topa_index[buf->stop_pos]->stop = 0;
 -      buf->topa_index[buf->stop_pos]->intr = 0;
 -      buf->topa_index[buf->intr_pos]->intr = 0;
 +      if (buf->stop_te) {
 +              buf->stop_te->stop = 0;
 +              buf->stop_te->intr = 0;
 +      }
 +
 +      if (buf->intr_te)
 +              buf->intr_te->intr = 0;
  
        /* how many pages till the STOP marker */
        npages = handle->size >> PAGE_SHIFT;
  
        idx = (head >> PAGE_SHIFT) + npages;
        idx &= buf->nr_pages - 1;
 -      buf->stop_pos = idx;
 +
 +      if (idx != buf->stop_pos) {
 +              buf->stop_pos = idx;
 +              buf->stop_te = pt_topa_entry_for_page(buf, idx);
 +              buf->stop_te = pt_topa_prev_entry(buf, buf->stop_te);
 +      }
  
        wakeup = handle->wakeup >> PAGE_SHIFT;
  
                idx = wakeup;
  
        idx &= buf->nr_pages - 1;
 -      buf->intr_pos = idx;
 +      if (idx != buf->intr_pos) {
 +              buf->intr_pos = idx;
 +              buf->intr_te = pt_topa_entry_for_page(buf, idx);
 +              buf->intr_te = pt_topa_prev_entry(buf, buf->intr_te);
 +      }
  
 -      buf->topa_index[buf->stop_pos]->stop = 1;
 -      buf->topa_index[buf->stop_pos]->intr = 1;
 -      buf->topa_index[buf->intr_pos]->intr = 1;
 +      buf->stop_te->stop = 1;
 +      buf->stop_te->intr = 1;
 +      buf->intr_te->intr = 1;
  
        return 0;
  }
  
 -/**
 - * pt_buffer_setup_topa_index() - build topa_index[] table of regions
 - * @buf:      PT buffer.
 - *
 - * topa_index[] references output regions indexed by offset into the
 - * buffer for purposes of quick reverse lookup.
 - */
 -static void pt_buffer_setup_topa_index(struct pt_buffer *buf)
 -{
 -      struct topa *cur = buf->first, *prev = buf->last;
 -      struct topa_entry *te_cur = TOPA_ENTRY(cur, 0),
 -              *te_prev = TOPA_ENTRY(prev, prev->last - 1);
 -      int pg = 0, idx = 0;
 -
 -      while (pg < buf->nr_pages) {
 -              int tidx;
 -
 -              /* pages within one topa entry */
 -              for (tidx = 0; tidx < 1 << te_cur->size; tidx++, pg++)
 -                      buf->topa_index[pg] = te_prev;
 -
 -              te_prev = te_cur;
 -
 -              if (idx == cur->last - 1) {
 -                      /* advance to next topa table */
 -                      idx = 0;
 -                      cur = list_entry(cur->list.next, struct topa, list);
 -              } else {
 -                      idx++;
 -              }
 -              te_cur = TOPA_ENTRY(cur, idx);
 -      }
 -
 -}
 -
  /**
   * pt_buffer_reset_offsets() - adjust buffer's write pointers from aux_head
   * @buf:      PT buffer.
   */
  static void pt_buffer_reset_offsets(struct pt_buffer *buf, unsigned long head)
  {
 +      struct topa_page *cur_tp;
 +      struct topa_entry *te;
        int pg;
  
        if (buf->snapshot)
                head &= (buf->nr_pages << PAGE_SHIFT) - 1;
  
        pg = (head >> PAGE_SHIFT) & (buf->nr_pages - 1);
 -      pg = pt_topa_next_entry(buf, pg);
 +      te = pt_topa_entry_for_page(buf, pg);
  
 -      buf->cur = (struct topa *)((unsigned long)buf->topa_index[pg] & PAGE_MASK);
 -      buf->cur_idx = ((unsigned long)buf->topa_index[pg] -
 -                      (unsigned long)buf->cur) / sizeof(struct topa_entry);
 -      buf->output_off = head & (sizes(buf->cur->table[buf->cur_idx].size) - 1);
 +      cur_tp = topa_entry_to_page(te);
 +      buf->cur = &cur_tp->topa;
 +      buf->cur_idx = te - TOPA_ENTRY(buf->cur, 0);
 +      buf->output_off = head & (pt_buffer_region_size(buf) - 1);
  
        local64_set(&buf->head, head);
        local_set(&buf->data_size, 0);
@@@ -1146,29 -1061,31 +1146,29 @@@ static void pt_buffer_fini_topa(struct 
   * @size:     Total size of all regions within this ToPA.
   * @gfp:      Allocation flags.
   */
 -static int pt_buffer_init_topa(struct pt_buffer *buf, unsigned long nr_pages,
 -                             gfp_t gfp)
 +static int pt_buffer_init_topa(struct pt_buffer *buf, int cpu,
 +                             unsigned long nr_pages, gfp_t gfp)
  {
        struct topa *topa;
        int err;
  
 -      topa = topa_alloc(buf->cpu, gfp);
 +      topa = topa_alloc(cpu, gfp);
        if (!topa)
                return -ENOMEM;
  
        topa_insert_table(buf, topa);
  
        while (buf->nr_pages < nr_pages) {
 -              err = topa_insert_pages(buf, gfp);
 +              err = topa_insert_pages(buf, cpu, gfp);
                if (err) {
                        pt_buffer_fini_topa(buf);
                        return -ENOMEM;
                }
        }
  
 -      pt_buffer_setup_topa_index(buf);
 -
        /* link last table to the first one, unless we're double buffering */
        if (intel_pt_validate_hw_cap(PT_CAP_topa_multiple_entries)) {
 -              TOPA_ENTRY(buf->last, -1)->base = buf->first->phys >> TOPA_SHIFT;
 +              TOPA_ENTRY(buf->last, -1)->base = topa_pfn(buf->first);
                TOPA_ENTRY(buf->last, -1)->end = 1;
        }
  
@@@ -1202,18 -1119,18 +1202,18 @@@ pt_buffer_setup_aux(struct perf_event *
                cpu = raw_smp_processor_id();
        node = cpu_to_node(cpu);
  
 -      buf = kzalloc_node(offsetof(struct pt_buffer, topa_index[nr_pages]),
 -                         GFP_KERNEL, node);
 +      buf = kzalloc_node(sizeof(struct pt_buffer), GFP_KERNEL, node);
        if (!buf)
                return NULL;
  
 -      buf->cpu = cpu;
        buf->snapshot = snapshot;
        buf->data_pages = pages;
 +      buf->stop_pos = -1;
 +      buf->intr_pos = -1;
  
        INIT_LIST_HEAD(&buf->tables);
  
 -      ret = pt_buffer_init_topa(buf, nr_pages, GFP_KERNEL);
 +      ret = pt_buffer_init_topa(buf, cpu, nr_pages, GFP_KERNEL);
        if (ret) {
                kfree(buf);
                return NULL;
@@@ -1379,7 -1296,7 +1379,7 @@@ void intel_pt_interrupt(void
                        return;
                }
  
 -              pt_config_buffer(buf->cur->table, buf->cur_idx,
 +              pt_config_buffer(topa_to_page(buf->cur)->table, buf->cur_idx,
                                 buf->output_off);
                pt_config(event);
        }
@@@ -1444,7 -1361,7 +1444,7 @@@ static void pt_event_start(struct perf_
        WRITE_ONCE(pt->handle_nmi, 1);
        hwc->state = 0;
  
 -      pt_config_buffer(buf->cur->table, buf->cur_idx,
 +      pt_config_buffer(topa_to_page(buf->cur)->table, buf->cur_idx,
                         buf->output_off);
        pt_config(event);
  
@@@ -1564,11 -1481,6 +1564,11 @@@ void cpu_emergency_stop_pt(void
                pt_event_stop(pt->handle.event, PERF_EF_UPDATE);
  }
  
 +int is_intel_pt_event(struct perf_event *event)
 +{
 +      return event->pmu == &pt_pmu.pmu;
 +}
 +
  static __init int pt_init(void)
  {
        int ret, cpu, prior_warn = 0;
index f34b9491ea6eafa4cc7d293bd5aaffec5b62a5e0,22f5843ef406648745fb352203d19084eb893360..5053a403e4ae0e9e9bea4831fa01b33696c5b9f5
@@@ -634,7 -634,7 +634,7 @@@ static void cleanup_rapl_pmus(void
        kfree(rapl_pmus);
  }
  
 -const struct attribute_group *rapl_attr_update[] = {
 +static const struct attribute_group *rapl_attr_update[] = {
        &rapl_events_cores_group,
        &rapl_events_pkg_group,
        &rapl_events_ram_group,
@@@ -720,27 -720,27 +720,27 @@@ static const struct x86_cpu_id rapl_mod
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_SANDYBRIDGE_X,          model_snbep),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_IVYBRIDGE,              model_snb),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_IVYBRIDGE_X,            model_snbep),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_HASWELL_CORE,           model_hsw),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_HASWELL,                model_hsw),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_HASWELL_X,              model_hsx),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_HASWELL_ULT,            model_hsw),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_HASWELL_GT3E,           model_hsw),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_CORE,         model_hsw),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_GT3E,         model_hsw),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_HASWELL_L,              model_hsw),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_HASWELL_G,              model_hsw),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL,              model_hsw),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_G,            model_hsw),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_X,            model_hsx),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_XEON_D,       model_hsx),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_D,            model_hsx),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_XEON_PHI_KNL,           model_knl),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_XEON_PHI_KNM,           model_knl),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_SKYLAKE_MOBILE,         model_skl),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_SKYLAKE_DESKTOP,        model_skl),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_SKYLAKE_L,              model_skl),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_SKYLAKE,                model_skl),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_SKYLAKE_X,              model_hsx),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_KABYLAKE_MOBILE,        model_skl),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_KABYLAKE_DESKTOP,       model_skl),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_CANNONLAKE_MOBILE,      model_skl),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_KABYLAKE_L,             model_skl),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_KABYLAKE,               model_skl),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_CANNONLAKE_L,           model_skl),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_ATOM_GOLDMONT,          model_hsw),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_ATOM_GOLDMONT_X,        model_hsw),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_ATOM_GOLDMONT_D,        model_hsw),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_ATOM_GOLDMONT_PLUS,     model_hsw),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_ICELAKE_MOBILE,         model_skl),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_ICELAKE_DESKTOP,        model_skl),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_ICELAKE_L,              model_skl),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_ICELAKE,                model_skl),
        {},
  };
  
diff --combined arch/x86/events/msr.c
index 5812e8747d1f0de1e739960d5b5bf3947c3d73be,ab79d3100241d481a4bd2b2b0006afdbcbfd9bf1..b1afc77f0704481157cd4c3cafbecfbb31a86136
@@@ -59,22 -59,22 +59,22 @@@ static bool test_intel(int idx, void *d
        case INTEL_FAM6_IVYBRIDGE:
        case INTEL_FAM6_IVYBRIDGE_X:
  
-       case INTEL_FAM6_HASWELL_CORE:
+       case INTEL_FAM6_HASWELL:
        case INTEL_FAM6_HASWELL_X:
-       case INTEL_FAM6_HASWELL_ULT:
-       case INTEL_FAM6_HASWELL_GT3E:
+       case INTEL_FAM6_HASWELL_L:
+       case INTEL_FAM6_HASWELL_G:
  
-       case INTEL_FAM6_BROADWELL_CORE:
-       case INTEL_FAM6_BROADWELL_XEON_D:
-       case INTEL_FAM6_BROADWELL_GT3E:
+       case INTEL_FAM6_BROADWELL:
+       case INTEL_FAM6_BROADWELL_D:
+       case INTEL_FAM6_BROADWELL_G:
        case INTEL_FAM6_BROADWELL_X:
  
        case INTEL_FAM6_ATOM_SILVERMONT:
-       case INTEL_FAM6_ATOM_SILVERMONT_X:
+       case INTEL_FAM6_ATOM_SILVERMONT_D:
        case INTEL_FAM6_ATOM_AIRMONT:
  
        case INTEL_FAM6_ATOM_GOLDMONT:
-       case INTEL_FAM6_ATOM_GOLDMONT_X:
+       case INTEL_FAM6_ATOM_GOLDMONT_D:
  
        case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
  
                        return true;
                break;
  
-       case INTEL_FAM6_SKYLAKE_MOBILE:
-       case INTEL_FAM6_SKYLAKE_DESKTOP:
+       case INTEL_FAM6_SKYLAKE_L:
+       case INTEL_FAM6_SKYLAKE:
        case INTEL_FAM6_SKYLAKE_X:
-       case INTEL_FAM6_KABYLAKE_MOBILE:
-       case INTEL_FAM6_KABYLAKE_DESKTOP:
-       case INTEL_FAM6_ICELAKE_MOBILE:
+       case INTEL_FAM6_KABYLAKE_L:
+       case INTEL_FAM6_KABYLAKE:
+       case INTEL_FAM6_ICELAKE_L:
                if (idx == PERF_MSR_SMI || idx == PERF_MSR_PPERF)
                        return true;
                break;
@@@ -167,7 -167,7 +167,7 @@@ static const struct attribute_group *at
        NULL,
  };
  
 -const struct attribute_group *attr_update[] = {
 +static const struct attribute_group *attr_update[] = {
        &group_aperf,
        &group_mperf,
        &group_pperf,
index de753206b4274e35fbdd58cd50eaeaf69475447b,695881ef682c3462ccc26c1863f747de3f06fd7b..20ce682a2540f389dc62f29dbf07c0b3f32620ea
  /* Alternative perfctr range with full access. */
  #define MSR_IA32_PMC0                 0x000004c1
  
- /* AMD64 MSRs. Not complete. See the architecture manual for a more
-    complete list. */
 +/* Auto-reload via MSR instead of DS area */
 +#define MSR_RELOAD_PMC0                       0x000014c1
 +#define MSR_RELOAD_FIXED_CTR0         0x00001309
 +
+ /*
+  * AMD64 MSRs. Not complete. See the architecture manual for a more
+  * complete list.
+  */
  #define MSR_AMD64_PATCH_LEVEL         0x0000008b
  #define MSR_AMD64_TSC_RATIO           0xc0000104
  #define MSR_AMD64_NB_CFG              0xc001001f
  #define MSR_AMD64_CPUID_FN_1          0xc0011004
  #define MSR_AMD64_PATCH_LOADER                0xc0010020
+ #define MSR_AMD_PERF_CTL              0xc0010062
+ #define MSR_AMD_PERF_STATUS           0xc0010063
+ #define MSR_AMD_PSTATE_DEF_BASE               0xc0010064
  #define MSR_AMD64_OSVW_ID_LENGTH      0xc0010140
  #define MSR_AMD64_OSVW_STATUS         0xc0010141
  #define MSR_AMD64_LS_CFG              0xc0011020
  #define MSR_IA32_PERF_STATUS          0x00000198
  #define MSR_IA32_PERF_CTL             0x00000199
  #define INTEL_PERF_CTL_MASK           0xffff
- #define MSR_AMD_PSTATE_DEF_BASE               0xc0010064
- #define MSR_AMD_PERF_STATUS           0xc0010063
- #define MSR_AMD_PERF_CTL              0xc0010062
  
  #define MSR_IA32_MPERF                        0x000000e7
  #define MSR_IA32_APERF                        0x000000e8
index 08fb79f377936c7725af66bf7bdeaf8f94c70c02,78f7e763f2cd7c8d2763d0d943049474bbf83adf..909abb2d59eb164f905cf6804f60935cc9b60723
@@@ -590,21 -590,21 +590,21 @@@ static u32 skx_deadline_rev(void
  static const struct x86_cpu_id deadline_match[] = {
        DEADLINE_MODEL_MATCH_FUNC( INTEL_FAM6_HASWELL_X,        hsx_deadline_rev),
        DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL_X,      0x0b000020),
-       DEADLINE_MODEL_MATCH_FUNC( INTEL_FAM6_BROADWELL_XEON_D, bdx_deadline_rev),
+       DEADLINE_MODEL_MATCH_FUNC( INTEL_FAM6_BROADWELL_D,      bdx_deadline_rev),
        DEADLINE_MODEL_MATCH_FUNC( INTEL_FAM6_SKYLAKE_X,        skx_deadline_rev),
  
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL_CORE,     0x22),
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL_ULT,      0x20),
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL_GT3E,     0x17),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL,          0x22),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL_L,        0x20),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_HASWELL_G,        0x17),
  
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL_CORE,   0x25),
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL_GT3E,   0x17),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL,        0x25),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_BROADWELL_G,      0x17),
  
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_SKYLAKE_MOBILE,   0xb2),
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_SKYLAKE_DESKTOP,  0xb2),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_SKYLAKE_L,        0xb2),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_SKYLAKE,          0xb2),
  
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_KABYLAKE_MOBILE,  0x52),
-       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_KABYLAKE_DESKTOP, 0x52),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_KABYLAKE_L,       0x52),
+       DEADLINE_MODEL_MATCH_REV ( INTEL_FAM6_KABYLAKE,         0x52),
  
        {},
  };
@@@ -834,10 -834,6 +834,10 @@@ bool __init apic_needs_pit(void
        if (!boot_cpu_has(X86_FEATURE_APIC))
                return true;
  
 +      /* Virt guests may lack ARAT, but still have DEADLINE */
 +      if (!boot_cpu_has(X86_FEATURE_ARAT))
 +              return true;
 +
        /* Deadline timer is based on TSC so no further PIT action required */
        if (boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER))
                return false;
@@@ -1183,6 -1179,10 +1183,6 @@@ void clear_local_APIC(void
        apic_write(APIC_LVT0, v | APIC_LVT_MASKED);
        v = apic_read(APIC_LVT1);
        apic_write(APIC_LVT1, v | APIC_LVT_MASKED);
 -      if (!x2apic_enabled()) {
 -              v = apic_read(APIC_LDR) & ~APIC_LDR_MASK;
 -              apic_write(APIC_LDR, v);
 -      }
        if (maxlvt >= 4) {
                v = apic_read(APIC_LVTPC);
                apic_write(APIC_LVTPC, v | APIC_LVT_MASKED);
index 7d6e0efcc2db3cf909c2fd868311ac496b9a1070,29f0cdfbdca5d5036a6ed1c9c9019e9408efe306..90f75e5158769c8690f745184c1271ddc6dffd20
@@@ -8,7 -8,6 +8,7 @@@
  #include <linux/sched.h>
  #include <linux/sched/clock.h>
  #include <linux/random.h>
 +#include <linux/topology.h>
  #include <asm/processor.h>
  #include <asm/apic.h>
  #include <asm/cacheinfo.h>
@@@ -890,10 -889,6 +890,10 @@@ static void init_amd_zn(struct cpuinfo_
  {
        set_cpu_cap(c, X86_FEATURE_ZEN);
  
 +#ifdef CONFIG_NUMA
 +      node_reclaim_distance = 32;
 +#endif
 +
        /*
         * Fix erratum 1076: CPB feature bit not being set in CPUID.
         * Always set it, except when running under a hypervisor.
@@@ -950,12 -945,8 +950,8 @@@ static void init_amd(struct cpuinfo_x8
        init_amd_cacheinfo(c);
  
        if (cpu_has(c, X86_FEATURE_XMM2)) {
-               unsigned long long val;
-               int ret;
                /*
-                * A serializing LFENCE has less overhead than MFENCE, so
-                * use it for execution serialization.  On families which
+                * Use LFENCE for execution serialization.  On families which
                 * don't have that MSR, LFENCE is already serializing.
                 * msr_set_bit() uses the safe accessors, too, even if the MSR
                 * is not present.
                msr_set_bit(MSR_F10H_DECFG,
                            MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
  
-               /*
-                * Verify that the MSR write was successful (could be running
-                * under a hypervisor) and only then assume that LFENCE is
-                * serializing.
-                */
-               ret = rdmsrl_safe(MSR_F10H_DECFG, &val);
-               if (!ret && (val & MSR_F10H_DECFG_LFENCE_SERIALIZE)) {
-                       /* A serializing LFENCE stops RDTSC speculation */
-                       set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
-               } else {
-                       /* MFENCE stops RDTSC speculation */
-                       set_cpu_cap(c, X86_FEATURE_MFENCE_RDTSC);
-               }
+               /* A serializing LFENCE stops RDTSC speculation */
+               set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
        }
  
        /*
diff --combined drivers/edac/pnd2_edac.c
index 1ad538baaa4a95b391964e87b5b4608bbb03d9d2,a6846be0d2eb94325d9966939e3ca70c657e68a6..b1193be1ef1d8387bdda03407f17e149c4c87934
@@@ -260,14 -260,11 +260,14 @@@ static u64 get_sideband_reg_base_addr(v
        }
  }
  
 +#define DNV_MCHBAR_SIZE  0x8000
 +#define DNV_SB_PORT_SIZE 0x10000
  static int dnv_rd_reg(int port, int off, int op, void *data, size_t sz, char *name)
  {
        struct pci_dev *pdev;
        char *base;
        u64 addr;
 +      unsigned long size;
  
        if (op == 4) {
                pdev = pci_get_device(PCI_VENDOR_ID_INTEL, 0x1980, NULL);
                        addr = get_mem_ctrl_hub_base_addr();
                        if (!addr)
                                return -ENODEV;
 +                      size = DNV_MCHBAR_SIZE;
                } else {
                        /* MMIO via sideband register base address */
                        addr = get_sideband_reg_base_addr();
                        if (!addr)
                                return -ENODEV;
                        addr += (port << 16);
 +                      size = DNV_SB_PORT_SIZE;
                }
  
 -              base = ioremap((resource_size_t)addr, 0x10000);
 +              base = ioremap((resource_size_t)addr, size);
                if (!base)
                        return -ENODEV;
  
@@@ -1538,7 -1533,7 +1538,7 @@@ static struct dunit_ops dnv_ops = 
  
  static const struct x86_cpu_id pnd2_cpuids[] = {
        { X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_GOLDMONT, 0, (kernel_ulong_t)&apl_ops },
-       { X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_GOLDMONT_X, 0, (kernel_ulong_t)&dnv_ops },
+       { X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_GOLDMONT_D, 0, (kernel_ulong_t)&dnv_ops },
        { }
  };
  MODULE_DEVICE_TABLE(x86cpu, pnd2_cpuids);
index 2e927b3e9d6c717fcdb9bcadf736b7ede0c58f16,961e0a4a0f738ebaa6d4aaf771939bec56681a81..7da1b37b27aa5b75fb89b79f0d9f193e5021a911
@@@ -181,7 -181,7 +181,7 @@@ struct prctl_mm_map 
  #define PR_GET_THP_DISABLE    42
  
  /*
-  * Tell the kernel to start/stop helping userspace manage bounds tables.
+  * No longer implemented, but left here to ensure the numbers stay reserved:
   */
  #define PR_MPX_ENABLE_MANAGEMENT  43
  #define PR_MPX_DISABLE_MANAGEMENT 44
  # define PR_PAC_APDBKEY                       (1UL << 3)
  # define PR_PAC_APGAKEY                       (1UL << 4)
  
 +/* Tagged user address controls for arm64 */
 +#define PR_SET_TAGGED_ADDR_CTRL               55
 +#define PR_GET_TAGGED_ADDR_CTRL               56
 +# define PR_TAGGED_ADDR_ENABLE                (1UL << 0)
 +
  #endif /* _LINUX_PRCTL_H */
diff --combined kernel/sys.c
index ec48396b494375aa22dc8a3d5570cd477db4b429,384b000b7865cca26e154b166f366b12f8f44a16..d605fe5e58a5805410ec74d1e9bffaddff0dd169
  #ifndef SET_TSC_CTL
  # define SET_TSC_CTL(a)               (-EINVAL)
  #endif
- #ifndef MPX_ENABLE_MANAGEMENT
- # define MPX_ENABLE_MANAGEMENT()      (-EINVAL)
- #endif
- #ifndef MPX_DISABLE_MANAGEMENT
- # define MPX_DISABLE_MANAGEMENT()     (-EINVAL)
- #endif
  #ifndef GET_FP_MODE
  # define GET_FP_MODE(a)               (-EINVAL)
  #endif
  #ifndef PAC_RESET_KEYS
  # define PAC_RESET_KEYS(a, b) (-EINVAL)
  #endif
 +#ifndef SET_TAGGED_ADDR_CTRL
 +# define SET_TAGGED_ADDR_CTRL(a)      (-EINVAL)
 +#endif
 +#ifndef GET_TAGGED_ADDR_CTRL
 +# define GET_TAGGED_ADDR_CTRL()               (-EINVAL)
 +#endif
  
  /*
   * this is where the system-wide overflow UID and GID are defined, for
@@@ -2462,15 -2450,9 +2456,9 @@@ SYSCALL_DEFINE5(prctl, int, option, uns
                up_write(&me->mm->mmap_sem);
                break;
        case PR_MPX_ENABLE_MANAGEMENT:
-               if (arg2 || arg3 || arg4 || arg5)
-                       return -EINVAL;
-               error = MPX_ENABLE_MANAGEMENT();
-               break;
        case PR_MPX_DISABLE_MANAGEMENT:
-               if (arg2 || arg3 || arg4 || arg5)
-                       return -EINVAL;
-               error = MPX_DISABLE_MANAGEMENT();
-               break;
+               /* No longer implemented: */
+               return -EINVAL;
        case PR_SET_FP_MODE:
                error = SET_FP_MODE(me, arg2);
                break;
                        return -EINVAL;
                error = PAC_RESET_KEYS(me, arg2);
                break;
 +      case PR_SET_TAGGED_ADDR_CTRL:
 +              if (arg3 || arg4 || arg5)
 +                      return -EINVAL;
 +              error = SET_TAGGED_ADDR_CTRL(arg2);
 +              break;
 +      case PR_GET_TAGGED_ADDR_CTRL:
 +              if (arg2 || arg3 || arg4 || arg5)
 +                      return -EINVAL;
 +              error = GET_TAGGED_ADDR_CTRL();
 +              break;
        default:
                error = -EINVAL;
                break;
index e880f2408e29d5e56bb659d851ccb254cc9a148e,9b98edb6b2d39e515bdc7cbeda9b6bc5dca7f591..5171b9c7ca3e70e10c4a91c89a76a7d2c8f50b33
@@@ -96,7 -96,6 +96,6 @@@
  #define X86_FEATURE_SYSCALL32         ( 3*32+14) /* "" syscall in IA32 userspace */
  #define X86_FEATURE_SYSENTER32                ( 3*32+15) /* "" sysenter in IA32 userspace */
  #define X86_FEATURE_REP_GOOD          ( 3*32+16) /* REP microcode works well */
- #define X86_FEATURE_MFENCE_RDTSC      ( 3*32+17) /* "" MFENCE synchronizes RDTSC */
  #define X86_FEATURE_LFENCE_RDTSC      ( 3*32+18) /* "" LFENCE synchronizes RDTSC */
  #define X86_FEATURE_ACC_POWER         ( 3*32+19) /* AMD Accumulated Power Mechanism */
  #define X86_FEATURE_NOPL              ( 3*32+20) /* The NOPL (0F 1F) instructions */
  #define X86_FEATURE_CQM_OCCUP_LLC     (11*32+ 1) /* LLC occupancy monitoring */
  #define X86_FEATURE_CQM_MBM_TOTAL     (11*32+ 2) /* LLC Total MBM monitoring */
  #define X86_FEATURE_CQM_MBM_LOCAL     (11*32+ 3) /* LLC Local MBM monitoring */
 +#define X86_FEATURE_FENCE_SWAPGS_USER (11*32+ 4) /* "" LFENCE in user entry SWAPGS path */
 +#define X86_FEATURE_FENCE_SWAPGS_KERNEL       (11*32+ 5) /* "" LFENCE in kernel entry SWAPGS path */
  
  /* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */
  #define X86_FEATURE_AVX512_BF16               (12*32+ 5) /* AVX512 BFLOAT16 instructions */
  #define X86_BUG_L1TF                  X86_BUG(18) /* CPU is affected by L1 Terminal Fault */
  #define X86_BUG_MDS                   X86_BUG(19) /* CPU is affected by Microarchitectural data sampling */
  #define X86_BUG_MSBDS_ONLY            X86_BUG(20) /* CPU is only affected by the  MSDBS variant of BUG_MDS */
 +#define X86_BUG_SWAPGS                        X86_BUG(21) /* CPU is affected by speculation through SWAPGS */
  
  #endif /* _ASM_X86_CPUFEATURES_H */