Merge branch 'kvm-updates/3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 30 Oct 2011 22:36:45 +0000 (15:36 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 30 Oct 2011 22:36:45 +0000 (15:36 -0700)
* 'kvm-updates/3.2' of git://git.kernel.org/pub/scm/linux/kernel/git/avi/kvm: (75 commits)
  KVM: SVM: Keep intercepting task switching with NPT enabled
  KVM: s390: implement sigp external call
  KVM: s390: fix register setting
  KVM: s390: fix return value of kvm_arch_init_vm
  KVM: s390: check cpu_id prior to using it
  KVM: emulate lapic tsc deadline timer for guest
  x86: TSC deadline definitions
  KVM: Fix simultaneous NMIs
  KVM: x86 emulator: convert push %sreg/pop %sreg to direct decode
  KVM: x86 emulator: switch lds/les/lss/lfs/lgs to direct decode
  KVM: x86 emulator: streamline decode of segment registers
  KVM: x86 emulator: simplify OpMem64 decode
  KVM: x86 emulator: switch src decode to decode_operand()
  KVM: x86 emulator: qualify OpReg inhibit_byte_regs hack
  KVM: x86 emulator: switch OpImmUByte decode to decode_imm()
  KVM: x86 emulator: free up some flag bits near src, dst
  KVM: x86 emulator: switch src2 to generic decode_operand()
  KVM: x86 emulator: expand decode flags to 64 bits
  KVM: x86 emulator: split dst decode to a generic decode_operand()
  KVM: x86 emulator: move memop, memopp into emulation context
  ...

1  2 
Documentation/kernel-parameters.txt
arch/x86/include/asm/cpufeature.h
virt/kvm/assigned-dev.c

@@@ -49,7 -49,6 +49,7 @@@ parameter is applicable
        EDD     BIOS Enhanced Disk Drive Services (EDD) is enabled
        EFI     EFI Partitioning (GPT) is enabled
        EIDE    EIDE/ATAPI support is enabled.
 +      EVM     Extended Verification Module
        FB      The frame buffer device is enabled.
        FTRACE  Function tracing enabled.
        GCOV    GCOV profiling is enabled.
