Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 24 Jun 2015 16:36:49 +0000 (09:36 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 24 Jun 2015 16:36:49 +0000 (09:36 -0700)
Pull first batch of KVM updates from Paolo Bonzini:
 "The bulk of the changes here is for x86.  And for once it's not for
  silicon that no one owns: these are really new features for everyone.

  Details:

   - ARM:
        several features are in progress but missed the 4.2 deadline.
        So here is just a smattering of bug fixes, plus enabling the
        VFIO integration.

   - s390:
        Some fixes/refactorings/optimizations, plus support for 2GB
        pages.

   - x86:
        * host and guest support for marking kvmclock as a stable
          scheduler clock.
        * support for write combining.
        * support for system management mode, needed for secure boot in
          guests.
        * a bunch of cleanups required for the above
        * support for virtualized performance counters on AMD
        * legacy PCI device assignment is deprecated and defaults to "n"
          in Kconfig; VFIO replaces it

        On top of this there are also bug fixes and eager FPU context
        loading for FPU-heavy guests.

   - Common code:
        Support for multiple address spaces; for now it is used only for
        x86 SMM but the s390 folks also have plans"

* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (124 commits)
  KVM: s390: clear floating interrupt bitmap and parameters
  KVM: x86/vPMU: Enable PMU handling for AMD PERFCTRn and EVNTSELn MSRs
  KVM: x86/vPMU: Implement AMD vPMU code for KVM
  KVM: x86/vPMU: Define kvm_pmu_ops to support vPMU function dispatch
  KVM: x86/vPMU: introduce kvm_pmu_msr_idx_to_pmc
  KVM: x86/vPMU: reorder PMU functions
  KVM: x86/vPMU: whitespace and stylistic adjustments in PMU code
  KVM: x86/vPMU: use the new macros to go between PMC, PMU and VCPU
  KVM: x86/vPMU: introduce pmu.h header
  KVM: x86/vPMU: rename a few PMU functions
  KVM: MTRR: do not map huge page for non-consistent range
  KVM: MTRR: simplify kvm_mtrr_get_guest_memory_type
  KVM: MTRR: introduce mtrr_for_each_mem_type
  KVM: MTRR: introduce fixed_mtrr_addr_* functions
  KVM: MTRR: sort variable MTRRs
  KVM: MTRR: introduce var_mtrr_range
  KVM: MTRR: introduce fixed_mtrr_segment table
  KVM: MTRR: improve kvm_mtrr_get_guest_memory_type
  KVM: MTRR: do not split 64 bits MSR content
  KVM: MTRR: clean up mtrr default type
  ...

1  2 
arch/s390/kvm/interrupt.c
arch/s390/kvm/kvm-s390.c
arch/x86/include/asm/kvm_host.h
arch/x86/kernel/kvm.c
arch/x86/kvm/cpuid.c
arch/x86/kvm/lapic.c
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c

index 0d3deef6edff49729758be3b4eeb368ca86b7131,480b9750e15e021ef63122d5ebe26b846cbc8f63..c98d89708e99fb19ee2217c826f75f2bd0e3a41a
@@@ -1058,10 -1055,10 +1055,10 @@@ static int __inject_extcall(struct kvm_
            kvm_get_vcpu(vcpu->kvm, src_id) == NULL)
                return -EINVAL;
  
 -      if (sclp_has_sigpif())
 +      if (sclp.has_sigpif)
                return __inject_extcall_sigpif(vcpu, src_id);
  
-       if (!test_and_set_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs))
+       if (test_and_set_bit(IRQ_PEND_EXT_EXTERNAL, &li->pending_irqs))
                return -EBUSY;
        *extcall = irq->u.extcall;
        atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags);
Simple merge
Simple merge
Simple merge
index 9f705e618af574d9a406f2d55f723bfa11129385,a64cc76ea92f2af2ba24f9a666602ad5bee0daac..64dd467930997adbfa6aecd25641ef2004c5488c
  #include <linux/module.h>
  #include <linux/vmalloc.h>
  #include <linux/uaccess.h>
 -#include <asm/i387.h> /* For use_eager_fpu.  Ugh! */
 -#include <asm/fpu-internal.h> /* For use_eager_fpu.  Ugh! */
++#include <asm/fpu/internal.h> /* For use_eager_fpu.  Ugh! */
  #include <asm/user.h>
 -#include <asm/xsave.h>
 +#include <asm/fpu/xstate.h>
  #include "cpuid.h"
  #include "lapic.h"
  #include "mmu.h"
index 4c7deb4f78a147b1a4a8b451120d3b80fa6401dc,beeef05bb4d9bb05986da0bbc9e0366f517ef500..36e9de1b4127c5576ceb292c6ef320eae830df24
@@@ -1581,9 -1588,10 +1593,10 @@@ void kvm_lapic_reset(struct kvm_vcpu *v
  
        for (i = 0; i < APIC_LVT_NUM; i++)
                apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED);
 -      apic->lapic_timer.timer_mode = 0;
 +      apic_update_lvtt(apic);
-       apic_set_reg(apic, APIC_LVT0,
-                    SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT));
+       if (!(vcpu->kvm->arch.disabled_quirks & KVM_QUIRK_LINT0_REENABLED))
+               apic_set_reg(apic, APIC_LVT0,
+                            SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT));
  
        apic_set_reg(apic, APIC_DFR, 0xffffffffU);
        apic_set_spiv(apic, 0xff);
Simple merge
index 26eaeb522cab214bed15cba35f5be945722d70ae,613e13a61cb55dce9de549ae377ed71506154b6d..ac165c2fb8e54a307cb3f70a5e990635f95978b2
  #include <asm/debugreg.h>
  #include <asm/msr.h>
  #include <asm/desc.h>
- #include <asm/mtrr.h>
  #include <asm/mce.h>
 -#include <asm/i387.h>
 -#include <asm/fpu-internal.h> /* Ugh! */
 -#include <asm/xcr.h>
 +#include <linux/kernel_stat.h>
 +#include <asm/fpu/internal.h> /* Ugh! */
  #include <asm/pvclock.h>
  #include <asm/div64.h>
  
@@@ -7038,16 -7292,25 +7275,25 @@@ void kvm_put_guest_fpu(struct kvm_vcpu 
  {
        kvm_put_guest_xcr0(vcpu);
  
-       if (!vcpu->guest_fpu_loaded)
+       if (!vcpu->guest_fpu_loaded) {
+               vcpu->fpu_counter = 0;
                return;
+       }
  
        vcpu->guest_fpu_loaded = 0;
 -      fpu_save_init(&vcpu->arch.guest_fpu);
 +      copy_fpregs_to_fpstate(&vcpu->arch.guest_fpu);
        __kernel_fpu_end();
        ++vcpu->stat.fpu_reload;
-       if (!vcpu->arch.eager_fpu)
-               kvm_make_request(KVM_REQ_DEACTIVATE_FPU, vcpu);
+       /*
+        * If using eager FPU mode, or if the guest is a frequent user
+        * of the FPU, just leave the FPU active for next time.
+        * Every 255 times fpu_counter rolls over to 0; a guest that uses
+        * the FPU in bursts will revert to loading it on demand.
+        */
+       if (!vcpu->arch.eager_fpu) {
+               if (++vcpu->fpu_counter < 5)
+                       kvm_make_request(KVM_REQ_DEACTIVATE_FPU, vcpu);
+       }
        trace_kvm_fpu(0);
  }