[v10,00/29] KVM: x86/pmu: selftests: Fixes and new tests

Message ID 20240109230250.424295-1-seanjc@google.com
Headers
Series KVM: x86/pmu: selftests: Fixes and new tests |

Message

Sean Christopherson Jan. 9, 2024, 11:02 p.m. UTC
  Knock wood, _this_ is the final of fixes and tests for PMU counters.  New
in v10 is a small refactor to treat FIXED as a value, not a flag, when
emulating RDPMC.  Everything else is the same as v9 (although rebased, but
there were no conflicts).

v10:
 - Collect review. [Dapeng]
 - Treat the FIXED type in RDPMC's ECX as a value, not a flag. [Jim]

v9:
 - https://lore.kernel.org/all/20231202000417.922113-1-seanjc@google.com
 - Collect reviews. [Dapeng, Kan]
 - Fix a 63:31 => 63:32 typo in a changelog. [Dapeng]
 - Actually check that forced emulation is enabled before trying to force
   emulation on RDPMC. [Jinrong]
 - Fix the aformentioned priority inversion issue.
 - Completely drop "support" for fast RDPMC, in quotes because KVM doesn't
   actually support RDPMC for non-architectural PMUs.  I had left the code
   in v8 because I didn't fully grok what the early emulator check was
   doing, i.e. wasn't 100% confident it was dead code.

v8:
 - https://lore.kernel.org/all/20231110021306.1269082-1-seanjc@google.com
 - Collect reviews. [Jim, Dapeng, Kan]
 - Tweak names for the RDPMC flags in the selftests #defines.
 - Get the event selectors used to virtualize fixed straight from perf
   instead of hardcoding the (wrong) selectors in KVM. [Kan]
 - Rename an "eventsel" field to "event" for a patch that gets blasted
   away in the end anyways. [Jim]
 - Add patches to fix RDPMC emulation and to test the behavior on Intel.
   I spot tested on AMD and spent ~30 minutes trying to squeeze in the
   bare minimum AMD support, but the PMU implementations between Intel
   and AMD are juuuust different enough to make adding AMD support non-
   trivial, and this series is already way too big.
 
v7:
 - https://lore.kernel.org/all/20231108003135.546002-1-seanjc@google.com
 - Drop patches that unnecessarily sanitized supported CPUID. [Jim]
 - Purge the array of architectural event encodings. [Jim, Dapeng]
 - Clean up pmu.h to remove useless macros, and make it easier to use the
   new macros. [Jim]
 - Port more of pmu_event_filter_test.c to pmu.h macros. [Jim, Jinrong]
 - Clean up test comments and error messages. [Jim]
 - Sanity check the value provided to vcpu_set_cpuid_property(). [Jim]

v6:
 - https://lore.kernel.org/all/20231104000239.367005-1-seanjc@google.com
 - Test LLC references/misses with CFLUSH{OPT}. [Jim]
 - Make the tests play nice without PERF_CAPABILITIES. [Mingwei]
 - Don't squash eventsels that happen to match an unsupported arch event. [Kan]
 - Test PMC counters with forced emulation (don't ask how long it took me to
   figure out how to read integer module params).

v5: https://lore.kernel.org/all/20231024002633.2540714-1-seanjc@google.com
v4: https://lore.kernel.org/all/20230911114347.85882-1-cloudliang@tencent.com
v3: https://lore.kernel.org/kvm/20230814115108.45741-1-cloudliang@tencent.com

Jinrong Liang (7):
  KVM: selftests: Add vcpu_set_cpuid_property() to set properties
  KVM: selftests: Add pmu.h and lib/pmu.c for common PMU assets
  KVM: selftests: Test Intel PMU architectural events on gp counters
  KVM: selftests: Test Intel PMU architectural events on fixed counters
  KVM: selftests: Test consistency of CPUID with num of gp counters
  KVM: selftests: Test consistency of CPUID with num of fixed counters
  KVM: selftests: Add functional test for Intel's fixed PMU counters