@@@ -164,7 -163,7 +164,7 @@@ bytes respectively. Such letter suffixe
                        rsdt -- prefer RSDT over (default) XSDT
                        copy_dsdt -- copy DSDT to memory
  
 -                      See also Documentation/power/pm.txt, pci=noacpi
 +                      See also Documentation/power/runtime_pm.txt, pci=noacpi
  
        acpi_rsdp=      [ACPI,EFI,KEXEC]
                        Pass the RSDP address to the kernel, mostly used
                        behaviour to be specified.  Bit 0 enables warnings,
                        bit 1 enables fixups, and bit 2 sends a segfault.
  
 +      align_va_addr=  [X86-64]
 +                      Align virtual addresses by clearing slice [14:12] when
 +                      allocating a VMA at process creation time. This option
 +                      gives you up to 3% performance improvement on AMD F15h
 +                      machines (where it is enabled by default) for a
 +                      CPU-intensive style benchmark, and it can vary highly in
 +                      a microbenchmark depending on workload and compiler.
 +
 +                      1: only for 32-bit processes
 +                      2: only for 64-bit processes
 +                      on: enable for both 32- and 64-bit processes
 +                      off: disable for both 32- and 64-bit processes
 +
        amd_iommu=      [HW,X86-84]
                        Pass parameters to the AMD IOMMU driver in the system.
                        Possible values are:
        amijoy.map=     [HW,JOY] Amiga joystick support
                        Map of devices attached to JOY0DAT and JOY1DAT
                        Format: <a>,<b>
 -                      See also Documentation/kernel/input/joystick.txt
 +                      See also Documentation/input/joystick.txt
  
        analog.map=     [HW,JOY] Analog joystick and gamepad support
                        Specifies type or capabilities of an analog joystick
        bttv.radio=     Most important insmod options are available as
                        kernel args too.
        bttv.pll=       See Documentation/video4linux/bttv/Insmod-options
 -      bttv.tuner=     and Documentation/video4linux/bttv/CARDLIST
 +      bttv.tuner=
  
        bulk_remove=off [PPC]  This parameter disables the use of the pSeries
                        firmware feature for flushing multiple hpte entries
  
        elevator=       [IOSCHED]
                        Format: {"cfq" | "deadline" | "noop"}
 -                      See Documentation/block/as-iosched.txt and
 +                      See Documentation/block/cfq-iosched.txt and
                        Documentation/block/deadline-iosched.txt for details.
  
        elfcorehdr=     [IA-64,PPC,SH,X86]
                        This option is obsoleted by the "netdev=" option, which
                        has equivalent usage. See its documentation for details.
  
 +      evm=            [EVM]
 +                      Format: { "fix" }
 +                      Permit 'security.evm' to be updated regardless of
 +                      current integrity status.
 +
        failslab=
        fail_page_alloc=
        fail_make_request=[KNL]
                        General fault injection mechanism.
                        Format: <interval>,<probability>,<space>,<times>
 -                      See also /Documentation/fault-injection/.
 +                      See also Documentation/fault-injection/.
  
        floppy=         [HW]
                        See Documentation/blockdev/floppy.txt.
                        has the capability. With this option, super page will
                        not be supported.
        intremap=       [X86-64, Intel-IOMMU]
 -                      Format: { on (default) | off | nosid }
                        on      enable Interrupt Remapping (default)
                        off     disable Interrupt Remapping
                        nosid   disable Source ID checking
 +                      no_x2apic_optout
 +                              BIOS x2APIC opt-out request will be ignored
  
        inttest=        [IA-64]
  
                        [KVM,Intel] Disable FlexPriority feature (TPR shadow).
                        Default is 1 (enabled)
  
+       kvm-intel.nested=
+                       [KVM,Intel] Enable VMX nesting (nVMX).
+                       Default is 0 (disabled)
        kvm-intel.unrestricted_guest=
                        [KVM,Intel] Disable unrestricted guest feature
                        (virtualized real and unpaged mode) on capable
  
        noresidual      [PPC] Don't use residual data on PReP machines.
  
 +      nordrand        [X86] Disable the direct use of the RDRAND
 +                      instruction even if it is supported by the
 +                      processor.  RDRAND is still available to user
 +                      space applications.
 +
        noresume        [SWSUSP] Disables resume and restores original swap
                        space.
  
                        in <PAGE_SIZE> units (needed only for swap files).
                        See  Documentation/power/swsusp-and-swap-files.txt
  
 +      resumedelay=    [HIBERNATION] Delay (in seconds) to pause before attempting to
 +                      read the resume files
 +
 +      resumewait      [HIBERNATION] Wait (indefinitely) for resume device to show up.
 +                      Useful for devices that are detected asynchronously
 +                      (e.g. USB and MMC devices).
 +
        hibernate=      [HIBERNATION]
                noresume        Don't check if there's a hibernation image
                                present during boot.
                        Format: <integer>
  
        sonypi.*=       [HW] Sony Programmable I/O Control Device driver
 -                      See Documentation/sonypi.txt
 +                      See Documentation/laptops/sonypi.txt
  
        specialix=      [HW,SERIAL] Specialix multi-serial port adapter
                        See Documentation/serial/specialix.txt.
                        functions are at fixed addresses, they make nice
                        targets for exploits that can control RIP.
  
 -                      emulate     [default] Vsyscalls turn into traps and are
 -                                  emulated reasonably safely.
 +                      emulate     Vsyscalls turn into traps and are emulated
 +                                  reasonably safely.
  
 -                      native      Vsyscalls are native syscall instructions.
 +                      native      [default] Vsyscalls are native syscall
 +                                  instructions.
                                    This is a little bit faster than trapping
                                    and makes a few dynamic recompilers work
                                    better than they would in emulation mode.
  #define X86_FEATURE_CX16      (4*32+13) /* CMPXCHG16B */
  #define X86_FEATURE_XTPR      (4*32+14) /* Send Task Priority Messages */
  #define X86_FEATURE_PDCM      (4*32+15) /* Performance Capabilities */
 +#define X86_FEATURE_PCID      (4*32+17) /* Process Context Identifiers */
  #define X86_FEATURE_DCA               (4*32+18) /* Direct Cache Access */
  #define X86_FEATURE_XMM4_1    (4*32+19) /* "sse4_1" SSE-4.1 */
  #define X86_FEATURE_XMM4_2    (4*32+20) /* "sse4_2" SSE-4.2 */
  #define X86_FEATURE_X2APIC    (4*32+21) /* x2APIC */
  #define X86_FEATURE_MOVBE     (4*32+22) /* MOVBE instruction */
  #define X86_FEATURE_POPCNT      (4*32+23) /* POPCNT instruction */
