All of lore.kernel.org
 help / color / mirror / Atom feed
* [GIT PULL] KVM: Non-x86 changes for 6.4
@ 2023-04-24 17:35 Sean Christopherson
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: Misc " Sean Christopherson
                   ` (6 more replies)
  0 siblings, 7 replies; 17+ messages in thread
From: Sean Christopherson @ 2023-04-24 17:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

Non-x86, a.k.a. generic, KVM changes for 6.4.  Nothing particularly
interesting, just a random smattering of one-off patches.

The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:

  KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)

are available in the Git repository at:

  https://github.com/kvm-x86/linux.git tags/kvm-x86-generic-6.4

for you to fetch changes up to b0d237087c674c43df76c1a0bc2737592f3038f4:

  KVM: Fix comments that refer to the non-existent install_new_memslots() (2023-03-24 08:20:17 -0700)

----------------------------------------------------------------
Common KVM changes for 6.4:

 - Drop unnecessary casts from "void *" throughout kvm_main.c

 - Tweak the layout of "struct kvm_mmu_memory_cache" to shrink the struct
   size by 8 bytes on 64-bit kernels by utilizing a padding hole

 - Fix a documentation format goof that was introduced when the KVM docs
   were converted to ReST

 - Constify MIPS's internal callbacks (a leftover from the hardware enabling
   rework that landed in 6.3)

----------------------------------------------------------------
Jun Miao (1):
      KVM: Fix comments that refer to the non-existent install_new_memslots()

Li kunyu (1):
      kvm: kvm_main: Remove unnecessary (void*) conversions

Mathias Krause (1):
      KVM: Shrink struct kvm_mmu_memory_cache

Sean Christopherson (1):
      KVM: MIPS: Make kvm_mips_callbacks const

Shaoqin Huang (1):
      KVM: Add the missed title format

 Documentation/virt/kvm/api.rst     |  1 +
 Documentation/virt/kvm/locking.rst |  2 +-
 arch/mips/include/asm/kvm_host.h   |  2 +-
 arch/mips/kvm/vz.c                 |  2 +-
 include/linux/kvm_host.h           |  4 ++--
 include/linux/kvm_types.h          |  2 +-
 virt/kvm/kvm_main.c                | 26 ++++++++++++--------------
 7 files changed, 19 insertions(+), 20 deletions(-)

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [GIT PULL] KVM: x86: Misc changes for 6.4.
  2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
@ 2023-04-24 17:35 ` Sean Christopherson
  2023-04-26 19:49   ` Paolo Bonzini
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: MMU " Sean Christopherson
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Sean Christopherson @ 2023-04-24 17:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

KVM x86 "misc" changes for 6.4.  The two highlights are Mathias'
optimization for CR0.WP toggling and Binbin's addition of helpers to query
individual CR0/CR4 bits (a very nice and overdue cleanup).

The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:

  KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)

are available in the Git repository at:

  https://github.com/kvm-x86/linux.git tags/kvm-x86-misc-6.4

for you to fetch changes up to cf9f4c0eb1699d306e348b1fd0225af7b2c282d3:

  KVM: x86/mmu: Refresh CR0.WP prior to checking for emulated permission faults (2023-04-10 15:25:36 -0700)

----------------------------------------------------------------
KVM x86 changes for 6.4:

 - Optimize CR0.WP toggling by avoiding an MMU reload when TDP is enabled,
   and by giving the guest control of CR0.WP when EPT is enabled on VMX
   (VMX-only because SVM doesn't support per-bit controls)

 - Add CR0/CR4 helpers to query single bits, and clean up related code
   where KVM was interpreting kvm_read_cr4_bits()'s "unsigned long" return
   as a bool

 - Move AMD_PSFD to cpufeatures.h and purge KVM's definition

 - Misc cleanups

----------------------------------------------------------------
Binbin Wu (4):
      KVM: x86: Add helpers to query individual CR0/CR4 bits
      KVM: x86: Use boolean return value for is_{pae,pse,paging}()
      KVM: SVM: Use kvm_is_cr4_bit_set() to query SMAP/SMEP in "can emulate"
      KVM: x86: Change return type of is_long_mode() to bool

Mathias Krause (4):
      KVM: x86: Do not unload MMU roots when only toggling CR0.WP with TDP enabled
      KVM: x86: Ignore CR0.WP toggles in non-paging mode
      KVM: x86: Make use of kvm_read_cr*_bits() when testing bits
      KVM: VMX: Make CR0.WP a guest owned bit

Robert Hoo (1):
      KVM: x86: Remove a redundant guest cpuid check in kvm_set_cr4()

Sean Christopherson (4):
      KVM: SVM: Fix benign "bool vs. int" comparison in svm_set_cr0()
      x86: KVM: Add common feature flag for AMD's PSFD
      KVM: x86: Assert that the emulator doesn't load CS with garbage in !RM
      KVM: x86/mmu: Refresh CR0.WP prior to checking for emulated permission faults

Tom Rix (1):
      KVM: x86: set "mitigate_smt_rsb" storage-class-specifier to static

 arch/x86/include/asm/cpufeatures.h |  1 +
 arch/x86/kvm/cpuid.c               | 12 +++-------
 arch/x86/kvm/emulate.c             |  8 +++++++
 arch/x86/kvm/kvm_cache_regs.h      | 18 ++++++++++++++-
 arch/x86/kvm/mmu.h                 | 28 ++++++++++++++++++++++--
 arch/x86/kvm/mmu/mmu.c             | 15 +++++++++++++
 arch/x86/kvm/pmu.c                 |  4 ++--
 arch/x86/kvm/svm/svm.c             |  6 ++---
 arch/x86/kvm/vmx/nested.c          |  6 ++---
 arch/x86/kvm/vmx/vmx.c             |  8 +++----
 arch/x86/kvm/vmx/vmx.h             | 18 +++++++++++++++
 arch/x86/kvm/x86.c                 | 45 ++++++++++++++++++++++++--------------
 arch/x86/kvm/x86.h                 | 22 +++++++++----------
 13 files changed, 139 insertions(+), 52 deletions(-)

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [GIT PULL] KVM: x86: MMU changes for 6.4
  2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: Misc " Sean Christopherson
@ 2023-04-24 17:35 ` Sean Christopherson
  2023-04-26 19:52   ` Paolo Bonzini
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: PMU " Sean Christopherson
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Sean Christopherson @ 2023-04-24 17:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

KVM x86/mmu changes for 6.4.  The highlights are optimizations from Lai
(.invlpg(), .sync_page(), and rmaps) and Vipin (A/D harvesting).

I am also planning on sending the "persistent TDP MMU roots" patch[*] for
6.4-rc1, just waiting a few more days to give syzbot extra time to beat on
v2, and to settle on whether to guard VM desctruction with mmu_lock or RCU.

[*] https://lore.kernel.org/all/20230421214946.2571580-1-seanjc@google.com


The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:

  KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)

are available in the Git repository at:

  https://github.com/kvm-x86/linux.git tags/kvm-x86-mmu-6.4

for you to fetch changes up to 9ed3bf411226f446a9795f2b49a15b9df98d7cf5:

  KVM: x86/mmu: Move filling of Hyper-V's TLB range struct into Hyper-V code (2023-04-10 15:17:29 -0700)

----------------------------------------------------------------
KVM x86 MMU changes for 6.4:

 - Tweak FNAME(sync_spte) to avoid unnecessary writes+flushes when the
   guest is only adding new PTEs

 - Overhaul .sync_page() and .invlpg() to share the .sync_page()
   implementation, i.e. utilize .sync_page()'s optimizations when emulating
   invalidations

 - Clean up the range-based flushing APIs

 - Revamp the TDP MMU's reaping of Accessed/Dirty bits to clear a single
   A/D bit using a LOCK AND instead of XCHG, and skip all of the "handle
   changed SPTE" overhead associated with writing the entire entry

 - Track the number of "tail" entries in a pte_list_desc to avoid having
   to walk (potentially) all descriptors during insertion and deletion,
   which gets quite expensive if the guest is spamming fork()

 - Misc cleanups

----------------------------------------------------------------
David Matlack (3):
      KVM: x86/mmu: Collapse kvm_flush_remote_tlbs_with_{range,address}() together
      KVM: x86/mmu: Rename kvm_flush_remote_tlbs_with_address()
      KVM: x86/mmu: Use gfn_t in kvm_flush_remote_tlbs_range()

Lai Jiangshan (14):
      KVM: x86/mmu: Use 64-bit address to invalidate to fix a subtle bug
      KVM: x86/mmu: Move the check in FNAME(sync_page) as kvm_sync_page_check()
      KVM: x86/mmu: Check mmu->sync_page pointer in kvm_sync_page_check()
      KVM: x86/mmu: Set mmu->sync_page as NULL for direct paging
      KVM: x86/mmu: Move the code out of FNAME(sync_page)'s loop body into mmu.c
      KVM: x86/mmu: Reduce the update to the spte in FNAME(sync_spte)
      kvm: x86/mmu: Use KVM_MMU_ROOT_XXX for kvm_mmu_invalidate_addr()
      KVM: x86/mmu: Use kvm_mmu_invalidate_addr() in kvm_mmu_invpcid_gva()
      KVM: x86/mmu: Use kvm_mmu_invalidate_addr() in nested_ept_invalidate_addr()
      KVM: x86/mmu: Allow the roots to be invalid in FNAME(invlpg)
      KVM: x86/mmu: Remove FNAME(invlpg) and use FNAME(sync_spte) to update vTLB instead.
      kvm: x86/mmu: Remove @no_dirty_log from FNAME(prefetch_gpte)
      KVM: x86/mmu: Skip calling mmu->sync_spte() when the spte is 0
      KVM: x86/mmu: Track tail count in pte_list_desc to optimize guest fork()

Mathias Krause (1):
      KVM: x86/mmu: Fix comment typo

Paolo Bonzini (1):
      KVM: x86/mmu: Avoid indirect call for get_cr3

Sean Christopherson (6):
      KVM: x86/mmu: Sanity check input to kvm_mmu_free_roots()
      KVM: x86/mmu: Rename slot rmap walkers to add clarity and clean up code
      KVM: x86/mmu: Replace comment with an actual lockdep assertion on mmu_lock
      KVM: x86/mmu: Clean up mmu.c functions that put return type on separate line
      KVM: x86: Rename Hyper-V remote TLB hooks to match established scheme
      KVM: x86/mmu: Move filling of Hyper-V's TLB range struct into Hyper-V code

Vipin Sharma (13):
      KVM: x86/mmu: Add a helper function to check if an SPTE needs atomic write
      KVM: x86/mmu: Use kvm_ad_enabled() to determine if TDP MMU SPTEs need wrprot
      KVM: x86/mmu: Consolidate Dirty vs. Writable clearing logic in TDP MMU
      KVM: x86/mmu: Atomically clear SPTE dirty state in the clear-dirty-log flow
      KVM: x86/mmu: Drop access tracking checks when clearing TDP MMU dirty bits
      KVM: x86/mmu: Bypass __handle_changed_spte() when clearing TDP MMU dirty bits
      KVM: x86/mmu: Remove "record_dirty_log" in __tdp_mmu_set_spte()
      KVM: x86/mmu: Clear only A-bit (if enabled) when aging TDP MMU SPTEs
      KVM: x86/mmu: Drop unnecessary dirty log checks when aging TDP MMU SPTEs
      KVM: x86/mmu: Bypass __handle_changed_spte() when aging TDP MMU SPTEs
      KVM: x86/mmu: Remove "record_acc_track" in __tdp_mmu_set_spte()
      KVM: x86/mmu: Remove handle_changed_spte_dirty_log()
      KVM: x86/mmu: Merge all handle_changed_pte*() functions

 arch/x86/include/asm/kvm-x86-ops.h |   4 +-
 arch/x86/include/asm/kvm_host.h    |  32 +--
 arch/x86/kvm/kvm_onhyperv.c        |  33 ++-
 arch/x86/kvm/kvm_onhyperv.h        |   5 +-
 arch/x86/kvm/mmu/mmu.c             | 506 ++++++++++++++++++++++---------------
 arch/x86/kvm/mmu/mmu_internal.h    |   8 +-
 arch/x86/kvm/mmu/paging_tmpl.h     | 224 +++++-----------
 arch/x86/kvm/mmu/spte.c            |   2 +-
 arch/x86/kvm/mmu/tdp_iter.h        |  48 +++-
 arch/x86/kvm/mmu/tdp_mmu.c         | 215 ++++++----------
 arch/x86/kvm/svm/svm_onhyperv.h    |   5 +-
 arch/x86/kvm/vmx/nested.c          |   5 +-
 arch/x86/kvm/vmx/vmx.c             |   5 +-
 arch/x86/kvm/x86.c                 |   4 +-
 14 files changed, 522 insertions(+), 574 deletions(-)

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [GIT PULL] KVM: x86: PMU changes for 6.4
  2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: Misc " Sean Christopherson
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: MMU " Sean Christopherson
@ 2023-04-24 17:35 ` Sean Christopherson
  2023-04-26 19:55   ` Paolo Bonzini
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: Selftests " Sean Christopherson
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Sean Christopherson @ 2023-04-24 17:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

KVM x86/pmu changes for 6.4.  Hiding in the pile of selftests changes are a
a handful of small-but-important fixes.

Note, this superficially conflicts with the PRED_CMD/FLUSH_CMD changes
sitting in kvm/next due to "KVM: VMX: Refactor intel_pmu_{g,}set_msr() to
align with other helpers".  The resolution I have been using when preparing
kvm-x86/next for linux-next is to replace a "return 0" with a "break".

The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:

  KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)

are available in the Git repository at:

  https://github.com/kvm-x86/linux.git tags/kvm-x86-pmu-6.4

for you to fetch changes up to 457bd7af1a17182e7f1f97eeb5d9107f8699e99d:

  KVM: selftests: Test the PMU event "Instructions retired" (2023-04-14 13:21:38 -0700)

----------------------------------------------------------------
KVM x86 PMU changes for 6.4:

 - Disallow virtualizing legacy LBRs if architectural LBRs are available,
   the two are mutually exclusive in hardware

 - Disallow writes to immutable feature MSRs (notably PERF_CAPABILITIES)
   after KVM_RUN, and overhaul the vmx_pmu_caps selftest to better
   validate PERF_CAPABILITIES

 - Apply PMU filters to emulated events and add test coverage to the
   pmu_event_filter selftest

 - Misc cleanups and fixes

----------------------------------------------------------------
Aaron Lewis (5):
      KVM: x86/pmu: Prevent the PMU from counting disallowed events
      KVM: selftests: Add a common helper for the PMU event filter guest code
      KVM: selftests: Add helpers for PMC asserts in PMU event filter test
      KVM: selftests: Print detailed info in PMU event filter asserts
      KVM: selftests: Test the PMU event "Instructions retired"

Like Xu (4):
      KVM: x86/pmu: Zero out pmu->all_valid_pmc_idx each time it's refreshed
      KVM: x86/pmu: Rename pmc_is_enabled() to pmc_is_globally_enabled()
      KVM: x86/pmu: Rewrite reprogram_counters() to improve performance
      KVM: x86/pmu: Fix a typo in kvm_pmu_request_counter_reprogam()

Mathias Krause (1):
      KVM: x86: Shrink struct kvm_pmu

Sean Christopherson (25):
      KVM: x86/pmu: Disallow legacy LBRs if architectural LBRs are available
      KVM: x86: Rename kvm_init_msr_list() to clarify it inits multiple lists
      KVM: x86: Add a helper to query whether or not a vCPU has ever run
      KVM: x86: Add macros to track first...last VMX feature MSRs
      KVM: x86: Generate set of VMX feature MSRs using first/last definitions
      KVM: selftests: Split PMU caps sub-tests to avoid writing MSR after KVM_RUN
      KVM: x86: Disallow writes to immutable feature MSRs after KVM_RUN
      KVM: x86/pmu: WARN and bug the VM if PMU is refreshed after vCPU has run
      KVM: x86/pmu: Zero out LBR capabilities during PMU refresh
      KVM: selftests: Move 0/initial value PERF_CAPS checks to dedicated sub-test
      KVM: selftests: Assert that full-width PMC writes are supported if PDCM=1
      KVM: selftests: Print out failing MSR and value in vcpu_set_msr()
      KVM: selftests: Verify KVM preserves userspace writes to "durable" MSRs
      KVM: selftests: Drop now-redundant checks on PERF_CAPABILITIES writes
      KVM: selftests: Test all fungible features in PERF_CAPABILITIES
      KVM: selftests: Test all immutable non-format bits in PERF_CAPABILITIES
      KVM: selftests: Expand negative testing of guest writes to PERF_CAPABILITIES
      KVM: selftests: Test post-KVM_RUN writes to PERF_CAPABILITIES
      KVM: selftests: Drop "all done!" printf() from PERF_CAPABILITIES test
      KVM: selftests: Refactor LBR_FMT test to avoid use of separate macro
      KVM: selftests: Add negative testcase for PEBS format in PERF_CAPABILITIES
      KVM: selftests: Verify LBRs are disabled if vPMU is disabled
      KVM: VMX: Refactor intel_pmu_{g,}set_msr() to align with other helpers
      KVM: selftests: Use error codes to signal errors in PMU event filter test
      KVM: selftests: Copy full counter values from guest in PMU event filter test

 arch/x86/include/asm/kvm_host.h                    |   2 +-
 arch/x86/kvm/cpuid.c                               |   2 +-
 arch/x86/kvm/mmu/mmu.c                             |   2 +-
 arch/x86/kvm/pmu.c                                 |  21 +-
 arch/x86/kvm/pmu.h                                 |   2 +-
 arch/x86/kvm/svm/pmu.c                             |   2 +-
 arch/x86/kvm/svm/svm.c                             |   2 +-
 arch/x86/kvm/vmx/pmu_intel.c                       | 135 ++++++-----
 arch/x86/kvm/vmx/vmx.c                             |  16 +-
 arch/x86/kvm/x86.c                                 | 102 ++++++---
 arch/x86/kvm/x86.h                                 |  13 ++
 .../selftests/kvm/include/x86_64/processor.h       |  41 +++-
 .../selftests/kvm/x86_64/pmu_event_filter_test.c   | 252 ++++++++++++---------
 .../selftests/kvm/x86_64/vmx_pmu_caps_test.c       | 248 ++++++++++++++++----
 14 files changed, 565 insertions(+), 275 deletions(-)

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [GIT PULL] KVM: x86: Selftests changes for 6.4
  2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
                   ` (2 preceding siblings ...)
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: PMU " Sean Christopherson
@ 2023-04-24 17:35 ` Sean Christopherson
  2023-04-26 19:56   ` Paolo Bonzini
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: SVM " Sean Christopherson
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Sean Christopherson @ 2023-04-24 17:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