Sean Christopherson (22):
  KVM: x86/pmu: Always treat Fixed counters as available when supported
  KVM: x86/pmu: Allow programming events that match unsupported arch
    events
  KVM: x86/pmu: Remove KVM's enumeration of Intel's architectural
    encodings
  KVM: x86/pmu: Setup fixed counters' eventsel during PMU initialization
  KVM: x86/pmu: Get eventsel for fixed counters from perf
  KVM: x86/pmu: Don't ignore bits 31:30 for RDPMC index on AMD
  KVM: x86/pmu: Prioritize VMX interception over #GP on RDPMC due to bad
    index
  KVM: x86/pmu: Apply "fast" RDPMC only to Intel PMUs
  KVM: x86/pmu: Disallow "fast" RDPMC for architectural Intel PMUs
  KVM: x86/pmu: Treat "fixed" PMU type in RDPMC as index as a value, not
    flag
  KVM: x86/pmu: Explicitly check for RDPMC of unsupported Intel PMC
    types
  KVM: selftests: Drop the "name" param from KVM_X86_PMU_FEATURE()
  KVM: selftests: Extend {kvm,this}_pmu_has() to support fixed counters
  KVM: selftests: Expand PMU counters test to verify LLC events
  KVM: selftests: Add a helper to query if the PMU module param is
    enabled
  KVM: selftests: Add helpers to read integer module params
  KVM: selftests: Query module param to detect FEP in MSR filtering test
  KVM: selftests: Move KVM_FEP macro into common library header
  KVM: selftests: Test PMC virtualization with forced emulation
  KVM: selftests: Add a forced emulation variation of KVM_ASM_SAFE()
  KVM: selftests: Add helpers for safe and safe+forced RDMSR, RDPMC, and
    XGETBV
  KVM: selftests: Extend PMU counters test to validate RDPMC after WRMSR

 arch/x86/include/asm/kvm-x86-pmu-ops.h        |   3 +-
 arch/x86/kvm/emulate.c                        |   2 +-
 arch/x86/kvm/kvm_emulate.h                    |   2 +-
 arch/x86/kvm/pmu.c                            |  20 +-
 arch/x86/kvm/pmu.h                            |   5 +-
 arch/x86/kvm/svm/pmu.c                        |  17 +-
 arch/x86/kvm/vmx/pmu_intel.c                  | 178 +++--
 arch/x86/kvm/x86.c                            |   9 +-
 tools/testing/selftests/kvm/Makefile          |   2 +
 .../selftests/kvm/include/kvm_util_base.h     |   4 +
 tools/testing/selftests/kvm/include/pmu.h     |  97 +++
 .../selftests/kvm/include/x86_64/processor.h  | 148 ++++-
 tools/testing/selftests/kvm/lib/kvm_util.c    |  62 +-
 tools/testing/selftests/kvm/lib/pmu.c         |  31 +
 .../selftests/kvm/lib/x86_64/processor.c      |  15 +-
 .../selftests/kvm/x86_64/pmu_counters_test.c  | 617 ++++++++++++++++++
 .../kvm/x86_64/pmu_event_filter_test.c        | 143 ++--
 .../smaller_maxphyaddr_emulation_test.c       |   2 +-
 .../kvm/x86_64/userspace_msr_exit_test.c      |  29 +-
 .../selftests/kvm/x86_64/vmx_pmu_caps_test.c  |   2 +-
 20 files changed, 1097 insertions(+), 291 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/include/pmu.h
 create mode 100644 tools/testing/selftests/kvm/lib/pmu.c
 create mode 100644 tools/testing/selftests/kvm/x86_64/pmu_counters_test.c


base-commit: 1c6d984f523f67ecfad1083bb04c55d91977bb15
  

Comments

