Merge tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 Jul 2012 19:01:20 +0000 (12:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 24 Jul 2012 19:01:20 +0000 (12:01 -0700)
Pull KVM updates from Avi Kivity:
 "Highlights include
  - full big real mode emulation on pre-Westmere Intel hosts (can be
    disabled with emulate_invalid_guest_state=0)
  - relatively small ppc and s390 updates
  - PCID/INVPCID support in guests
  - EOI avoidance; 3.6 guests should perform better on 3.6 hosts on
    interrupt intensive workloads)
  - Lockless write faults during live migration
  - EPT accessed/dirty bits support for new Intel processors"

Fix up conflicts in:
 - Documentation/virtual/kvm/api.txt:

   Stupid subchapter numbering, added next to each other.

 - arch/powerpc/kvm/booke_interrupts.S:

   PPC asm changes clashing with the KVM fixes

 - arch/s390/include/asm/sigp.h, arch/s390/kvm/sigp.c:

   Duplicated commits through the kvm tree and the s390 tree, with
   subsequent edits in the KVM tree.

* tag 'kvm-3.6-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (93 commits)
  KVM: fix race with level interrupts
  x86, hyper: fix build with !CONFIG_KVM_GUEST
  Revert "apic: fix kvm build on UP without IOAPIC"
  KVM guest: switch to apic_set_eoi_write, apic_write
  apic: add apic_set_eoi_write for PV use
  KVM: VMX: Implement PCID/INVPCID for guests with EPT
  KVM: Add x86_hyper_kvm to complete detect_hypervisor_platform check
  KVM: PPC: Critical interrupt emulation support
  KVM: PPC: e500mc: Fix tlbilx emulation for 64-bit guests
  KVM: PPC64: booke: Set interrupt computation mode for 64-bit host
  KVM: PPC: bookehv: Add ESR flag to Data Storage Interrupt
  KVM: PPC: bookehv64: Add support for std/ld emulation.
  booke: Added crit/mc exception handler for e500v2
  booke/bookehv: Add host crit-watchdog exception support
  KVM: MMU: document mmu-lock and fast page fault
  KVM: MMU: fix kvm_mmu_pagetable_walk tracepoint
  KVM: MMU: trace fast page fault
  KVM: MMU: fast path of handling guest page fault
  KVM: MMU: introduce SPTE_MMU_WRITEABLE bit
  KVM: MMU: fold tlb flush judgement into mmu_spte_update
  ...

20 files changed:
1  2 
Documentation/virtual/kvm/api.txt
MAINTAINERS
arch/powerpc/include/asm/hw_irq.h
arch/powerpc/kernel/kvm.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/booke_interrupts.S
arch/powerpc/kvm/bookehv_interrupts.S
arch/s390/include/asm/sclp.h
arch/s390/kernel/setup.c
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/sigp.c
arch/x86/include/asm/apic.h
arch/x86/include/asm/kvm_host.h
arch/x86/kernel/apic/apic.c
arch/x86/kvm/mmu.c
arch/x86/kvm/trace.h
drivers/s390/kvm/kvm_virtio.c
include/linux/kvm_host.h
virt/kvm/irq_comm.c
virt/kvm/kvm_main.c

index 2c9948379469c1dba5f8c7ef711567067727ff08,310fe508d9cd6b95ab1ecb13471a0f80a3edc5e4..bf33aaa4c59f8f2e507fdd3e9c32528b16e831d1
@@@ -1930,22 -1930,41 +1930,56 @@@ The "pte_enc" field provides a value th
  PTE's RPN field (ie, it needs to be shifted left by 12 to OR it
  into the hash PTE second double word).
  
 +4.75 KVM_IRQFD
  
 -4.75 KVM_PPC_ALLOCATE_HTAB
 +Capability: KVM_CAP_IRQFD
 +Architectures: x86
 +Type: vm ioctl
 +Parameters: struct kvm_irqfd (in)
 +Returns: 0 on success, -1 on error
 +
 +Allows setting an eventfd to directly trigger a guest interrupt.
 +kvm_irqfd.fd specifies the file descriptor to use as the eventfd and
 +kvm_irqfd.gsi specifies the irqchip pin toggled by this event.  When
 +an event is tiggered on the eventfd, an interrupt is injected into
 +the guest using the specified gsi pin.  The irqfd is removed using
 +the KVM_IRQFD_FLAG_DEASSIGN flag, specifying both kvm_irqfd.fd
 +and kvm_irqfd.gsi.
 +