KVM x86 selftests change for 6.4.  And an AMX+XCR0 bugfix that I landed here
to avoid creating a mess of unnecessary conflicts between the series to
overhaul the AMX test and the related selftests changes to verify the fix.

The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:

  KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)

are available in the Git repository at:

  https://github.com/kvm-x86/linux.git tags/kvm-x86-selftests-6.4

for you to fetch changes up to 20aef201dafba6a1ffe9daa145c7f2c525b74aae:

  KVM: selftests: Fix spelling mistake "perrmited" -> "permitted" (2023-04-14 10:04:51 -0700)

----------------------------------------------------------------
KVM selftests, and an AMX/XCR0 bugfix, for 6.4:

 - Don't advertisze XTILE_CFG in KVM_GET_SUPPORTED_CPUID if XTILE_DATA is
   not being reported due to userspace not opting in via prctl()

 - Overhaul the AMX selftests to improve coverage and cleanup the test

 - Misc cleanups

----------------------------------------------------------------
Aaron Lewis (9):
      KVM: selftests: Assert that XTILE is XSAVE-enabled
      KVM: selftests: Assert that both XTILE{CFG,DATA} are XSAVE-enabled
      KVM: selftests: Move XSAVE and OSXSAVE CPUID checks into AMX's init_regs()
      KVM: selftests: Check that the palette table exists before using it
      KVM: selftests: Check that XTILEDATA supports XFD
      KVM: x86: Add a helper to handle filtering of unpermitted XCR0 features
      KVM: selftests: Move XGETBV and XSETBV helpers to common code
      KVM: selftests: Add all known XFEATURE masks to common code
      KVM: selftests: Add test to verify KVM's supported XCR0