Mi, Dapeng Jan. 12, 2024, 9:17 a.m. UTC | #1
On 1/10/2024 7:02 AM, Sean Christopherson wrote:
> Knock wood, _this_ is the final of fixes and tests for PMU counters.  New
> in v10 is a small refactor to treat FIXED as a value, not a flag, when
> emulating RDPMC.  Everything else is the same as v9 (although rebased, but
> there were no conflicts).
>
> v10:
>   - Collect review. [Dapeng]
>   - Treat the FIXED type in RDPMC's ECX as a value, not a flag. [Jim]
>
> v9:
>   - https://lore.kernel.org/all/20231202000417.922113-1-seanjc@google.com
>   - Collect reviews. [Dapeng, Kan]
>   - Fix a 63:31 => 63:32 typo in a changelog. [Dapeng]
>   - Actually check that forced emulation is enabled before trying to force
>     emulation on RDPMC. [Jinrong]
>   - Fix the aformentioned priority inversion issue.
>   - Completely drop "support" for fast RDPMC, in quotes because KVM doesn't
>     actually support RDPMC for non-architectural PMUs.  I had left the code
>     in v8 because I didn't fully grok what the early emulator check was
>     doing, i.e. wasn't 100% confident it was dead code.
>
> v8:
>   - https://lore.kernel.org/all/20231110021306.1269082-1-seanjc@google.com
>   - Collect reviews. [Jim, Dapeng, Kan]
>   - Tweak names for the RDPMC flags in the selftests #defines.
>   - Get the event selectors used to virtualize fixed straight from perf
>     instead of hardcoding the (wrong) selectors in KVM. [Kan]
>   - Rename an "eventsel" field to "event" for a patch that gets blasted
>     away in the end anyways. [Jim]
>   - Add patches to fix RDPMC emulation and to test the behavior on Intel.
>     I spot tested on AMD and spent ~30 minutes trying to squeeze in the
>     bare minimum AMD support, but the PMU implementations between Intel
>     and AMD are juuuust different enough to make adding AMD support non-
>     trivial, and this series is already way too big.
>   
> v7:
>   - https://lore.kernel.org/all/20231108003135.546002-1-seanjc@google.com
>   - Drop patches that unnecessarily sanitized supported CPUID. [Jim]
>   - Purge the array of architectural event encodings. [Jim, Dapeng]
>   - Clean up pmu.h to remove useless macros, and make it easier to use the
>     new macros. [Jim]
>   - Port more of pmu_event_filter_test.c to pmu.h macros. [Jim, Jinrong]
>   - Clean up test comments and error messages. [Jim]
>   - Sanity check the value provided to vcpu_set_cpuid_property(). [Jim]
>
> v6:
>   - https://lore.kernel.org/all/20231104000239.367005-1-seanjc@google.com
>   - Test LLC references/misses with CFLUSH{OPT}. [Jim]
>   - Make the tests play nice without PERF_CAPABILITIES. [Mingwei]
>   - Don't squash eventsels that happen to match an unsupported arch event. [Kan]
>   - Test PMC counters with forced emulation (don't ask how long it took me to
>     figure out how to read integer module params).
>
> v5: https://lore.kernel.org/all/20231024002633.2540714-1-seanjc@google.com
> v4: https://lore.kernel.org/all/20230911114347.85882-1-cloudliang@tencent.com
> v3: https://lore.kernel.org/kvm/20230814115108.45741-1-cloudliang@tencent.com
>
> Jinrong Liang (7):
>    KVM: selftests: Add vcpu_set_cpuid_property() to set properties
>    KVM: selftests: Add pmu.h and lib/pmu.c for common PMU assets
>    KVM: selftests: Test Intel PMU architectural events on gp counters
>    KVM: selftests: Test Intel PMU architectural events on fixed counters
>    KVM: selftests: Test consistency of CPUID with num of gp counters
>    KVM: selftests: Test consistency of CPUID with num of fixed counters
>    KVM: selftests: Add functional test for Intel's fixed PMU counters
>
> Sean Christopherson (22):
>    KVM: x86/pmu: Always treat Fixed counters as available when supported
>    KVM: x86/pmu: Allow programming events that match unsupported arch
>      events
>    KVM: x86/pmu: Remove KVM's enumeration of Intel's architectural
>      encodings
>    KVM: x86/pmu: Setup fixed counters' eventsel during PMU initialization
>    KVM: x86/pmu: Get eventsel for fixed counters from perf
>    KVM: x86/pmu: Don't ignore bits 31:30 for RDPMC index on AMD
>    KVM: x86/pmu: Prioritize VMX interception over #GP on RDPMC due to bad
>      index
>    KVM: x86/pmu: Apply "fast" RDPMC only to Intel PMUs
>    KVM: x86/pmu: Disallow "fast" RDPMC for architectural Intel PMUs
>    KVM: x86/pmu: Treat "fixed" PMU type in RDPMC as index as a value, not
>      flag
>    KVM: x86/pmu: Explicitly check for RDPMC of unsupported Intel PMC
>      types
>    KVM: selftests: Drop the "name" param from KVM_X86_PMU_FEATURE()
>    KVM: selftests: Extend {kvm,this}_pmu_has() to support fixed counters
>    KVM: selftests: Expand PMU counters test to verify LLC events
>    KVM: selftests: Add a helper to query if the PMU module param is
>      enabled
>    KVM: selftests: Add helpers to read integer module params
>    KVM: selftests: Query module param to detect FEP in MSR filtering test
>    KVM: selftests: Move KVM_FEP macro into common library header
>    KVM: selftests: Test PMC virtualization with forced emulation
>    KVM: selftests: Add a forced emulation variation of KVM_ASM_SAFE()
>    KVM: selftests: Add helpers for safe and safe+forced RDMSR, RDPMC, and
>      XGETBV
>    KVM: selftests: Extend PMU counters test to validate RDPMC after WRMSR
>
>   arch/x86/include/asm/kvm-x86-pmu-ops.h        |   3 +-
>   arch/x86/kvm/emulate.c                        |   2 +-
>   arch/x86/kvm/kvm_emulate.h                    |   2 +-
>   arch/x86/kvm/pmu.c                            |  20 +-
>   arch/x86/kvm/pmu.h                            |   5 +-
>   arch/x86/kvm/svm/pmu.c                        |  17 +-
>   arch/x86/kvm/vmx/pmu_intel.c                  | 178 +++--
>   arch/x86/kvm/x86.c                            |   9 +-
>   tools/testing/selftests/kvm/Makefile          |   2 +
>   .../selftests/kvm/include/kvm_util_base.h     |   4 +
>   tools/testing/selftests/kvm/include/pmu.h     |  97 +++
>   .../selftests/kvm/include/x86_64/processor.h  | 148 ++++-
>   tools/testing/selftests/kvm/lib/kvm_util.c    |  62 +-
>   tools/testing/selftests/kvm/lib/pmu.c         |  31 +
>   .../selftests/kvm/lib/x86_64/processor.c      |  15 +-
>   .../selftests/kvm/x86_64/pmu_counters_test.c  | 617 ++++++++++++++++++
>   .../kvm/x86_64/pmu_event_filter_test.c        | 143 ++--
>   .../smaller_maxphyaddr_emulation_test.c       |   2 +-
>   .../kvm/x86_64/userspace_msr_exit_test.c      |  29 +-
>   .../selftests/kvm/x86_64/vmx_pmu_caps_test.c  |   2 +-
>   20 files changed, 1097 insertions(+), 291 deletions(-)
>   create mode 100644 tools/testing/selftests/kvm/include/pmu.h
>   create mode 100644 tools/testing/selftests/kvm/lib/pmu.c
>   create mode 100644 tools/testing/selftests/kvm/x86_64/pmu_counters_test.c
>
>
> base-commit: 1c6d984f523f67ecfad1083bb04c55d91977bb15

