• Suresh Siddha's avatar
    x86, kvm: fix kvm's usage of kernel_fpu_begin/end() · b1a74bf8
    Suresh Siddha authored
    Preemption is disabled between kernel_fpu_begin/end() and as such
    it is not a good idea to use these routines in kvm_load/put_guest_fpu()
    which can be very far apart.
    kvm_load/put_guest_fpu() routines are already called with
    preemption disabled and KVM already uses the preempt notifier to save
    the guest fpu state using kvm_put_guest_fpu().
    So introduce __kernel_fpu_begin/end() routines which don't touch
    preemption and use them instead of kernel_fpu_begin/end()
    for KVM's use model of saving/restoring guest FPU state.
    Also with this change (and with eagerFPU model), fix the host cr0.TS vm-exit
    state in the case of VMX. For eagerFPU case, host cr0.TS is always clear.
    So no need to worry about it. For the traditional lazyFPU restore case,
    change the cr0.TS bit for the host state during vm-exit to be always clear
    and cr0.TS bit is set in the __vmx_load_host_state() when the FPU
    (guest FPU or the host task's FPU) state is not active. This ensures
    that the host/guest FPU state is properly saved, restored
    during context-switch and with interrupts (using irq_fpu_usable()) not
    stomping on the active FPU state.
    Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
    Link: http://lkml.kernel.org/r/1348164109.26695.338.camel@sbsiddha-desk.sc.intel.com
    Cc: Avi Kivity <avi@redhat.com>
    Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>