1. 11 Jul, 2016 3 commits
    • Paolo Bonzini's avatar
      KVM: nVMX: keep preemption timer enabled during L2 execution · 9314006d
      Paolo Bonzini authored
      Because the vmcs12 preemption timer is emulated through a separate hrtimer,
      we can keep on using the preemption timer in the vmcs02 to emulare L1's
      TSC deadline timer.
      
      However, the corresponding bit in the pin-based execution control field
      must be kept consistent between vmcs01 and vmcs02.  On vmentry we copy
      it into the vmcs02; on vmexit the preemption timer must be disabled in
      the vmcs01 if a preemption timer vmexit happened while in guest mode.
      
      The preemption timer value in the vmcs02 is set by vmx_vcpu_run, so it
      need not be considered in prepare_vmcs02.
      
      Cc: Yunhong Jiang <yunhong.jiang@intel.com>
      Cc: Haozhong Zhang <haozhong.zhang@intel.com>
      Tested-by: default avatarWanpeng Li <kernellwp@gmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      9314006d
    • Wanpeng Li's avatar
      KVM: nVMX: avoid incorrect preemption timer vmexit in nested guest · 55123e3c
      Wanpeng Li authored
      The preemption timer for nested VMX is emulated by hrtimer which is started on L2
      entry, stopped on L2 exit and evaluated via the check_nested_events hook. However,
      nested_vmx_exit_handled is always returning true for preemption timer vmexit.  Then,
      the L1 preemption timer vmexit is captured and be treated as a L2 preemption
      timer vmexit, causing NULL pointer dereferences or worse in the L1 guest's
      vmexit handler:
      
          BUG: unable to handle kernel NULL pointer dereference at           (null)
          IP: [<          (null)>]           (null)
          PGD 0
          Oops: 0010 [#1] SMP
          Call Trace:
           ? kvm_lapic_expired_hv_timer+0x47/0x90 [kvm]
           handle_preemption_timer+0xe/0x20 [kvm_intel]
           vmx_handle_exit+0x169/0x15a0 [kvm_intel]
           ? kvm_arch_vcpu_ioctl_run+0xd5d/0x19d0 [kvm]
           kvm_arch_vcpu_ioctl_run+0xdee/0x19d0 [kvm]
           ? kvm_arch_vcpu_ioctl_run+0xd5d/0x19d0 [kvm]
           ? vcpu_load+0x1c/0x60 [kvm]
           ? kvm_arch_vcpu_load+0x57/0x260 [kvm]
           kvm_vcpu_ioctl+0x2d3/0x7c0 [kvm]
           do_vfs_ioctl+0x96/0x6a0
           ? __fget_light+0x2a/0x90
           SyS_ioctl+0x79/0x90
           do_syscall_64+0x68/0x180
           entry_SYSCALL64_slow_path+0x25/0x25
          Code:  Bad RIP value.
          RIP  [<          (null)>]           (null)
           RSP <ffff8800b5263c48>
          CR2: 0000000000000000
          ---[ end trace 9c70c48b1a2bc66e ]---
      
      This can be reproduced readily by preemption timer enabled on L0 and disabled
      on L1.
      
      Return false since preemption timer vmexits must never be reflected to L2.
      
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Radim Krčmář <rkrcmar@redhat.com>
      Cc: Yunhong Jiang <yunhong.jiang@intel.com>
      Cc: Jan Kiszka <jan.kiszka@siemens.com>
      Cc: Haozhong Zhang <haozhong.zhang@intel.com>
      Signed-off-by: default avatarWanpeng Li <wanpeng.li@hotmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      55123e3c
    • Paolo Bonzini's avatar
      KVM: VMX: reflect broken preemption timer in vmcs_config · 1c17c3e6
      Paolo Bonzini authored
      Simplify cpu_has_vmx_preemption_timer.  This is consistent with the
      rest of setup_vmcs_config and preparatory for the next patch.
      Tested-by: default avatarWanpeng Li <kernellwp@gmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      1c17c3e6
  2. 05 Jul, 2016 28 commits
  3. 01 Jul, 2016 6 commits
    • Wanpeng Li's avatar
      KVM: vmx: fix missed cancellation of TSC deadline timer · 196f20ca
      Wanpeng Li authored
      INFO: rcu_sched detected stalls on CPUs/tasks:
       1-...: (11800 GPs behind) idle=45d/140000000000000/0 softirq=0/0 fqs=21663
       (detected by 0, t=65016 jiffies, g=11500, c=11499, q=719)
      Task dump for CPU 1:
      qemu-system-x86 R  running task        0  3529   3525 0x00080808
       ffff8802021791a0 ffff880212895040 0000000000000001 00007f1c2c00db40
       ffff8801dd20fcd3 ffffc90002b98000 ffff8801dd20fc88 ffff8801dd20fcf8
       0000000000000286 ffff8801dd2ac538 ffff8801dd20fcc0 ffffffffc06949c9
      Call Trace:
      ? kvm_write_guest_cached+0xb9/0x160 [kvm]
      ? __delay+0xf/0x20
      ? wait_lapic_expire+0x14a/0x200 [kvm]
      ? kvm_arch_vcpu_ioctl_run+0xcbe/0x1b00 [kvm]
      ? kvm_arch_vcpu_ioctl_run+0xe34/0x1b00 [kvm]
      ? kvm_vcpu_ioctl+0x2d3/0x7c0 [kvm]
      ? __fget+0x5/0x210
      ? do_vfs_ioctl+0x96/0x6a0
      ? __fget_light+0x2a/0x90
      ? SyS_ioctl+0x79/0x90
      ? do_syscall_64+0x7c/0x1e0
      ? entry_SYSCALL64_slow_path+0x25/0x25
      
      This can be reproduced readily by running a full dynticks guest(since hrtimer
      in guest is heavily used) w/ lapic_timer_advance disabled.
      
      If fail to program hardware preemption timer, we will fallback to hrtimer based
      method, however, a previous programmed preemption timer miss to cancel in this
      scenario which results in one hardware preemption timer and one hrtimer emulated
      tsc deadline timer run simultaneously. So sometimes the target guest deadline
      tsc is earlier than guest tsc, which leads to the computation in vmx_set_hv_timer
      can underflow and cause delta_tsc to be set a huge value, then host soft lockup
      as above.
      
      This patch fix it by cancelling the previous programmed preemption timer if there
      is once we failed to program the new preemption timer and fallback to hrtimer
      based method.
      
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Radim Krčmář <rkrcmar@redhat.com>
      Cc: Yunhong Jiang <yunhong.jiang@intel.com>
      Signed-off-by: default avatarWanpeng Li <wanpeng.li@hotmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      196f20ca
    • Wanpeng Li's avatar
      KVM: x86: introduce cancel_hv_tscdeadline · bd97ad0e
      Wanpeng Li authored
      Introduce cancel_hv_tscdeadline() to encapsulate preemption
      timer cancel stuff.
      
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Radim Krčmář <rkrcmar@redhat.com>
      Cc: Yunhong Jiang <yunhong.jiang@intel.com>
      Signed-off-by: default avatarWanpeng Li <wanpeng.li@hotmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      bd97ad0e
    • Paolo Bonzini's avatar
      KVM: vmx: fix underflow in TSC deadline calculation · 9175d2e9
      Paolo Bonzini authored
      If the TSC deadline timer is programmed really close to the deadline or
      even in the past, the computation in vmx_set_hv_timer can underflow and
      cause delta_tsc to be set to a huge value.  This generally results
      in vmx_set_hv_timer returning -ERANGE, but we can fix it by limiting
      delta_tsc to be positive or zero.
      Reported-by: default avatarWanpeng Li <wanpeng.li@hotmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      9175d2e9
    • Paolo Bonzini's avatar
      KVM: x86: use guest_exit_irqoff · f2485b3e
      Paolo Bonzini authored
      This gains a few clock cycles per vmexit.  On Intel there is no need
      anymore to enable the interrupts in vmx_handle_external_intr, since
      we are using the "acknowledge interrupt on exit" feature.  AMD
      needs to do that, and must be careful to avoid the interrupt shadow.
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      f2485b3e
    • Paolo Bonzini's avatar
      KVM: x86: always use "acknowledge interrupt on exit" · 91fa0f8e
      Paolo Bonzini authored
      This is necessary to simplify handle_external_intr in the next patch.
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      91fa0f8e
    • Paolo Bonzini's avatar
      KVM: remove kvm_guest_enter/exit wrappers · 6edaa530
      Paolo Bonzini authored
      Use the functions from context_tracking.h directly.
      
      Cc: Andy Lutomirski <luto@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Reviewed-by: default avatarRik van Riel <riel@redhat.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      6edaa530
  4. 28 Jun, 2016 1 commit
  5. 23 Jun, 2016 2 commits
    • James Hogan's avatar
      MIPS: KVM: Combine entry trace events into class · fb6cec14
      James Hogan authored
      Combine the kvm_enter, kvm_reenter and kvm_out trace events into a
      single kvm_transition event class to reduce duplication and bloat.
      Suggested-by: default avatarSteven Rostedt <rostedt@goodmis.org>
      Fixes: 93258604 ("MIPS: KVM: Add guest mode switch trace events")
      Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Radim KrčmáŠ<rkrcmar@redhat.com>
      Cc: Ralf Baechle <ralf@linux-mips.org>
      Cc: Steven Rostedt <rostedt@goodmis.org>
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: linux-mips@linux-mips.org
      Cc: kvm@vger.kernel.org
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      fb6cec14
    • Arnd Bergmann's avatar
      kvm: x86: use getboottime64 · 87aeb54f
      Arnd Bergmann authored
      KVM reads the current boottime value as a struct timespec in order to
      calculate the guest wallclock time, resulting in an overflow in 2038
      on 32-bit systems.
      
      The data then gets passed as an unsigned 32-bit number to the guest,
      and that in turn overflows in 2106.
      
      We cannot do much about the second overflow, which affects both 32-bit
      and 64-bit hosts, but we can ensure that they both behave the same
      way and don't overflow until 2106, by using getboottime64() to read
      a timespec64 value.
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      87aeb54f