aboutsummaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorMichael S. Tsirkin <mst@redhat.com>2018-06-22 22:22:05 +0300
committerPaolo Bonzini <pbonzini@redhat.com>2018-06-28 19:05:37 +0200
commit6f131f13e68d648a8e4f083c667ab1acd88ce4cd (patch)
tree16fd8a1a96b1bb1f4f0cdf82c81607c1a271acad /target
parent0c8465440d50c18a7bb13d0a866748f0593e193a (diff)
downloadqemu-6f131f13e68d648a8e4f083c667ab1acd88ce4cd.zip
qemu-6f131f13e68d648a8e4f083c667ab1acd88ce4cd.tar.gz
qemu-6f131f13e68d648a8e4f083c667ab1acd88ce4cd.tar.bz2
kvm: support -overcommit cpu-pm=on|off
With this flag, kvm allows guest to control host CPU power state. This increases latency for other processes using same host CPU in an unpredictable way, but if decreases idle entry/exit times for the running VCPU, so to use it QEMU needs a hint about whether host CPU is overcommitted, hence the flag name. Follow-up patches will expose this capability to guest (using mwait leaf). Based on a patch by Wanpeng Li <kernellwp@gmail.com> . Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20180622192148.178309-2-mst@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'target')
-rw-r--r--target/i386/kvm.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
index 2d174f3..dc991f6 100644
--- a/target/i386/kvm.c
+++ b/target/i386/kvm.c
@@ -1387,6 +1387,29 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
smram_machine_done.notify = register_smram_listener;
qemu_add_machine_init_done_notifier(&smram_machine_done);
}
+
+ if (enable_cpu_pm) {
+ int disable_exits = kvm_check_extension(s, KVM_CAP_X86_DISABLE_EXITS);
+ int ret;
+
+/* Work around for kernel header with a typo. TODO: fix header and drop. */
+#if defined(KVM_X86_DISABLE_EXITS_HTL) && !defined(KVM_X86_DISABLE_EXITS_HLT)
+#define KVM_X86_DISABLE_EXITS_HLT KVM_X86_DISABLE_EXITS_HTL
+#endif
+ if (disable_exits) {
+ disable_exits &= (KVM_X86_DISABLE_EXITS_MWAIT |
+ KVM_X86_DISABLE_EXITS_HLT |
+ KVM_X86_DISABLE_EXITS_PAUSE);
+ }
+
+ ret = kvm_vm_enable_cap(s, KVM_CAP_X86_DISABLE_EXITS, 0,
+ disable_exits);
+ if (ret < 0) {
+ error_report("kvm: guest stopping CPU not supported: %s",
+ strerror(-ret));
+ }
+ }
+
return 0;
}