Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 15 Dec 2022 19:12:21 +0000 (11:12 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 15 Dec 2022 19:12:21 +0000 (11:12 -0800)
Pull kvm updates from Paolo Bonzini:
 "ARM64:

   - Enable the per-vcpu dirty-ring tracking mechanism, together with an
     option to keep the good old dirty log around for pages that are
     dirtied by something other than a vcpu.

   - Switch to the relaxed parallel fault handling, using RCU to delay
     page table reclaim and giving better performance under load.

   - Relax the MTE ABI, allowing a VMM to use the MAP_SHARED mapping
     option, which multi-process VMMs such as crosvm rely on (see merge
     commit 382b5b87a97d: "Fix a number of issues with MTE, such as
     races on the tags being initialised vs the PG_mte_tagged flag as
     well as the lack of support for VM_SHARED when KVM is involved.
     Patches from Catalin Marinas and Peter Collingbourne").

   - Merge the pKVM shadow vcpu state tracking that allows the
     hypervisor to have its own view of a vcpu, keeping that state
     private.

   - Add support for the PMUv3p5 architecture revision, bringing support
     for 64bit counters on systems that support it, and fix the
     no-quite-compliant CHAIN-ed counter support for the machines that
     actually exist out there.

   - Fix a handful of minor issues around 52bit VA/PA support (64kB
     pages only) as a prefix of the oncoming support for 4kB and 16kB
     pages.

   - Pick a small set of documentation and spelling fixes, because no
     good merge window would be complete without those.

  s390:

   - Second batch of the lazy destroy patches

   - First batch of KVM changes for kernel virtual != physical address
     support

   - Removal of a unused function

  x86:

   - Allow compiling out SMM support

   - Cleanup and documentation of SMM state save area format

   - Preserve interrupt shadow in SMM state save area

   - Respond to generic signals during slow page faults

   - Fixes and optimizations for the non-executable huge page errata
     fix.

   - Reprogram all performance counters on PMU filter change

   - Cleanups to Hyper-V emulation and tests

   - Process Hyper-V TLB flushes from a nested guest (i.e. from a L2
     guest running on top of a L1 Hyper-V hypervisor)

   - Advertise several new Intel features

   - x86 Xen-for-KVM:

      - Allow the Xen runstate information to cross a page boundary

      - Allow XEN_RUNSTATE_UPDATE flag behaviour to be configured

      - Add support for 32-bit guests in SCHEDOP_poll

   - Notable x86 fixes and cleanups:

      - One-off fixes for various emulation flows (SGX, VMXON, NRIPS=0).

      - Reinstate IBPB on emulated VM-Exit that was incorrectly dropped
        a few years back when eliminating unnecessary barriers when
        switching between vmcs01 and vmcs02.

      - Clean up vmread_error_trampoline() to make it more obvious that
        params must be passed on the stack, even for x86-64.

      - Let userspace set all supported bits in MSR_IA32_FEAT_CTL
        irrespective of the current guest CPUID.

      - Fudge around a race with TSC refinement that results in KVM
        incorrectly thinking a guest needs TSC scaling when running on a
        CPU with a constant TSC, but no hardware-enumerated TSC
        frequency.

      - Advertise (on AMD) that the SMM_CTL MSR is not supported

      - Remove unnecessary exports

  Generic:

   - Support for responding to signals during page faults; introduces
     new FOLL_INTERRUPTIBLE flag that was reviewed by mm folks

  Selftests:

   - Fix an inverted check in the access tracking perf test, and restore
     support for asserting that there aren't too many idle pages when
     running on bare metal.

   - Fix build errors that occur in certain setups (unsure exactly what
     is unique about the problematic setup) due to glibc overriding
     static_assert() to a variant that requires a custom message.

   - Introduce actual atomics for clear/set_bit() in selftests

   - Add support for pinning vCPUs in dirty_log_perf_test.

   - Rename the so called "perf_util" framework to "memstress".

   - Add a lightweight psuedo RNG for guest use, and use it to randomize
     the access pattern and write vs. read percentage in the memstress
     tests.

   - Add a common ucall implementation; code dedup and pre-work for
     running SEV (and beyond) guests in selftests.

   - Provide a common constructor and arch hook, which will eventually
     be used by x86 to automatically select the right hypercall (AMD vs.
     Intel).

   - A bunch of added/enabled/fixed selftests for ARM64, covering
     memslots, breakpoints, stage-2 faults and access tracking.

   - x86-specific selftest changes:

      - Clean up x86's page table management.

      - Clean up and enhance the "smaller maxphyaddr" test, and add a
        related test to cover generic emulation failure.

      - Clean up the nEPT support checks.

      - Add X86_PROPERTY_* framework to retrieve multi-bit CPUID values.

      - Fix an ordering issue in the AMX test introduced by recent
        conversions to use kvm_cpu_has(), and harden the code to guard
        against similar bugs in the future. Anything that tiggers
        caching of KVM's supported CPUID, kvm_cpu_has() in this case,
        effectively hides opt-in XSAVE features if the caching occurs
        before the test opts in via prctl().

  Documentation:

   - Remove deleted ioctls from documentation

   - Clean up the docs for the x86 MSR filter.

   - Various fixes"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (361 commits)
  KVM: x86: Add proper ReST tables for userspace MSR exits/flags
  KVM: selftests: Allocate ucall pool from MEM_REGION_DATA
  KVM: arm64: selftests: Align VA space allocator with TTBR0
  KVM: arm64: Fix benign bug with incorrect use of VA_BITS
  KVM: arm64: PMU: Fix period computation for 64bit counters with 32bit overflow
  KVM: x86: Advertise that the SMM_CTL MSR is not supported
  KVM: x86: remove unnecessary exports
  KVM: selftests: Fix spelling mistake "probabalistic" -> "probabilistic"
  tools: KVM: selftests: Convert clear/set_bit() to actual atomics
  tools: Drop "atomic_" prefix from atomic test_and_set_bit()
  tools: Drop conflicting non-atomic test_and_{clear,set}_bit() helpers
  KVM: selftests: Use non-atomic clear/set bit helpers in KVM tests
  perf tools: Use dedicated non-atomic clear/set bit helpers
  tools: Take @bit as an "unsigned long" in {clear,set}_bit() helpers
  KVM: arm64: selftests: Enable single-step without a "full" ucall()
  KVM: x86: fix APICv/x2AVIC disabled when vm reboot by itself
  KVM: Remove stale comment about KVM_REQ_UNHALT
  KVM: Add missing arch for KVM_CREATE_DEVICE and KVM_{SET,GET}_DEVICE_ATTR
  KVM: Reference to kvm_userspace_memory_region in doc and comments
  KVM: Delete all references to removed KVM_SET_MEMORY_ALIAS ioctl
  ...

31 files changed:
1  2 
Documentation/virt/kvm/api.rst
MAINTAINERS
arch/arm64/Kconfig
arch/arm64/include/asm/kvm_host.h
arch/arm64/include/asm/pgtable.h
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/image-vars.h
arch/arm64/mm/fault.c
arch/s390/kernel/entry.S
arch/s390/kvm/vsie.c
arch/s390/mm/gmap.c
arch/s390/mm/init.c
arch/x86/events/intel/lbr.c
arch/x86/include/asm/cpufeatures.h
arch/x86/include/asm/hyperv-tlfs.h
arch/x86/kernel/kvm.c
arch/x86/kvm/cpuid.c
arch/x86/kvm/mmu/mmu.c
arch/x86/kvm/reverse_cpuid.h
arch/x86/kvm/svm/svm.c
arch/x86/kvm/x86.c
drivers/s390/crypto/vfio_ap_ops.c
include/asm-generic/hyperv-tlfs.h
include/linux/kvm_host.h
include/linux/mm.h
include/linux/page-flags.h
mm/Kconfig
mm/gup.c
mm/huge_memory.c
mm/hugetlb.c
virt/kvm/kvm_main.c

Simple merge
diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -664,8 -675,8 +675,8 @@@ void kvm_set_cpu_caps(void
                F(XSAVEOPT) | F(XSAVEC) | F(XGETBV1) | F(XSAVES) | f_xfd
        );
  
-       kvm_cpu_cap_init_scattered(CPUID_12_EAX,
+       kvm_cpu_cap_init_kvm_defined(CPUID_12_EAX,
 -              SF(SGX1) | SF(SGX2)
 +              SF(SGX1) | SF(SGX2) | SF(SGX_EDECCSSA)
        );
  
        kvm_cpu_cap_mask(CPUID_8000_0001_ECX,
Simple merge
@@@ -23,8 -36,12 +36,13 @@@ enum kvm_only_cpuid_leafs 
  /* Intel-defined SGX sub-features, CPUID level 0x12 (EAX). */
  #define KVM_X86_FEATURE_SGX1          KVM_X86_FEATURE(CPUID_12_EAX, 0)
  #define KVM_X86_FEATURE_SGX2          KVM_X86_FEATURE(CPUID_12_EAX, 1)
 +#define KVM_X86_FEATURE_SGX_EDECCSSA  KVM_X86_FEATURE(CPUID_12_EAX, 11)
  
+ /* Intel-defined sub-features, CPUID level 0x00000007:1 (EDX) */
+ #define X86_FEATURE_AVX_VNNI_INT8       KVM_X86_FEATURE(CPUID_7_1_EDX, 4)
+ #define X86_FEATURE_AVX_NE_CONVERT      KVM_X86_FEATURE(CPUID_7_1_EDX, 5)
+ #define X86_FEATURE_PREFETCHITI         KVM_X86_FEATURE(CPUID_7_1_EDX, 14)
  struct cpuid_reg {
        u32 function;
        u32 index;
@@@ -2704,12 -2705,10 +2705,10 @@@ static int svm_get_msr_feature(struct k
        msr->data = 0;
  
        switch (msr->index) {
 -      case MSR_F10H_DECFG:
 -              if (boot_cpu_has(X86_FEATURE_LFENCE_RDTSC))
 -                      msr->data |= MSR_F10H_DECFG_LFENCE_SERIALIZE;
 +      case MSR_AMD64_DE_CFG:
 +              if (cpu_feature_enabled(X86_FEATURE_LFENCE_RDTSC))
 +                      msr->data |= MSR_AMD64_DE_CFG_LFENCE_SERIALIZE;
                break;
-       case MSR_IA32_PERF_CAPABILITIES:
-               return 0;
        default:
                return KVM_MSR_RET_INVALID;
        }
Simple merge
Simple merge
Simple merge
@@@ -776,9 -794,9 +794,10 @@@ struct kvm 
        struct srcu_struct srcu;
        struct srcu_struct irq_srcu;
        pid_t userspace_pid;
 +      bool override_halt_poll_ns;
        unsigned int max_halt_poll_ns;
        u32 dirty_ring_size;
+       bool dirty_ring_with_bitmap;
        bool vm_bugged;
        bool vm_dead;
  
@@@ -3087,7 -2958,7 +3087,8 @@@ struct page *follow_page(struct vm_area
  #define FOLL_SPLIT_PMD        0x20000 /* split huge pmd before returning */
  #define FOLL_PIN      0x40000 /* pages must be released via unpin_user_page */
  #define FOLL_FAST_ONLY        0x80000 /* gup_fast: prevent fall-back to slow gup */
 -#define FOLL_INTERRUPTIBLE  0x100000 /* allow interrupts from generic signals */
 +#define FOLL_PCI_P2PDMA       0x100000 /* allow returning PCI P2PDMA pages */
++#define FOLL_INTERRUPTIBLE  0x200000 /* allow interrupts from generic signals */
  
  /*
   * FOLL_PIN and FOLL_LONGTERM may be used in various combinations with each
Simple merge
diff --cc mm/Kconfig
Simple merge
diff --cc mm/gup.c
Simple merge
Simple merge
diff --cc mm/hugetlb.c
Simple merge
Simple merge