+ #define X86_FEATURE_TSC_DEADLINE_TIMER        (4*32+24) /* Tsc deadline timer */
  #define X86_FEATURE_AES               (4*32+25) /* AES instructions */
  #define X86_FEATURE_XSAVE     (4*32+26) /* XSAVE/XRSTOR/XSETBV/XGETBV */
  #define X86_FEATURE_OSXSAVE   (4*32+27) /* "" XSAVE enabled in the OS */
diff --combined virt/kvm/assigned-dev.c
@@@ -58,8 -58,6 +58,6 @@@ static int find_index_from_host_irq(str
  static irqreturn_t kvm_assigned_dev_thread(int irq, void *dev_id)
  {
        struct kvm_assigned_dev_kernel *assigned_dev = dev_id;
-       u32 vector;
-       int index;
  
        if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_HOST_INTX) {
                spin_lock(&assigned_dev->intx_lock);
                spin_unlock(&assigned_dev->intx_lock);
        }
  
-       if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_HOST_MSIX) {
-               index = find_index_from_host_irq(assigned_dev, irq);
-               if (index >= 0) {
-                       vector = assigned_dev->
-                                       guest_msix_entries[index].vector;
-                       kvm_set_irq(assigned_dev->kvm,
-                                   assigned_dev->irq_source_id, vector, 1);
-               }
-       } else
+       kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id,
+                   assigned_dev->guest_irq, 1);
+       return IRQ_HANDLED;
+ }
+ #ifdef __KVM_HAVE_MSIX
+ static irqreturn_t kvm_assigned_dev_thread_msix(int irq, void *dev_id)
+ {
+       struct kvm_assigned_dev_kernel *assigned_dev = dev_id;
+       int index = find_index_from_host_irq(assigned_dev, irq);
+       u32 vector;
+       if (index >= 0) {
+               vector = assigned_dev->guest_msix_entries[index].vector;
                kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id,
-                           assigned_dev->guest_irq, 1);
+                           vector, 1);
+       }
  
        return IRQ_HANDLED;
  }