++4.76 KVM_PPC_ALLOCATE_HTAB
+ Capability: KVM_CAP_PPC_ALLOC_HTAB
+ Architectures: powerpc
+ Type: vm ioctl
+ Parameters: Pointer to u32 containing hash table order (in/out)
+ Returns: 0 on success, -1 on error
+ This requests the host kernel to allocate an MMU hash table for a
+ guest using the PAPR paravirtualization interface.  This only does
+ anything if the kernel is configured to use the Book 3S HV style of
+ virtualization.  Otherwise the capability doesn't exist and the ioctl
+ returns an ENOTTY error.  The rest of this description assumes Book 3S
+ HV.
+ There must be no vcpus running when this ioctl is called; if there
+ are, it will do nothing and return an EBUSY error.
+ The parameter is a pointer to a 32-bit unsigned integer variable
+ containing the order (log base 2) of the desired size of the hash
+ table, which must be between 18 and 46.  On successful return from the
+ ioctl, it will have been updated with the order of the hash table that
+ was allocated.
+ If no hash table has been allocated when any vcpu is asked to run
+ (with the KVM_RUN ioctl), the host kernel will allocate a
+ default-sized hash table (16 MB).
+ If this ioctl is called when a hash table has already been allocated,
+ the kernel will clear out the existing hash table (zero all HPTEs) and
+ return the hash table order in the parameter.  (If the guest is using
+ the virtualized real-mode area (VRMA) facility, the kernel will
+ re-create the VMRA HPTEs on the next KVM_RUN of any vcpu.)
  
  5. The kvm_run structure
  ------------------------
diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
index 8fd4b2a0911b76ba60f1c5c35c3ed2cd9f84a49c,09456c4719f3b0e81a563255a82e9cb3d4211b48..bb46b32f9813966724b0d59e8ea0b84923c7eb2c
                         (1<<BOOKE_INTERRUPT_PROGRAM) | \
                         (1<<BOOKE_INTERRUPT_DTLB_MISS))
  
- .macro KVM_HANDLER ivor_nr
+ .macro KVM_HANDLER ivor_nr scratch srr0
  _GLOBAL(kvmppc_handler_\ivor_nr)
        /* Get pointer to vcpu and record exit number. */
-       mtspr   SPRN_SPRG_WSCRATCH0, r4
+       mtspr   \scratch , r4
        mfspr   r4, SPRN_SPRG_RVCPU
 -      stw     r3, VCPU_GPR(r3)(r4)
 -      stw     r5, VCPU_GPR(r5)(r4)
 -      stw     r6, VCPU_GPR(r6)(r4)
++      stw     r3, VCPU_GPR(R3)(r4)
 +      stw     r5, VCPU_GPR(R5)(r4)
 +      stw     r6, VCPU_GPR(R6)(r4)
+       mfspr   r3, \scratch
        mfctr   r5
-       lis     r6, kvmppc_resume_host@h
 -      stw     r3, VCPU_GPR(r4)(r4)
++      stw     r3, VCPU_GPR(R4)(r4)
        stw     r5, VCPU_CTR(r4)
+       mfspr   r3, \srr0
+       lis     r6, kvmppc_resume_host@h
+       stw     r3, VCPU_PC(r4)
        li      r5, \ivor_nr
        ori     r6, r6, kvmppc_resume_host@l
        mtctr   r6
@@@ -99,12 -104,11 +103,11 @@@ _GLOBAL(kvmppc_handler_len
   *  r5: KVM exit number
   */
  _GLOBAL(kvmppc_resume_host)
-       stw     r3, VCPU_GPR(R3)(r4)
        mfcr    r3
        stw     r3, VCPU_CR(r4)
 -      stw     r7, VCPU_GPR(r7)(r4)
 -      stw     r8, VCPU_GPR(r8)(r4)
 -      stw     r9, VCPU_GPR(r9)(r4)
 +      stw     r7, VCPU_GPR(R7)(r4)
 +      stw     r8, VCPU_GPR(R8)(r4)
 +      stw     r9, VCPU_GPR(R9)(r4)
  
        li      r6, 1
        slw     r6, r6, r5
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index c421512ca5eb33ceb79de6ce3b4284a96356ede4,c7520b6184efbbe3f09d60cfa95e552d1969da43..98e24131ff3a831fce89d957fe8b3cb9740264dd
@@@ -2123,25 -2123,23 +2123,42 @@@ void default_init_apic_ldr(void
        apic_write(APIC_LDR, val);
  }
  
 +int default_cpu_mask_to_apicid_and(const struct cpumask *cpumask,
 +                                 const struct cpumask *andmask,
 +                                 unsigned int *apicid)
 +{
 +      unsigned int cpu;
 +
 +      for_each_cpu_and(cpu, cpumask, andmask) {
 +              if (cpumask_test_cpu(cpu, cpu_online_mask))
 +                      break;
 +      }
 +
 +      if (likely(cpu < nr_cpu_ids)) {
 +              *apicid = per_cpu(x86_cpu_to_apicid, cpu);
 +              return 0;
 +      }
 +
 +      return -EINVAL;
 +}
 +
+ /*
+  * Override the generic EOI implementation with an optimized version.
+  * Only called during early boot when only one CPU is active and with
+  * interrupts disabled, so we know this does not race with actual APIC driver
+  * use.
+  */
+ void __init apic_set_eoi_write(void (*eoi_write)(u32 reg, u32 v))
+ {
+       struct apic **drv;
+       for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
+               /* Should happen once for each apic */
+               WARN_ON((*drv)->eoi_write == eoi_write);
+               (*drv)->eoi_write = eoi_write;
+       }
+ }
  /*
   * Power management
   */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge