aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/kvm_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r--virt/kvm/kvm_main.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 4fd482fb9260..dd4ac9d9e8f5 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2028,6 +2028,8 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
2028 */ 2028 */
2029 if (kvm_vcpu_check_block(vcpu) < 0) { 2029 if (kvm_vcpu_check_block(vcpu) < 0) {
2030 ++vcpu->stat.halt_successful_poll; 2030 ++vcpu->stat.halt_successful_poll;
2031 if (!vcpu_valid_wakeup(vcpu))
2032 ++vcpu->stat.halt_poll_invalid;
2031 goto out; 2033 goto out;
2032 } 2034 }
2033 cur = ktime_get(); 2035 cur = ktime_get();
@@ -2053,7 +2055,9 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
2053out: 2055out:
2054 block_ns = ktime_to_ns(cur) - ktime_to_ns(start); 2056 block_ns = ktime_to_ns(cur) - ktime_to_ns(start);
2055 2057
2056 if (halt_poll_ns) { 2058 if (!vcpu_valid_wakeup(vcpu))
2059 shrink_halt_poll_ns(vcpu);
2060 else if (halt_poll_ns) {
2057 if (block_ns <= vcpu->halt_poll_ns) 2061 if (block_ns <= vcpu->halt_poll_ns)
2058 ; 2062 ;
2059 /* we had a long block, shrink polling */ 2063 /* we had a long block, shrink polling */
@@ -2066,18 +2070,14 @@ out:
2066 } else 2070 } else
2067 vcpu->halt_poll_ns = 0; 2071 vcpu->halt_poll_ns = 0;
2068 2072
2069 trace_kvm_vcpu_wakeup(block_ns, waited); 2073 trace_kvm_vcpu_wakeup(block_ns, waited, vcpu_valid_wakeup(vcpu));
2074 kvm_arch_vcpu_block_finish(vcpu);
2070} 2075}
2071EXPORT_SYMBOL_GPL(kvm_vcpu_block); 2076EXPORT_SYMBOL_GPL(kvm_vcpu_block);
2072 2077
2073#ifndef CONFIG_S390 2078#ifndef CONFIG_S390
2074/* 2079void kvm_vcpu_wake_up(struct kvm_vcpu *vcpu)
2075 * Kick a sleeping VCPU, or a guest VCPU in guest mode, into host kernel mode.
2076 */
2077void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
2078{ 2080{
2079 int me;
2080 int cpu = vcpu->cpu;
2081 struct swait_queue_head *wqp; 2081 struct swait_queue_head *wqp;
2082 2082
2083 wqp = kvm_arch_vcpu_wq(vcpu); 2083 wqp = kvm_arch_vcpu_wq(vcpu);
@@ -2086,6 +2086,18 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
2086 ++vcpu->stat.halt_wakeup; 2086 ++vcpu->stat.halt_wakeup;
2087 } 2087 }
2088 2088
2089}
2090EXPORT_SYMBOL_GPL(kvm_vcpu_wake_up);
2091
2092/*
2093 * Kick a sleeping VCPU, or a guest VCPU in guest mode, into host kernel mode.
2094 */
2095void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
2096{
2097 int me;
2098 int cpu = vcpu->cpu;
2099
2100 kvm_vcpu_wake_up(vcpu);
2089 me = get_cpu(); 2101 me = get_cpu();
2090 if (cpu != me && (unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) 2102 if (cpu != me && (unsigned)cpu < nr_cpu_ids && cpu_online(cpu))
2091 if (kvm_arch_vcpu_should_kick(vcpu)) 2103 if (kvm_arch_vcpu_should_kick(vcpu))
@@ -2272,7 +2284,7 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id)
2272 int r; 2284 int r;
2273 struct kvm_vcpu *vcpu; 2285 struct kvm_vcpu *vcpu;
2274 2286
2275 if (id >= KVM_MAX_VCPUS) 2287 if (id >= KVM_MAX_VCPU_ID)
2276 return -EINVAL; 2288 return -EINVAL;
2277 2289
2278 vcpu = kvm_arch_vcpu_create(kvm, id); 2290 vcpu = kvm_arch_vcpu_create(kvm, id);
@@ -2746,6 +2758,8 @@ static long kvm_vm_ioctl_check_extension_generic(struct kvm *kvm, long arg)
2746 case KVM_CAP_MULTI_ADDRESS_SPACE: 2758 case KVM_CAP_MULTI_ADDRESS_SPACE:
2747 return KVM_ADDRESS_SPACE_NUM; 2759 return KVM_ADDRESS_SPACE_NUM;
2748#endif 2760#endif
2761 case KVM_CAP_MAX_VCPU_ID:
2762 return KVM_MAX_VCPU_ID;
2749 default: 2763 default:
2750 break; 2764 break;
2751 } 2765 }