Ackerley Tng (1):
      KVM: selftests: Adjust VM's initial stack address to align with SysV ABI spec

Anish Moorthy (1):
      KVM: selftests: Fix nsec to sec conversion in demand_paging_test

Colin Ian King (1):
      KVM: selftests: Fix spelling mistake "perrmited" -> "permitted"

Hao Ge (1):
      KVM: selftests: Close opened file descriptor in stable_tsc_check_supported()

Ivan Orlov (1):
      KVM: selftests: Add 'malloc' failure check in vcpu_save_state

Like Xu (2):
      KVM: selftests: Add a helper to read kvm boolean module parameters
      KVM: selftests: Report enable_pmu module value when test is skipped

Mingwei Zhang (6):
      KVM: selftests: Add a fully functional "struct xstate" for x86
      KVM: selftests: Fix an error in comment of amx_test
      KVM: selftests: Enable checking on xcomp_bv in amx_test
      KVM: selftests: Add check of CR0.TS in the #NM handler in amx_test
      KVM: selftests: Assert that XTILE_DATA is set in IA32_XFD on #NM
      KVM: selftests: Verify XTILE_DATA in XSTATE isn't affected by IA32_XFD

Sean Christopherson (2):
      KVM: x86: Filter out XTILE_CFG if XTILE_DATA isn't permitted
      KVM: selftests: Rework dynamic XFeature helper to take mask, not bit

 arch/x86/kvm/cpuid.c                               |   2 +-
 arch/x86/kvm/x86.c                                 |   4 +-
 arch/x86/kvm/x86.h                                 |  29 +++++
 tools/testing/selftests/kvm/Makefile               |   1 +
 tools/testing/selftests/kvm/demand_paging_test.c   |   2 +-
 .../testing/selftests/kvm/include/kvm_util_base.h  |   1 +
 .../selftests/kvm/include/x86_64/processor.h       |  83 +++++++++++--
 tools/testing/selftests/kvm/lib/kvm_util.c         |   5 +
 tools/testing/selftests/kvm/lib/x86_64/processor.c |  36 ++++--
 tools/testing/selftests/kvm/x86_64/amx_test.c      | 118 ++++++++----------
 .../selftests/kvm/x86_64/pmu_event_filter_test.c   |   1 +
 .../kvm/x86_64/vmx_nested_tsc_scaling_test.c       |   8 +-
 .../selftests/kvm/x86_64/vmx_pmu_caps_test.c       |   1 +
 .../testing/selftests/kvm/x86_64/xcr0_cpuid_test.c | 132 +++++++++++++++++++++
 14 files changed, 326 insertions(+), 97 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [GIT PULL] KVM: x86: SVM changes for 6.4
  2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
                   ` (3 preceding siblings ...)
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: Selftests " Sean Christopherson
@ 2023-04-24 17:35 ` Sean Christopherson
  2023-04-26 19:58   ` Paolo Bonzini
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: VMX " Sean Christopherson
  2023-04-26 19:49 ` [GIT PULL] KVM: Non-x86 " Paolo Bonzini
  6 siblings, 1 reply; 17+ messages in thread
From: Sean Christopherson @ 2023-04-24 17:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

KVM SVM changes for 6.4.  The highlight, by a country mile, is support for
virtual NMIs.

The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:

  KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)

are available in the Git repository at:

  https://github.com/kvm-x86/linux.git tags/kvm-x86-svm-6.4

for you to fetch changes up to c0d0ce9b5a851895f34fd401c9dddc70616711a4:

  KVM: SVM: Remove a duplicate definition of VMCB_AVIC_APIC_BAR_MASK (2023-04-04 11:08:12 -0700)

----------------------------------------------------------------
KVM SVM changes for 6.4:

 - Add support for virtual NMIs

 - Fixes for edge cases related to virtual interrupts

----------------------------------------------------------------
Maxim Levitsky (2):
      KVM: nSVM: Raise event on nested VM exit if L1 doesn't intercept IRQs
      KVM: SVM: add wrappers to enable/disable IRET interception

Santosh Shukla (5):
      KVM: nSVM: Don't sync vmcb02 V_IRQ back to vmcb12 if KVM (L0) is intercepting VINTR
      KVM: nSVM: Disable intercept of VINTR if saved L1 host RFLAGS.IF is 0
      KVM: SVM: Add definitions for new bits in VMCB::int_ctrl related to vNMI
      KVM: x86: Add support for SVM's Virtual NMI
      KVM: nSVM: Implement support for nested VNMI

Sean Christopherson (5):
      KVM: x86: Raise an event request when processing NMIs if an NMI is pending
      KVM: x86: Tweak the code and comment related to handling concurrent NMIs
      KVM: x86: Save/restore all NMIs when multiple NMIs are pending
      x86/cpufeatures: Redefine synthetic virtual NMI bit as AMD's "real" vNMI
      KVM: x86: Route pending NMIs from userspace through process_nmi()

Xinghui Li (1):
      KVM: SVM: Remove a duplicate definition of VMCB_AVIC_APIC_BAR_MASK

 arch/x86/include/asm/cpufeatures.h |   8 +-
 arch/x86/include/asm/kvm-x86-ops.h |   2 +
 arch/x86/include/asm/kvm_host.h    |  11 ++-
 arch/x86/include/asm/svm.h         |  10 ++-
 arch/x86/kvm/svm/nested.c          |  91 ++++++++++++++++++----
 arch/x86/kvm/svm/svm.c             | 153 ++++++++++++++++++++++++++++++-------
 arch/x86/kvm/svm/svm.h             |  29 +++++++
 arch/x86/kvm/x86.c                 |  46 +++++++++--
 8 files changed, 292 insertions(+), 58 deletions(-)

^ permalink raw reply	[flat|nested] 17+ messages in thread

* [GIT PULL] KVM: x86: VMX changes for 6.4
  2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
                   ` (4 preceding siblings ...)
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: SVM " Sean Christopherson
@ 2023-04-24 17:35 ` Sean Christopherson
  2023-04-26 19:57   ` Paolo Bonzini
  2023-04-26 19:49 ` [GIT PULL] KVM: Non-x86 " Paolo Bonzini
  6 siblings, 1 reply; 17+ messages in thread
From: Sean Christopherson @ 2023-04-24 17:35 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

KVM VMX changes for 6.4.  A few cleanups and a few fixes, nothing super
interesting or urgent.  IMO, the most notable part of this pull request is
that ENCLS is actually allowed in compatibility mode. :-)

The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:

  KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)

are available in the Git repository at:

  https://github.com/kvm-x86/linux.git tags/kvm-x86-vmx-6.4

for you to fetch changes up to 4984563823f0034d3533854c1b50e729f5191089:

  KVM: nVMX: Emulate NOPs in L2, and PAUSE if it's not intercepted (2023-04-11 09:35:49 -0700)

----------------------------------------------------------------
KVM VMX changes for 6.4:

 - Fix a bug in emulation of ENCLS in compatibility mode

 - Allow emulation of NOP and PAUSE for L2

 - Misc cleanups

----------------------------------------------------------------
Binbin Wu (1):
      KVM: VMX: Use is_64_bit_mode() to check 64-bit mode in SGX handler

Sean Christopherson (1):
      KVM: nVMX: Emulate NOPs in L2, and PAUSE if it's not intercepted

Yu Zhang (2):
      KVM: nVMX: Remove outdated comments in nested_vmx_setup_ctls_msrs()
      KVM: nVMX: Add helpers to setup VMX control msr configs

 arch/x86/kvm/vmx/nested.c | 112 ++++++++++++++++++++++++++++++----------------
 arch/x86/kvm/vmx/sgx.c    |   4 +-
 arch/x86/kvm/vmx/vmx.c    |  15 +++++++
 3 files changed, 91 insertions(+), 40 deletions(-)

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: Non-x86 changes for 6.4
  2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
                   ` (5 preceding siblings ...)
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: VMX " Sean Christopherson
@ 2023-04-26 19:49 ` Paolo Bonzini
  6 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 19:49 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
