]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - arch/x86/kernel/kvm.c
Merge branch 'x86-idle-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[karo-tx-linux.git] / arch / x86 / kernel / kvm.c
index 05fe50e5f42cc5e85971d6fee9f7d6e5bafc2d8e..36bc664160215bb33fce816205e184b657aa852d 100644 (file)
@@ -305,7 +305,7 @@ static void kvm_register_steal_time(void)
 
 static DEFINE_PER_CPU(unsigned long, kvm_apic_eoi) = KVM_PV_EOI_DISABLED;
 
-static void kvm_guest_apic_eoi_write(u32 reg, u32 val)
+static notrace void kvm_guest_apic_eoi_write(u32 reg, u32 val)
 {
        /**
         * This relies on __test_and_clear_bit to modify the memory
@@ -316,7 +316,7 @@ static void kvm_guest_apic_eoi_write(u32 reg, u32 val)
         */
        if (__test_and_clear_bit(KVM_PV_EOI_BIT, this_cpu_ptr(&kvm_apic_eoi)))
                return;
-       apic_write(APIC_EOI, APIC_EOI_ACK);
+       apic->native_eoi_write(APIC_EOI, APIC_EOI_ACK);
 }
 
 static void kvm_guest_cpu_init(void)
@@ -589,6 +589,14 @@ out:
        local_irq_restore(flags);
 }
 
+__visible bool __kvm_vcpu_is_preempted(int cpu)
+{
+       struct kvm_steal_time *src = &per_cpu(steal_time, cpu);
+
+       return !!src->preempted;
+}
+PV_CALLEE_SAVE_REGS_THUNK(__kvm_vcpu_is_preempted);
+
 /*
  * Setup pv_lock_ops to exploit KVM_FEATURE_PV_UNHALT if present.
  */
@@ -605,6 +613,11 @@ void __init kvm_spinlock_init(void)
        pv_lock_ops.queued_spin_unlock = PV_CALLEE_SAVE(__pv_queued_spin_unlock);
        pv_lock_ops.wait = kvm_wait;
        pv_lock_ops.kick = kvm_kick_cpu;
+
+       if (kvm_para_has_feature(KVM_FEATURE_STEAL_TIME)) {
+               pv_lock_ops.vcpu_is_preempted =
+                       PV_CALLEE_SAVE(__kvm_vcpu_is_preempted);
+       }
 }
 
 static __init int kvm_spinlock_init_jump(void)