KVM: X86: Implement userspace interface to set virtual_tsc_khz
This patch implements two new vm-ioctls to get and set the virtual_tsc_khz if the machine supports tsc-scaling. Setting the tsc-frequency is only possible before userspace creates any vcpu. Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
@@ -87,6 +87,11 @@ EXPORT_SYMBOL_GPL(kvm_x86_ops);
|
||||
int ignore_msrs = 0;
|
||||
module_param_named(ignore_msrs, ignore_msrs, bool, S_IRUGO | S_IWUSR);
|
||||
|
||||
bool kvm_has_tsc_control;
|
||||
EXPORT_SYMBOL_GPL(kvm_has_tsc_control);
|
||||
u32 kvm_max_guest_tsc_khz;
|
||||
EXPORT_SYMBOL_GPL(kvm_max_guest_tsc_khz);
|
||||
|
||||
#define KVM_NR_SHARED_MSRS 16
|
||||
|
||||
struct kvm_shared_msrs_global {
|
||||
@@ -1986,6 +1991,7 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||
case KVM_CAP_X86_ROBUST_SINGLESTEP:
|
||||
case KVM_CAP_XSAVE:
|
||||
case KVM_CAP_ASYNC_PF:
|
||||
case KVM_CAP_GET_TSC_KHZ:
|
||||
r = 1;
|
||||
break;
|
||||
case KVM_CAP_COALESCED_MMIO:
|
||||
@@ -2012,6 +2018,9 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||
case KVM_CAP_XCRS:
|
||||
r = cpu_has_xsave;
|
||||
break;
|
||||
case KVM_CAP_TSC_CONTROL:
|
||||
r = kvm_has_tsc_control;
|
||||
break;
|
||||
default:
|
||||
r = 0;
|
||||
break;
|
||||
@@ -3045,6 +3054,32 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
||||
r = kvm_vcpu_ioctl_x86_set_xcrs(vcpu, u.xcrs);
|
||||
break;
|
||||
}
|
||||
case KVM_SET_TSC_KHZ: {
|
||||
u32 user_tsc_khz;
|
||||
|
||||
r = -EINVAL;
|
||||
if (!kvm_has_tsc_control)
|
||||
break;
|
||||
|
||||
user_tsc_khz = (u32)arg;
|
||||
|
||||
if (user_tsc_khz >= kvm_max_guest_tsc_khz)
|
||||
goto out;
|
||||
|
||||
kvm_x86_ops->set_tsc_khz(vcpu, user_tsc_khz);
|
||||
|
||||
r = 0;
|
||||
goto out;
|
||||
}
|
||||
case KVM_GET_TSC_KHZ: {
|
||||
r = -EIO;
|
||||
if (check_tsc_unstable())
|
||||
goto out;
|
||||
|
||||
r = vcpu_tsc_khz(vcpu);
|
||||
|
||||
goto out;
|
||||
}
|
||||
default:
|
||||
r = -EINVAL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user