pmu_counters_test passes on Intel Sapphire Rapids platform.

Tested-by:  Dapeng Mi <dapeng1.mi@linux.intel.com>
  
Sean Christopherson Jan. 31, 2024, 12:59 a.m. UTC | #2
On Tue, 09 Jan 2024 15:02:20 -0800, Sean Christopherson wrote:
> Knock wood, _this_ is the final of fixes and tests for PMU counters.  New
> in v10 is a small refactor to treat FIXED as a value, not a flag, when
> emulating RDPMC.  Everything else is the same as v9 (although rebased, but
> there were no conflicts).
> 
> v10:
>  - Collect review. [Dapeng]
>  - Treat the FIXED type in RDPMC's ECX as a value, not a flag. [Jim]
> 
> [...]

Applied to kvm-x86 pmu, with the fix for the file goof Andrew pointed out.

[01/29] KVM: x86/pmu: Always treat Fixed counters as available when supported
        https://github.com/kvm-x86/linux/commit/5eb7fcbdea63
[02/29] KVM: x86/pmu: Allow programming events that match unsupported arch events
        https://github.com/kvm-x86/linux/commit/cbbd1aa89139
[03/29] KVM: x86/pmu: Remove KVM's enumeration of Intel's architectural encodings
        https://github.com/kvm-x86/linux/commit/db9e008a0f37