>
> Non-x86, a.k.a. generic, KVM changes for 6.4.  Nothing particularly
> interesting, just a random smattering of one-off patches.
>
> The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
>
>   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
>
> are available in the Git repository at:
>
>   https://github.com/kvm-x86/linux.git tags/kvm-x86-generic-6.4
>
> for you to fetch changes up to b0d237087c674c43df76c1a0bc2737592f3038f4:
>
>   KVM: Fix comments that refer to the non-existent install_new_memslots() (2023-03-24 08:20:17 -0700)

Pulled (but didn't push yet), thanks.

Paolo

> ----------------------------------------------------------------
> Common KVM changes for 6.4:
>
>  - Drop unnecessary casts from "void *" throughout kvm_main.c
>
>  - Tweak the layout of "struct kvm_mmu_memory_cache" to shrink the struct
>    size by 8 bytes on 64-bit kernels by utilizing a padding hole
>
>  - Fix a documentation format goof that was introduced when the KVM docs
>    were converted to ReST
>
>  - Constify MIPS's internal callbacks (a leftover from the hardware enabling
>    rework that landed in 6.3)
>
> ----------------------------------------------------------------
> Jun Miao (1):
>       KVM: Fix comments that refer to the non-existent install_new_memslots()
>
> Li kunyu (1):
>       kvm: kvm_main: Remove unnecessary (void*) conversions
>
> Mathias Krause (1):
>       KVM: Shrink struct kvm_mmu_memory_cache
>
> Sean Christopherson (1):
>       KVM: MIPS: Make kvm_mips_callbacks const
>
> Shaoqin Huang (1):
>       KVM: Add the missed title format
>
>  Documentation/virt/kvm/api.rst     |  1 +
>  Documentation/virt/kvm/locking.rst |  2 +-
>  arch/mips/include/asm/kvm_host.h   |  2 +-
>  arch/mips/kvm/vz.c                 |  2 +-
>  include/linux/kvm_host.h           |  4 ++--
>  include/linux/kvm_types.h          |  2 +-
>  virt/kvm/kvm_main.c                | 26 ++++++++++++--------------
>  7 files changed, 19 insertions(+), 20 deletions(-)
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: Misc changes for 6.4.
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: Misc " Sean Christopherson
@ 2023-04-26 19:49   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 19:49 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
>
> KVM x86 "misc" changes for 6.4.  The two highlights are Mathias'
> optimization for CR0.WP toggling and Binbin's addition of helpers to query
> individual CR0/CR4 bits (a very nice and overdue cleanup).
>
> The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
>
>   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
>
> are available in the Git repository at:
>
>   https://github.com/kvm-x86/linux.git tags/kvm-x86-misc-6.4
>
> for you to fetch changes up to cf9f4c0eb1699d306e348b1fd0225af7b2c282d3:
>
>   KVM: x86/mmu: Refresh CR0.WP prior to checking for emulated permission faults (2023-04-10 15:25:36 -0700)

