diff options
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r-- | virt/kvm/kvm_main.c | 32 |
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) | |||
2053 | out: | 2055 | out: |
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 | } |
2071 | EXPORT_SYMBOL_GPL(kvm_vcpu_block); | 2076 | EXPORT_SYMBOL_GPL(kvm_vcpu_block); |
2072 | 2077 | ||
2073 | #ifndef CONFIG_S390 | 2078 | #ifndef CONFIG_S390 |
2074 | /* | 2079 | void 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 | */ | ||
2077 | void 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 | } | ||
2090 | EXPORT_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 | */ | ||
2095 | void 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 | } |