[04/29] KVM: x86/pmu: Setup fixed counters' eventsel during PMU initialization
        https://github.com/kvm-x86/linux/commit/61bb2ad795a7
[05/29] KVM: x86/pmu: Get eventsel for fixed counters from perf
        https://github.com/kvm-x86/linux/commit/7a277c22412c
[06/29] KVM: x86/pmu: Don't ignore bits 31:30 for RDPMC index on AMD
        https://github.com/kvm-x86/linux/commit/ecb490770ad4
[07/29] KVM: x86/pmu: Prioritize VMX interception over #GP on RDPMC due to bad index
        https://github.com/kvm-x86/linux/commit/7bb7fce13601
[08/29] KVM: x86/pmu: Apply "fast" RDPMC only to Intel PMUs
        https://github.com/kvm-x86/linux/commit/d652981db08f
[09/29] KVM: x86/pmu: Disallow "fast" RDPMC for architectural Intel PMUs
        https://github.com/kvm-x86/linux/commit/5728a4a0ea79
[10/29] KVM: x86/pmu: Treat "fixed" PMU type in RDPMC as index as a value, not flag
        https://github.com/kvm-x86/linux/commit/7a0fc734c20d
[11/29] KVM: x86/pmu: Explicitly check for RDPMC of unsupported Intel PMC types
        https://github.com/kvm-x86/linux/commit/a634c76b2c1a
[12/29] KVM: selftests: Add vcpu_set_cpuid_property() to set properties
        https://github.com/kvm-x86/linux/commit/d7e68738e1aa
[13/29] KVM: selftests: Drop the "name" param from KVM_X86_PMU_FEATURE()
        https://github.com/kvm-x86/linux/commit/ff76d7712510
[14/29] KVM: selftests: Extend {kvm,this}_pmu_has() to support fixed counters
        https://github.com/kvm-x86/linux/commit/370d53632289
[15/29] KVM: selftests: Add pmu.h and lib/pmu.c for common PMU assets
        https://github.com/kvm-x86/linux/commit/e6faa0497057
[16/29] KVM: selftests: Test Intel PMU architectural events on gp counters
        https://github.com/kvm-x86/linux/commit/4f1bd6b16074
[17/29] KVM: selftests: Test Intel PMU architectural events on fixed counters
        https://github.com/kvm-x86/linux/commit/3e26b825f87d
[18/29] KVM: selftests: Test consistency of CPUID with num of gp counters
        https://github.com/kvm-x86/linux/commit/7137cf751b9b
[19/29] KVM: selftests: Test consistency of CPUID with num of fixed counters
        https://github.com/kvm-x86/linux/commit/c7d7c76ecf78
[20/29] KVM: selftests: Add functional test for Intel's fixed PMU counters
        https://github.com/kvm-x86/linux/commit/787071fd0262
[21/29] KVM: selftests: Expand PMU counters test to verify LLC events
        https://github.com/kvm-x86/linux/commit/b55e7adf633a
[22/29] KVM: selftests: Add a helper to query if the PMU module param is enabled
        https://github.com/kvm-x86/linux/commit/c85e986716b0
[23/29] KVM: selftests: Add helpers to read integer module params
        https://github.com/kvm-x86/linux/commit/45e4755c39fc
[24/29] KVM: selftests: Query module param to detect FEP in MSR filtering test
        https://github.com/kvm-x86/linux/commit/0326cc6b02c8
[25/29] KVM: selftests: Move KVM_FEP macro into common library header
        https://github.com/kvm-x86/linux/commit/00856e17da73
[26/29] KVM: selftests: Test PMC virtualization with forced emulation
        https://github.com/kvm-x86/linux/commit/cd34fd8c758e
[27/29] KVM: selftests: Add a forced emulation variation of KVM_ASM_SAFE()
        https://github.com/kvm-x86/linux/commit/ab3b6a7de8df
[28/29] KVM: selftests: Add helpers for safe and safe+forced RDMSR, RDPMC, and XGETBV
        https://github.com/kvm-x86/linux/commit/b5e66df34cb0
[29/29] KVM: selftests: Extend PMU counters test to validate RDPMC after WRMSR
        https://github.com/kvm-x86/linux/commit/a8a37f555684

--
https://github.com/kvm-x86/linux/tree/next