Pulled (but didn't push yet), thanks.

Paolo


> ----------------------------------------------------------------
> KVM x86 changes for 6.4:
>
>  - Optimize CR0.WP toggling by avoiding an MMU reload when TDP is enabled,
>    and by giving the guest control of CR0.WP when EPT is enabled on VMX
>    (VMX-only because SVM doesn't support per-bit controls)
>
>  - Add CR0/CR4 helpers to query single bits, and clean up related code
>    where KVM was interpreting kvm_read_cr4_bits()'s "unsigned long" return
>    as a bool
>
>  - Move AMD_PSFD to cpufeatures.h and purge KVM's definition
>
>  - Misc cleanups
>
> ----------------------------------------------------------------
> Binbin Wu (4):
>       KVM: x86: Add helpers to query individual CR0/CR4 bits
>       KVM: x86: Use boolean return value for is_{pae,pse,paging}()
>       KVM: SVM: Use kvm_is_cr4_bit_set() to query SMAP/SMEP in "can emulate"
>       KVM: x86: Change return type of is_long_mode() to bool
>
> Mathias Krause (4):
>       KVM: x86: Do not unload MMU roots when only toggling CR0.WP with TDP enabled
>       KVM: x86: Ignore CR0.WP toggles in non-paging mode
>       KVM: x86: Make use of kvm_read_cr*_bits() when testing bits
>       KVM: VMX: Make CR0.WP a guest owned bit
>
> Robert Hoo (1):
>       KVM: x86: Remove a redundant guest cpuid check in kvm_set_cr4()
>
> Sean Christopherson (4):
>       KVM: SVM: Fix benign "bool vs. int" comparison in svm_set_cr0()
>       x86: KVM: Add common feature flag for AMD's PSFD
>       KVM: x86: Assert that the emulator doesn't load CS with garbage in !RM
>       KVM: x86/mmu: Refresh CR0.WP prior to checking for emulated permission faults
>
> Tom Rix (1):
>       KVM: x86: set "mitigate_smt_rsb" storage-class-specifier to static
>
>  arch/x86/include/asm/cpufeatures.h |  1 +
>  arch/x86/kvm/cpuid.c               | 12 +++-------
>  arch/x86/kvm/emulate.c             |  8 +++++++
>  arch/x86/kvm/kvm_cache_regs.h      | 18 ++++++++++++++-
>  arch/x86/kvm/mmu.h                 | 28 ++++++++++++++++++++++--
>  arch/x86/kvm/mmu/mmu.c             | 15 +++++++++++++
>  arch/x86/kvm/pmu.c                 |  4 ++--
>  arch/x86/kvm/svm/svm.c             |  6 ++---
>  arch/x86/kvm/vmx/nested.c          |  6 ++---
>  arch/x86/kvm/vmx/vmx.c             |  8 +++----
>  arch/x86/kvm/vmx/vmx.h             | 18 +++++++++++++++
>  arch/x86/kvm/x86.c                 | 45 ++++++++++++++++++++++++--------------
>  arch/x86/kvm/x86.h                 | 22 +++++++++----------
>  13 files changed, 139 insertions(+), 52 deletions(-)
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: MMU changes for 6.4
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: MMU " Sean Christopherson
@ 2023-04-26 19:52   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 19:52 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
>
> KVM x86/mmu changes for 6.4.  The highlights are optimizations from Lai
> (.invlpg(), .sync_page(), and rmaps) and Vipin (A/D harvesting).
>
> I am also planning on sending the "persistent TDP MMU roots" patch[*] for
> 6.4-rc1, just waiting a few more days to give syzbot extra time to beat on
> v2, and to settle on whether to guard VM desctruction with mmu_lock or RCU.

No problem; due to a slightly ugly coincidence of these PRs with
Italian public holiday on April 25th, and the need to handle RISC-V
separately on the second week anyway, I'll probably send ARM+s390
tomorrow and wait a little more for x86, so we'll get the persistent
TDP MMU roots patch in time.

I'll push all these to kvm/queue anyway in the meanwhile.

Paolo

> [*] https://lore.kernel.org/all/20230421214946.2571580-1-seanjc@google.com
>
>
> The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
>
>   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
>
> are available in the Git repository at:
>
>   https://github.com/kvm-x86/linux.git tags/kvm-x86-mmu-6.4
>
> for you to fetch changes up to 9ed3bf411226f446a9795f2b49a15b9df98d7cf5:
>
>   KVM: x86/mmu: Move filling of Hyper-V's TLB range struct into Hyper-V code (2023-04-10 15:17:29 -0700)
>
> ----------------------------------------------------------------
> KVM x86 MMU changes for 6.4:
>
>  - Tweak FNAME(sync_spte) to avoid unnecessary writes+flushes when the
>    guest is only adding new PTEs
>
>  - Overhaul .sync_page() and .invlpg() to share the .sync_page()
>    implementation, i.e. utilize .sync_page()'s optimizations when emulating
>    invalidations
>
>  - Clean up the range-based flushing APIs
>
>  - Revamp the TDP MMU's reaping of Accessed/Dirty bits to clear a single
>    A/D bit using a LOCK AND instead of XCHG, and skip all of the "handle
>    changed SPTE" overhead associated with writing the entire entry
>
>  - Track the number of "tail" entries in a pte_list_desc to avoid having
>    to walk (potentially) all descriptors during insertion and deletion,
>    which gets quite expensive if the guest is spamming fork()
>
>  - Misc cleanups
>
> ----------------------------------------------------------------
> David Matlack (3):
>       KVM: x86/mmu: Collapse kvm_flush_remote_tlbs_with_{range,address}() together
>       KVM: x86/mmu: Rename kvm_flush_remote_tlbs_with_address()
>       KVM: x86/mmu: Use gfn_t in kvm_flush_remote_tlbs_range()
>
> Lai Jiangshan (14):
>       KVM: x86/mmu: Use 64-bit address to invalidate to fix a subtle bug
>       KVM: x86/mmu: Move the check in FNAME(sync_page) as kvm_sync_page_check()
>       KVM: x86/mmu: Check mmu->sync_page pointer in kvm_sync_page_check()
>       KVM: x86/mmu: Set mmu->sync_page as NULL for direct paging
>       KVM: x86/mmu: Move the code out of FNAME(sync_page)'s loop body into mmu.c
>       KVM: x86/mmu: Reduce the update to the spte in FNAME(sync_spte)
>       kvm: x86/mmu: Use KVM_MMU_ROOT_XXX for kvm_mmu_invalidate_addr()
>       KVM: x86/mmu: Use kvm_mmu_invalidate_addr() in kvm_mmu_invpcid_gva()
>       KVM: x86/mmu: Use kvm_mmu_invalidate_addr() in nested_ept_invalidate_addr()
>       KVM: x86/mmu: Allow the roots to be invalid in FNAME(invlpg)
>       KVM: x86/mmu: Remove FNAME(invlpg) and use FNAME(sync_spte) to update vTLB instead.
>       kvm: x86/mmu: Remove @no_dirty_log from FNAME(prefetch_gpte)
>       KVM: x86/mmu: Skip calling mmu->sync_spte() when the spte is 0
>       KVM: x86/mmu: Track tail count in pte_list_desc to optimize guest fork()
>
> Mathias Krause (1):
>       KVM: x86/mmu: Fix comment typo
>
> Paolo Bonzini (1):
>       KVM: x86/mmu: Avoid indirect call for get_cr3
>
> Sean Christopherson (6):
>       KVM: x86/mmu: Sanity check input to kvm_mmu_free_roots()
>       KVM: x86/mmu: Rename slot rmap walkers to add clarity and clean up code
>       KVM: x86/mmu: Replace comment with an actual lockdep assertion on mmu_lock
>       KVM: x86/mmu: Clean up mmu.c functions that put return type on separate line
>       KVM: x86: Rename Hyper-V remote TLB hooks to match established scheme
>       KVM: x86/mmu: Move filling of Hyper-V's TLB range struct into Hyper-V code
>
> Vipin Sharma (13):
>       KVM: x86/mmu: Add a helper function to check if an SPTE needs atomic write
>       KVM: x86/mmu: Use kvm_ad_enabled() to determine if TDP MMU SPTEs need wrprot
>       KVM: x86/mmu: Consolidate Dirty vs. Writable clearing logic in TDP MMU
>       KVM: x86/mmu: Atomically clear SPTE dirty state in the clear-dirty-log flow
>       KVM: x86/mmu: Drop access tracking checks when clearing TDP MMU dirty bits
>       KVM: x86/mmu: Bypass __handle_changed_spte() when clearing TDP MMU dirty bits
>       KVM: x86/mmu: Remove "record_dirty_log" in __tdp_mmu_set_spte()
>       KVM: x86/mmu: Clear only A-bit (if enabled) when aging TDP MMU SPTEs
>       KVM: x86/mmu: Drop unnecessary dirty log checks when aging TDP MMU SPTEs
>       KVM: x86/mmu: Bypass __handle_changed_spte() when aging TDP MMU SPTEs
>       KVM: x86/mmu: Remove "record_acc_track" in __tdp_mmu_set_spte()
>       KVM: x86/mmu: Remove handle_changed_spte_dirty_log()
>       KVM: x86/mmu: Merge all handle_changed_pte*() functions
>
>  arch/x86/include/asm/kvm-x86-ops.h |   4 +-
>  arch/x86/include/asm/kvm_host.h    |  32 +--
>  arch/x86/kvm/kvm_onhyperv.c        |  33 ++-
>  arch/x86/kvm/kvm_onhyperv.h        |   5 +-
>  arch/x86/kvm/mmu/mmu.c             | 506 ++++++++++++++++++++++---------------
>  arch/x86/kvm/mmu/mmu_internal.h    |   8 +-
>  arch/x86/kvm/mmu/paging_tmpl.h     | 224 +++++-----------
>  arch/x86/kvm/mmu/spte.c            |   2 +-
>  arch/x86/kvm/mmu/tdp_iter.h        |  48 +++-
>  arch/x86/kvm/mmu/tdp_mmu.c         | 215 ++++++----------
>  arch/x86/kvm/svm/svm_onhyperv.h    |   5 +-
>  arch/x86/kvm/vmx/nested.c          |   5 +-
>  arch/x86/kvm/vmx/vmx.c             |   5 +-
>  arch/x86/kvm/x86.c                 |   4 +-
>  14 files changed, 522 insertions(+), 574 deletions(-)
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: PMU changes for 6.4
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: PMU " Sean Christopherson
@ 2023-04-26 19:55   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 19:55 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
>
> KVM x86/pmu changes for 6.4.  Hiding in the pile of selftests changes are a
> a handful of small-but-important fixes.
>
> Note, this superficially conflicts with the PRED_CMD/FLUSH_CMD changes
> sitting in kvm/next due to "KVM: VMX: Refactor intel_pmu_{g,}set_msr() to
> align with other helpers".  The resolution I have been using when preparing
> kvm-x86/next for linux-next is to replace a "return 0" with a "break".

Yup, figured out the same. Pulled (put not pushed yet), thanks.

Paolo

> The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
>
>   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
>
> are available in the Git repository at:
>
>   https://github.com/kvm-x86/linux.git tags/kvm-x86-pmu-6.4
>
> for you to fetch changes up to 457bd7af1a17182e7f1f97eeb5d9107f8699e99d:
>
>   KVM: selftests: Test the PMU event "Instructions retired" (2023-04-14 13:21:38 -0700)
>
> ----------------------------------------------------------------
> KVM x86 PMU changes for 6.4:
>
>  - Disallow virtualizing legacy LBRs if architectural LBRs are available,
>    the two are mutually exclusive in hardware
>
>  - Disallow writes to immutable feature MSRs (notably PERF_CAPABILITIES)
>    after KVM_RUN, and overhaul the vmx_pmu_caps selftest to better
>    validate PERF_CAPABILITIES
>
>  - Apply PMU filters to emulated events and add test coverage to the
>    pmu_event_filter selftest
>
>  - Misc cleanups and fixes
>
> ----------------------------------------------------------------
> Aaron Lewis (5):
>       KVM: x86/pmu: Prevent the PMU from counting disallowed events
>       KVM: selftests: Add a common helper for the PMU event filter guest code
>       KVM: selftests: Add helpers for PMC asserts in PMU event filter test
>       KVM: selftests: Print detailed info in PMU event filter asserts
>       KVM: selftests: Test the PMU event "Instructions retired"
>
> Like Xu (4):
>       KVM: x86/pmu: Zero out pmu->all_valid_pmc_idx each time it's refreshed
>       KVM: x86/pmu: Rename pmc_is_enabled() to pmc_is_globally_enabled()
>       KVM: x86/pmu: Rewrite reprogram_counters() to improve performance
>       KVM: x86/pmu: Fix a typo in kvm_pmu_request_counter_reprogam()
>
> Mathias Krause (1):
>       KVM: x86: Shrink struct kvm_pmu
>
> Sean Christopherson (25):
>       KVM: x86/pmu: Disallow legacy LBRs if architectural LBRs are available
>       KVM: x86: Rename kvm_init_msr_list() to clarify it inits multiple lists
>       KVM: x86: Add a helper to query whether or not a vCPU has ever run
>       KVM: x86: Add macros to track first...last VMX feature MSRs
>       KVM: x86: Generate set of VMX feature MSRs using first/last definitions
>       KVM: selftests: Split PMU caps sub-tests to avoid writing MSR after KVM_RUN
>       KVM: x86: Disallow writes to immutable feature MSRs after KVM_RUN
>       KVM: x86/pmu: WARN and bug the VM if PMU is refreshed after vCPU has run
>       KVM: x86/pmu: Zero out LBR capabilities during PMU refresh
>       KVM: selftests: Move 0/initial value PERF_CAPS checks to dedicated sub-test
>       KVM: selftests: Assert that full-width PMC writes are supported if PDCM=1
>       KVM: selftests: Print out failing MSR and value in vcpu_set_msr()
>       KVM: selftests: Verify KVM preserves userspace writes to "durable" MSRs
>       KVM: selftests: Drop now-redundant checks on PERF_CAPABILITIES writes
>       KVM: selftests: Test all fungible features in PERF_CAPABILITIES
>       KVM: selftests: Test all immutable non-format bits in PERF_CAPABILITIES
>       KVM: selftests: Expand negative testing of guest writes to PERF_CAPABILITIES
>       KVM: selftests: Test post-KVM_RUN writes to PERF_CAPABILITIES
>       KVM: selftests: Drop "all done!" printf() from PERF_CAPABILITIES test
>       KVM: selftests: Refactor LBR_FMT test to avoid use of separate macro
>       KVM: selftests: Add negative testcase for PEBS format in PERF_CAPABILITIES
>       KVM: selftests: Verify LBRs are disabled if vPMU is disabled
>       KVM: VMX: Refactor intel_pmu_{g,}set_msr() to align with other helpers
>       KVM: selftests: Use error codes to signal errors in PMU event filter test
>       KVM: selftests: Copy full counter values from guest in PMU event filter test
>
>  arch/x86/include/asm/kvm_host.h                    |   2 +-
>  arch/x86/kvm/cpuid.c                               |   2 +-
>  arch/x86/kvm/mmu/mmu.c                             |   2 +-
>  arch/x86/kvm/pmu.c                                 |  21 +-
>  arch/x86/kvm/pmu.h                                 |   2 +-
>  arch/x86/kvm/svm/pmu.c                             |   2 +-
>  arch/x86/kvm/svm/svm.c                             |   2 +-
>  arch/x86/kvm/vmx/pmu_intel.c                       | 135 ++++++-----
>  arch/x86/kvm/vmx/vmx.c                             |  16 +-
>  arch/x86/kvm/x86.c                                 | 102 ++++++---
>  arch/x86/kvm/x86.h                                 |  13 ++
>  .../selftests/kvm/include/x86_64/processor.h       |  41 +++-
>  .../selftests/kvm/x86_64/pmu_event_filter_test.c   | 252 ++++++++++++---------
>  .../selftests/kvm/x86_64/vmx_pmu_caps_test.c       | 248 ++++++++++++++++----
>  14 files changed, 565 insertions(+), 275 deletions(-)


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: Selftests changes for 6.4
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: Selftests " Sean Christopherson
@ 2023-04-26 19:56   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 19:56 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
>
> KVM x86 selftests change for 6.4.  And an AMX+XCR0 bugfix that I landed here
> to avoid creating a mess of unnecessary conflicts between the series to
> overhaul the AMX test and the related selftests changes to verify the fix.
>
> The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
>
>   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
>
> are available in the Git repository at:
>
>   https://github.com/kvm-x86/linux.git tags/kvm-x86-selftests-6.4
>
> for you to fetch changes up to 20aef201dafba6a1ffe9daa145c7f2c525b74aae:
>
>   KVM: selftests: Fix spelling mistake "perrmited" -> "permitted" (2023-04-14 10:04:51 -0700)

Pulled (put not pushed yet), thanks.

Paolo

> ----------------------------------------------------------------
> KVM selftests, and an AMX/XCR0 bugfix, for 6.4:
>
>  - Don't advertisze XTILE_CFG in KVM_GET_SUPPORTED_CPUID if XTILE_DATA is
>    not being reported due to userspace not opting in via prctl()
>
>  - Overhaul the AMX selftests to improve coverage and cleanup the test
>
>  - Misc cleanups
>
> ----------------------------------------------------------------
> Aaron Lewis (9):
>       KVM: selftests: Assert that XTILE is XSAVE-enabled
>       KVM: selftests: Assert that both XTILE{CFG,DATA} are XSAVE-enabled
>       KVM: selftests: Move XSAVE and OSXSAVE CPUID checks into AMX's init_regs()
>       KVM: selftests: Check that the palette table exists before using it
>       KVM: selftests: Check that XTILEDATA supports XFD
>       KVM: x86: Add a helper to handle filtering of unpermitted XCR0 features
>       KVM: selftests: Move XGETBV and XSETBV helpers to common code
>       KVM: selftests: Add all known XFEATURE masks to common code
>       KVM: selftests: Add test to verify KVM's supported XCR0
>
> Ackerley Tng (1):
>       KVM: selftests: Adjust VM's initial stack address to align with SysV ABI spec
>
> Anish Moorthy (1):
>       KVM: selftests: Fix nsec to sec conversion in demand_paging_test
>
> Colin Ian King (1):
>       KVM: selftests: Fix spelling mistake "perrmited" -> "permitted"
>
> Hao Ge (1):
>       KVM: selftests: Close opened file descriptor in stable_tsc_check_supported()
>
> Ivan Orlov (1):
>       KVM: selftests: Add 'malloc' failure check in vcpu_save_state
>
> Like Xu (2):
>       KVM: selftests: Add a helper to read kvm boolean module parameters
>       KVM: selftests: Report enable_pmu module value when test is skipped
>
> Mingwei Zhang (6):
>       KVM: selftests: Add a fully functional "struct xstate" for x86
>       KVM: selftests: Fix an error in comment of amx_test
>       KVM: selftests: Enable checking on xcomp_bv in amx_test
>       KVM: selftests: Add check of CR0.TS in the #NM handler in amx_test
>       KVM: selftests: Assert that XTILE_DATA is set in IA32_XFD on #NM
>       KVM: selftests: Verify XTILE_DATA in XSTATE isn't affected by IA32_XFD
>
> Sean Christopherson (2):
>       KVM: x86: Filter out XTILE_CFG if XTILE_DATA isn't permitted
>       KVM: selftests: Rework dynamic XFeature helper to take mask, not bit
>
>  arch/x86/kvm/cpuid.c                               |   2 +-
>  arch/x86/kvm/x86.c                                 |   4 +-
>  arch/x86/kvm/x86.h                                 |  29 +++++
>  tools/testing/selftests/kvm/Makefile               |   1 +
>  tools/testing/selftests/kvm/demand_paging_test.c   |   2 +-
>  .../testing/selftests/kvm/include/kvm_util_base.h  |   1 +
>  .../selftests/kvm/include/x86_64/processor.h       |  83 +++++++++++--
>  tools/testing/selftests/kvm/lib/kvm_util.c         |   5 +
>  tools/testing/selftests/kvm/lib/x86_64/processor.c |  36 ++++--
>  tools/testing/selftests/kvm/x86_64/amx_test.c      | 118 ++++++++----------
>  .../selftests/kvm/x86_64/pmu_event_filter_test.c   |   1 +
>  .../kvm/x86_64/vmx_nested_tsc_scaling_test.c       |   8 +-
>  .../selftests/kvm/x86_64/vmx_pmu_caps_test.c       |   1 +
>  .../testing/selftests/kvm/x86_64/xcr0_cpuid_test.c | 132 +++++++++++++++++++++
>  14 files changed, 326 insertions(+), 97 deletions(-)
>  create mode 100644 tools/testing/selftests/kvm/x86_64/xcr0_cpuid_test.c
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: VMX changes for 6.4
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: VMX " Sean Christopherson
@ 2023-04-26 19:57   ` Paolo Bonzini
  0 siblings, 0 replies; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 19:57 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
>
> KVM VMX changes for 6.4.  A few cleanups and a few fixes, nothing super
> interesting or urgent.  IMO, the most notable part of this pull request is
> that ENCLS is actually allowed in compatibility mode. :-)
>
> The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
>
>   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
>
> are available in the Git repository at:
>
>   https://github.com/kvm-x86/linux.git tags/kvm-x86-vmx-6.4
>
> for you to fetch changes up to 4984563823f0034d3533854c1b50e729f5191089:
>
>   KVM: nVMX: Emulate NOPs in L2, and PAUSE if it's not intercepted (2023-04-11 09:35:49 -0700)

Pulled (but not pushed yet), thanks.

Paolo

> ----------------------------------------------------------------
> KVM VMX changes for 6.4:
>
>  - Fix a bug in emulation of ENCLS in compatibility mode
>
>  - Allow emulation of NOP and PAUSE for L2
>
>  - Misc cleanups
>
> ----------------------------------------------------------------
> Binbin Wu (1):
>       KVM: VMX: Use is_64_bit_mode() to check 64-bit mode in SGX handler
>
> Sean Christopherson (1):
>       KVM: nVMX: Emulate NOPs in L2, and PAUSE if it's not intercepted
>
> Yu Zhang (2):
>       KVM: nVMX: Remove outdated comments in nested_vmx_setup_ctls_msrs()
>       KVM: nVMX: Add helpers to setup VMX control msr configs
>
>  arch/x86/kvm/vmx/nested.c | 112 ++++++++++++++++++++++++++++++----------------
>  arch/x86/kvm/vmx/sgx.c    |   4 +-
>  arch/x86/kvm/vmx/vmx.c    |  15 +++++++
>  3 files changed, 91 insertions(+), 40 deletions(-)
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: SVM changes for 6.4
  2023-04-24 17:35 ` [GIT PULL] KVM: x86: SVM " Sean Christopherson
@ 2023-04-26 19:58   ` Paolo Bonzini
  2023-04-26 20:02     ` Sean Christopherson
  0 siblings, 1 reply; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 19:58 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
>
> KVM SVM changes for 6.4.  The highlight, by a country mile, is support for
> virtual NMIs.
>
> The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
>
>   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
>
> are available in the Git repository at:
>
>   https://github.com/kvm-x86/linux.git tags/kvm-x86-svm-6.4
>
> for you to fetch changes up to c0d0ce9b5a851895f34fd401c9dddc70616711a4:
>
>   KVM: SVM: Remove a duplicate definition of VMCB_AVIC_APIC_BAR_MASK (2023-04-04 11:08:12 -0700)

Pulled (but not pushed yet), thanks.

This is probably the sub-PR for which I'm more interested in giving
the code a closer look, but this is more about understanding the
changes than it is about expecting something bad in it.

Paolo

> ----------------------------------------------------------------
> KVM SVM changes for 6.4:
>
>  - Add support for virtual NMIs
>
>  - Fixes for edge cases related to virtual interrupts
>
> ----------------------------------------------------------------
> Maxim Levitsky (2):
>       KVM: nSVM: Raise event on nested VM exit if L1 doesn't intercept IRQs
>       KVM: SVM: add wrappers to enable/disable IRET interception
>
> Santosh Shukla (5):
>       KVM: nSVM: Don't sync vmcb02 V_IRQ back to vmcb12 if KVM (L0) is intercepting VINTR
>       KVM: nSVM: Disable intercept of VINTR if saved L1 host RFLAGS.IF is 0
>       KVM: SVM: Add definitions for new bits in VMCB::int_ctrl related to vNMI
>       KVM: x86: Add support for SVM's Virtual NMI
>       KVM: nSVM: Implement support for nested VNMI
>
> Sean Christopherson (5):
>       KVM: x86: Raise an event request when processing NMIs if an NMI is pending
>       KVM: x86: Tweak the code and comment related to handling concurrent NMIs
>       KVM: x86: Save/restore all NMIs when multiple NMIs are pending
>       x86/cpufeatures: Redefine synthetic virtual NMI bit as AMD's "real" vNMI
>       KVM: x86: Route pending NMIs from userspace through process_nmi()
>
> Xinghui Li (1):
>       KVM: SVM: Remove a duplicate definition of VMCB_AVIC_APIC_BAR_MASK
>
>  arch/x86/include/asm/cpufeatures.h |   8 +-
>  arch/x86/include/asm/kvm-x86-ops.h |   2 +
>  arch/x86/include/asm/kvm_host.h    |  11 ++-
>  arch/x86/include/asm/svm.h         |  10 ++-
>  arch/x86/kvm/svm/nested.c          |  91 ++++++++++++++++++----
>  arch/x86/kvm/svm/svm.c             | 153 ++++++++++++++++++++++++++++++-------
>  arch/x86/kvm/svm/svm.h             |  29 +++++++
>  arch/x86/kvm/x86.c                 |  46 +++++++++--
>  8 files changed, 292 insertions(+), 58 deletions(-)
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: SVM changes for 6.4
  2023-04-26 19:58   ` Paolo Bonzini
@ 2023-04-26 20:02     ` Sean Christopherson
  2023-04-26 20:48       ` Paolo Bonzini
  0 siblings, 1 reply; 17+ messages in thread
From: Sean Christopherson @ 2023-04-26 20:02 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

On Wed, Apr 26, 2023, Paolo Bonzini wrote:
> On Mon, Apr 24, 2023 at 7:35 PM Sean Christopherson <seanjc@google.com> wrote:
> >
> > KVM SVM changes for 6.4.  The highlight, by a country mile, is support for
> > virtual NMIs.
> >
> > The following changes since commit d8708b80fa0e6e21bc0c9e7276ad0bccef73b6e7:
> >
> >   KVM: Change return type of kvm_arch_vm_ioctl() to "int" (2023-03-16 10:18:07 -0400)
> >
> > are available in the Git repository at:
> >
> >   https://github.com/kvm-x86/linux.git tags/kvm-x86-svm-6.4
> >
> > for you to fetch changes up to c0d0ce9b5a851895f34fd401c9dddc70616711a4:
> >
> >   KVM: SVM: Remove a duplicate definition of VMCB_AVIC_APIC_BAR_MASK (2023-04-04 11:08:12 -0700)
> 
> Pulled (but not pushed yet), thanks.
> 
> This is probably the sub-PR for which I'm more interested in giving
> the code a closer look, but this is more about understanding the
> changes than it is about expecting something bad in it.

100% agree.  If you were to scrutinize only one thing for 6.4, the vNMI changes
are definitely my choice for extra eyeballs.

^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: SVM changes for 6.4
  2023-04-26 20:02     ` Sean Christopherson
@ 2023-04-26 20:48       ` Paolo Bonzini
  2023-04-26 22:40         ` Sean Christopherson
  0 siblings, 1 reply; 17+ messages in thread
From: Paolo Bonzini @ 2023-04-26 20:48 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On Wed, Apr 26, 2023 at 10:02 PM Sean Christopherson <seanjc@google.com> wrote:
> > This is probably the sub-PR for which I'm more interested in giving
> > the code a closer look, but this is more about understanding the
> > changes than it is about expecting something bad in it.
>
> 100% agree.  If you were to scrutinize only one thing for 6.4, the vNMI changes
> are definitely my choice for extra eyeballs.

Interesting read. The split commits left me wondering _why_ patches
1-7 were needed for vNMI, but that's a known limitation of losing the
cover letter, and the Link or Message-Id trailers try to amend for
that.

I have a few comments indeed, most of which are absolutely nits and
can be ignored or fixed as follow-ups. It's my turn to send a "belated
review" patch series, which I'll do for -rc2, but please check if
there are any disagreements.

First of all, this comment caught my attention:

+    /*
+     * Rules for synchronizing int_ctl bits from vmcb02 to vmcb01:
+     *
+     * V_IRQ, V_IRQ_VECTOR, V_INTR_PRIO_MASK, V_IGN_TPR:  If L1 doesn't
+     * intercept interrupts, then KVM will use vmcb02's V_IRQ (and related
+     * flags) to detect interrupt windows for L1 IRQs (even if L1 uses
+     * virtual interrupt masking).  Raise KVM_REQ_EVENT to ensure that
+     * KVM re-requests an interrupt window if necessary, which implicitly
+     * copies this bits from vmcb02 to vmcb01.
+     *
+     * V_TPR: If L1 doesn't use virtual interrupt masking, then L1's vTPR
+     * is stored in vmcb02, but its value doesn't need to be copied from/to
+     * vmcb01 because it is copied from/to the virtual APIC's TPR register
+     * on each VM entry/exit.
+     *
+     * V_GIF: If nested vGIF is not used, KVM uses vmcb02's V_GIF for L1's
+     * V_GIF.  However, GIF is architecturally clear on each VM exit, thus
+     * there is no need to copy V_GIF from vmcb02 to vmcb01.
+     */

"Rules for synchronizing int_ctl bits from vmcb02 to vmcb01" suggests
that this is work done here, and it also misled me into looking at
nested_sync_control_from_vmcb02 (which is instead about vmcb02 ->
vmcb12).

So what about replacing it with

    * int_ctl bits from vmcb02 have to be synchronized to both vmcb12
and vmcb01.
    * The former is in nested_sync_control_from_vmcb02, invoked on every vmexit,
    * while the latter is scattered all over the place:

and perhaps also call out nested_svm_virtualize_tpr(), sync_lapic_to_cr8() and
sync_cr8_to_lapic in the V_TPR part?

Another super small thing which is not worth a respin (would have been):

 Subject: [PATCH 05/13] KVM: x86: Raise an event request when processing NMIs
- if an NMI is pending
+ iff an NMI is pending

The "if" suggests that we were missing an event request, while "iff"
suggests that we were doing them unnecessarily.

As an aside, I like the "coding style violation" of commit
400fee8c9b2d. Because the "limit = 2" case is anti-architectural, it
makes more sense to have it as an "else" rather than as the default.
An alternative could have been:

  unsigned limit = 1;
  if (!static_call(kvm_x86_get_nmi_mask)(vcpu) && !vcpu->arch.nmi_injected)
      limit = 2;

but the ugly condition makes this solution worse.

Next on, commit ab2ee212a57b ("KVM: x86: Save/restore all NMIs when
multiple NMIs are pending"). Here, "allows userspace to restore 255
pending NMIs" in the commit message is kinda scary, and I thought
about following up with a fixlet to KVM_SET_VCPU_EVENTS:

+        events->nmi.pending = min(vcpu->arch.nmi_pending, 2);
         vcpu->arch.nmi_pending = 0;
         atomic_set(&vcpu->arch.nmi_queued, events->nmi.pending);
         kvm_make_request(KVM_REQ_NMI, vcpu);

but really this isn't needed because process_nmi() does have

     vcpu->arch.nmi_pending = min(vcpu->arch.nmi_pending, limit);

So in the end this is also fine, just a remark on the commit message.
May be worth an additional comment instead here in
KVM_SET_VCPU_EVENTS, before the atomic_set().

On to the actual vNMI patch:

+    /*
+     * KVM should never request an NMI window when vNMI is enabled, as KVM
+     * allows at most one to-be-injected NMI and one pending NMI, i.e. if
+     * two NMIs arrive simultaneously, KVM will inject one and set
+     * V_NMI_PENDING for the other.  WARN, but continue with the standard
+     * single-step approach to try and salvage the pending NMI.
+     */
+    WARN_ON_ONCE(is_vnmi_enabled(svm));

Understandable, but also scary. :) I am not sure losing a pending NMI
is a big deal. IIRC the "limit = 2" case only matters because Windows
uses an NMI shootdown when rebooting the system and in some cases it
would hang; but in this case we're in a buggy situation. And it means
having to think about how the IRET+single-step method interacts with
vNMI, and what is the meaning of !svm->awaiting_iret_completion
(tested right below) in this buggy case. I'd just "return" here.

And another small nit to conclude - kvm_get_nr_pending_nmis() could be static.

The only thing that leaves me a bit puzzled is the naming and
rationale of get_vnmi_vmcb_l1(). I'll let you or Santosh clarify that.

Thanks,

Paolo


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [GIT PULL] KVM: x86: SVM changes for 6.4
  2023-04-26 20:48       ` Paolo Bonzini
@ 2023-04-26 22:40         ` Sean Christopherson
  0 siblings, 0 replies; 17+ messages in thread
From: Sean Christopherson @ 2023-04-26 22:40 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

On Wed, Apr 26, 2023, Paolo Bonzini wrote:
> On Wed, Apr 26, 2023 at 10:02 PM Sean Christopherson <seanjc@google.com> wrote:
> > > This is probably the sub-PR for which I'm more interested in giving
> > > the code a closer look, but this is more about understanding the
> > > changes than it is about expecting something bad in it.
> >
> > 100% agree.  If you were to scrutinize only one thing for 6.4, the vNMI changes
> > are definitely my choice for extra eyeballs.
> 
> Interesting read. The split commits left me wondering _why_ patches
> 1-7 were needed for vNMI, but that's a known limitation of losing the
> cover letter, and the Link or Message-Id trailers try to amend for
> that.
> 
> I have a few comments indeed, most of which are absolutely nits and
> can be ignored or fixed as follow-ups. It's my turn to send a "belated
> review" patch series, which I'll do for -rc2, but please check if
> there are any disagreements.
> 
> First of all, this comment caught my attention:
> 
> +    /*
> +     * Rules for synchronizing int_ctl bits from vmcb02 to vmcb01:
> +     *
> +     * V_IRQ, V_IRQ_VECTOR, V_INTR_PRIO_MASK, V_IGN_TPR:  If L1 doesn't
> +     * intercept interrupts, then KVM will use vmcb02's V_IRQ (and related
> +     * flags) to detect interrupt windows for L1 IRQs (even if L1 uses
> +     * virtual interrupt masking).  Raise KVM_REQ_EVENT to ensure that
> +     * KVM re-requests an interrupt window if necessary, which implicitly
> +     * copies this bits from vmcb02 to vmcb01.
> +     *
> +     * V_TPR: If L1 doesn't use virtual interrupt masking, then L1's vTPR
> +     * is stored in vmcb02, but its value doesn't need to be copied from/to
> +     * vmcb01 because it is copied from/to the virtual APIC's TPR register
> +     * on each VM entry/exit.
> +     *
> +     * V_GIF: If nested vGIF is not used, KVM uses vmcb02's V_GIF for L1's
> +     * V_GIF.  However, GIF is architecturally clear on each VM exit, thus
> +     * there is no need to copy V_GIF from vmcb02 to vmcb01.
> +     */
> 
> "Rules for synchronizing int_ctl bits from vmcb02 to vmcb01" suggests
> that this is work done here, and it also misled me into looking at
> nested_sync_control_from_vmcb02 (which is instead about vmcb02 ->
> vmcb12).

+1.  I had a similar reaction when I first saw the code, but learned to live with
it after a few versions :-)

> So what about replacing it with
> 
>     * int_ctl bits from vmcb02 have to be synchronized to both vmcb12
> and vmcb01.
>     * The former is in nested_sync_control_from_vmcb02, invoked on every vmexit,
>     * while the latter is scattered all over the place:
> 
> and perhaps also call out nested_svm_virtualize_tpr(), sync_lapic_to_cr8() and
> sync_cr8_to_lapic in the V_TPR part?
> 
> Another super small thing which is not worth a respin (would have been):
> 
>  Subject: [PATCH 05/13] KVM: x86: Raise an event request when processing NMIs
> - if an NMI is pending
> + iff an NMI is pending
> 
> The "if" suggests that we were missing an event request, while "iff"
> suggests that we were doing them unnecessarily.

Gah, suprised I didn't catch that, I do love me some "iff".

> As an aside, I like the "coding style violation" of commit
> 400fee8c9b2d. Because the "limit = 2" case is anti-architectural, it
> makes more sense to have it as an "else" rather than as the default.
> An alternative could have been:
> 
>   unsigned limit = 1;
>   if (!static_call(kvm_x86_get_nmi_mask)(vcpu) && !vcpu->arch.nmi_injected)
>       limit = 2;
> 
> but the ugly condition makes this solution worse.
> 
> Next on, commit ab2ee212a57b ("KVM: x86: Save/restore all NMIs when
> multiple NMIs are pending"). Here, "allows userspace to restore 255
> pending NMIs" in the commit message is kinda scary, and I thought
> about following up with a fixlet to KVM_SET_VCPU_EVENTS:
> 
> +        events->nmi.pending = min(vcpu->arch.nmi_pending, 2);
>          vcpu->arch.nmi_pending = 0;
>          atomic_set(&vcpu->arch.nmi_queued, events->nmi.pending);
>          kvm_make_request(KVM_REQ_NMI, vcpu);
> 
> but really this isn't needed because process_nmi() does have
> 
>      vcpu->arch.nmi_pending = min(vcpu->arch.nmi_pending, limit);
> 
> So in the end this is also fine, just a remark on the commit message.

Even restoring 255 NMIs would be fine from KVM's perspective.  The guest might
not be happy, but that's likely true if there are _any_ spurious NMIs.  IIRC, I
didn't call out the process_nmi() behavior because having 255 pending virtual
NMIs doesn't put KVM at risk anymore than does having 2 pending virtual NMIs.

> May be worth an additional comment instead here in
> KVM_SET_VCPU_EVENTS, before the atomic_set().
> 
> On to the actual vNMI patch:
> 
> +    /*
> +     * KVM should never request an NMI window when vNMI is enabled, as KVM
> +     * allows at most one to-be-injected NMI and one pending NMI, i.e. if
> +     * two NMIs arrive simultaneously, KVM will inject one and set
> +     * V_NMI_PENDING for the other.  WARN, but continue with the standard
> +     * single-step approach to try and salvage the pending NMI.
> +     */
> +    WARN_ON_ONCE(is_vnmi_enabled(svm));
> 
> Understandable, but also scary. :) I am not sure losing a pending NMI
> is a big deal. IIRC the "limit = 2" case only matters because Windows
> uses an NMI shootdown when rebooting the system and in some cases it
> would hang; but in this case we're in a buggy situation. And it means
> having to think about how the IRET+single-step method interacts with
> vNMI, and what is the meaning of !svm->awaiting_iret_completion
> (tested right below) in this buggy case. I'd just "return" here.

Heh, Santosh originally had it return and I had the opposite reaction: why bail
and *guarantee* problems for the guest, instead of continuing on and *maybe*
causing problems for the guest.

 : Last thought, unless there's something that will obviously break, it's probably
 : better to WARN and continue than to bail.  I.e. do the single-step and hope for
 : the best.  Bailing at this point doesn't seem like it would help.

I don't have a super strong preference.  As you said, KVM is already in a buggy
scenario, though my vote is still to carry on.

https://lkml.kernel.org/r/Y9mwz%2FG6%2BG8NSX3%2B%40google.com

> And another small nit to conclude - kvm_get_nr_pending_nmis() could be static.
> 
> The only thing that leaves me a bit puzzled is the naming and
> rationale of get_vnmi_vmcb_l1(). I'll let you or Santosh clarify that.

Ah, I think what happened is that I complained about is_vnmi_enabled() being
misleading (https://lore.kernel.org/all/Y9m0q31NBmsnhVGD@google.com), but instead
of renaming the top-level helper, Santosh added an inner helper and here we are.

Re-reading what I wrote, and looking at the code with fresh eyes, I don't think
I agree with past me regarding the name of is_vnmi_enabled().  My biggest
objection/confusion with the original code was the comment saying vNMI was
"inhibited".  Appending "for_l1()" makes the usage in the callers quite confusing.

So my vote is to do:

static inline bool is_vnmi_enabled(struct vcpu_svm *svm)
{
	if (!vnmi)
		return false;

	if (is_guest_mode(&svm->vcpu))
		return false;

	return !!(svm->vmcb01.ptr->control.int_ctl & V_NMI_ENABLE_MASK);
}

---
diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h
index f44751dd8d5d..5b604565d4b3 100644
--- a/arch/x86/kvm/svm/svm.h
+++ b/arch/x86/kvm/svm/svm.h
@@ -556,25 +556,15 @@ static inline bool is_x2apic_msrpm_offset(u32 offset)
               (msr < (APIC_BASE_MSR + 0x100));
 }
 
-static inline struct vmcb *get_vnmi_vmcb_l1(struct vcpu_svm *svm)
+static inline bool is_vnmi_enabled(struct vcpu_svm *svm)
 {
        if (!vnmi)
-               return NULL;
+               return false;
 
        if (is_guest_mode(&svm->vcpu))
-               return NULL;
-       else
-               return svm->vmcb01.ptr;
-}
-
-static inline bool is_vnmi_enabled(struct vcpu_svm *svm)
-{
-       struct vmcb *vmcb = get_vnmi_vmcb_l1(svm);
-
-       if (vmcb)
-               return !!(vmcb->control.int_ctl & V_NMI_ENABLE_MASK);
-       else
                return false;
+
+       return !!(svm->vmcb01.ptr->control.int_ctl & V_NMI_ENABLE_MASK);
 }
 
 /* svm.c */

^ permalink raw reply related	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2023-04-26 22:41 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-04-24 17:35 [GIT PULL] KVM: Non-x86 changes for 6.4 Sean Christopherson
2023-04-24 17:35 ` [GIT PULL] KVM: x86: Misc " Sean Christopherson
2023-04-26 19:49   ` Paolo Bonzini
2023-04-24 17:35 ` [GIT PULL] KVM: x86: MMU " Sean Christopherson
2023-04-26 19:52   ` Paolo Bonzini
2023-04-24 17:35 ` [GIT PULL] KVM: x86: PMU " Sean Christopherson
2023-04-26 19:55   ` Paolo Bonzini
2023-04-24 17:35 ` [GIT PULL] KVM: x86: Selftests " Sean Christopherson
2023-04-26 19:56   ` Paolo Bonzini
2023-04-24 17:35 ` [GIT PULL] KVM: x86: SVM " Sean Christopherson
2023-04-26 19:58   ` Paolo Bonzini
2023-04-26 20:02     ` Sean Christopherson
2023-04-26 20:48       ` Paolo Bonzini
2023-04-26 22:40         ` Sean Christopherson
2023-04-24 17:35 ` [GIT PULL] KVM: x86: VMX " Sean Christopherson
2023-04-26 19:57   ` Paolo Bonzini
2023-04-26 19:49 ` [GIT PULL] KVM: Non-x86 " Paolo Bonzini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.