+ #endif
  
  /* Ack the irq line for an assigned device */
  static void kvm_assigned_dev_ack_irq(struct kvm_irq_ack_notifier *kian)
  {
-       struct kvm_assigned_dev_kernel *dev;
-       if (kian->gsi == -1)
-               return;
-       dev = container_of(kian, struct kvm_assigned_dev_kernel,
-                          ack_notifier);
+       struct kvm_assigned_dev_kernel *dev =
+               container_of(kian, struct kvm_assigned_dev_kernel,
+                            ack_notifier);
  
        kvm_set_irq(dev->kvm, dev->irq_source_id, dev->guest_irq, 0);
  
  static void deassign_guest_irq(struct kvm *kvm,
                               struct kvm_assigned_dev_kernel *assigned_dev)
  {
-       kvm_unregister_irq_ack_notifier(kvm, &assigned_dev->ack_notifier);
-       assigned_dev->ack_notifier.gsi = -1;
+       if (assigned_dev->ack_notifier.gsi != -1)
+               kvm_unregister_irq_ack_notifier(kvm,
+                                               &assigned_dev->ack_notifier);
  
        kvm_set_irq(assigned_dev->kvm, assigned_dev->irq_source_id,
                    assigned_dev->guest_irq, 0);
@@@ -143,7 -146,7 +146,7 @@@ static void deassign_host_irq(struct kv
  
                for (i = 0; i < assigned_dev->entries_nr; i++)
                        free_irq(assigned_dev->host_msix_entries[i].vector,
-                                (void *)assigned_dev);
+                                assigned_dev);
  
                assigned_dev->entries_nr = 0;
                kfree(assigned_dev->host_msix_entries);
                /* Deal with MSI and INTx */
                disable_irq(assigned_dev->host_irq);
  
-               free_irq(assigned_dev->host_irq, (void *)assigned_dev);
+               free_irq(assigned_dev->host_irq, assigned_dev);
  
                if (assigned_dev->irq_requested_type & KVM_DEV_IRQ_HOST_MSI)
                        pci_disable_msi(assigned_dev->dev);
@@@ -205,8 -208,6 +208,8 @@@ static void kvm_free_assigned_device(st
        else
                pci_restore_state(assigned_dev->dev);
  
 +      assigned_dev->dev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED;
 +
        pci_release_regions(assigned_dev->dev);
        pci_disable_device(assigned_dev->dev);
        pci_dev_put(assigned_dev->dev);
@@@ -239,7 -240,7 +242,7 @@@ static int assigned_device_enable_host_
         * are going to be long delays in accepting, acking, etc.
         */
        if (request_threaded_irq(dev->host_irq, NULL, kvm_assigned_dev_thread,
-                                IRQF_ONESHOT, dev->irq_name, (void *)dev))
+                                IRQF_ONESHOT, dev->irq_name, dev))
                return -EIO;
        return 0;
  }
@@@ -258,7 -259,7 +261,7 @@@ static int assigned_device_enable_host_
  
        dev->host_irq = dev->dev->irq;
        if (request_threaded_irq(dev->host_irq, NULL, kvm_assigned_dev_thread,
-                                0, dev->irq_name, (void *)dev)) {
+                                0, dev->irq_name, dev)) {
                pci_disable_msi(dev->dev);
                return -EIO;
        }
@@@ -284,8 -285,8 +287,8 @@@ static int assigned_device_enable_host_
  
        for (i = 0; i < dev->entries_nr; i++) {
                r = request_threaded_irq(dev->host_msix_entries[i].vector,
-                                        NULL, kvm_assigned_dev_thread,
-                                        0, dev->irq_name, (void *)dev);
+                                        NULL, kvm_assigned_dev_thread_msix,
+                                        0, dev->irq_name, dev);
                if (r)
                        goto err;
        }
        return 0;
  err:
        for (i -= 1; i >= 0; i--)
-               free_irq(dev->host_msix_entries[i].vector, (void *)dev);
+               free_irq(dev->host_msix_entries[i].vector, dev);
        pci_disable_msix(dev->dev);
        return r;
  }
@@@ -406,7 -407,8 +409,8 @@@ static int assign_guest_irq(struct kvm 
  
        if (!r) {
                dev->irq_requested_type |= guest_irq_type;
-               kvm_register_irq_ack_notifier(kvm, &dev->ack_notifier);
+               if (dev->ack_notifier.gsi != -1)
+                       kvm_register_irq_ack_notifier(kvm, &dev->ack_notifier);
        } else
                kvm_free_irq_source_id(kvm, dev->irq_source_id);