aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric B Munson <emunson@mgebm.net>2012-03-10 14:37:27 -0500
committerAvi Kivity <avi@redhat.com>2012-04-08 05:49:01 -0400
commit1c0b28c2a46d98cd258d96b8c222144b22876c46 (patch)
tree68c5b4f6a74e3b245dd994752fdc9005075b485c
parent3b5d56b9317fa7b5407dff1aa7b115bf6cdbd494 (diff)
KVM: x86: Add ioctl for KVM_KVMCLOCK_CTRL
Now that we have a flag that will tell the guest it was suspended, create an interface for that communication using a KVM ioctl. Signed-off-by: Eric B Munson <emunson@mgebm.net> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--Documentation/virtual/kvm/api.txt20
-rw-r--r--Documentation/virtual/kvm/msr.txt4
-rw-r--r--arch/x86/kvm/x86.c22
-rw-r--r--include/linux/kvm.h3
4 files changed, 49 insertions, 0 deletions
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 6386f8c0482e..81ff39f6248d 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -1669,6 +1669,26 @@ at the memory location pointed to by "addr".
1669The list of registers accessible using this interface is identical to the 1669The list of registers accessible using this interface is identical to the
1670list in 4.64. 1670list in 4.64.
1671 1671
16724.70 KVM_KVMCLOCK_CTRL
1673
1674Capability: KVM_CAP_KVMCLOCK_CTRL
1675Architectures: Any that implement pvclocks (currently x86 only)
1676Type: vcpu ioctl
1677Parameters: None
1678Returns: 0 on success, -1 on error
1679
1680This signals to the host kernel that the specified guest is being paused by
1681userspace. The host will set a flag in the pvclock structure that is checked
1682from the soft lockup watchdog. The flag is part of the pvclock structure that
1683is shared between guest and host, specifically the second bit of the flags
1684field of the pvclock_vcpu_time_info structure. It will be set exclusively by
1685the host and read/cleared exclusively by the guest. The guest operation of
1686checking and clearing the flag must an atomic operation so
1687load-link/store-conditional, or equivalent must be used. There are two cases
1688where the guest will clear the flag: when the soft lockup watchdog timer resets
1689itself or when a soft lockup is detected. This ioctl can be called any time
1690after pausing the vcpu, but before it is resumed.
1691
16725. The kvm_run structure 16925. The kvm_run structure
1673 1693
1674Application code obtains a pointer to the kvm_run structure by 1694Application code obtains a pointer to the kvm_run structure by
diff --git a/Documentation/virtual/kvm/msr.txt b/Documentation/virtual/kvm/msr.txt
index 50317809113d..96b41bd97523 100644
--- a/Documentation/virtual/kvm/msr.txt
+++ b/Documentation/virtual/kvm/msr.txt
@@ -109,6 +109,10 @@ MSR_KVM_SYSTEM_TIME_NEW: 0x4b564d01
109 0 | 24 | multiple cpus are guaranteed to 109 0 | 24 | multiple cpus are guaranteed to
110 | | be monotonic 110 | | be monotonic
111 ------------------------------------------------------------- 111 -------------------------------------------------------------
112 | | guest vcpu has been paused by
113 1 | N/A | the host
114 | | See 4.70 in api.txt
115 -------------------------------------------------------------
112 116
113 Availability of this MSR must be checked via bit 3 in 0x4000001 cpuid 117 Availability of this MSR must be checked via bit 3 in 0x4000001 cpuid
114 leaf prior to usage. 118 leaf prior to usage.
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 511031dcb9cc..99b738028fc0 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2147,6 +2147,7 @@ int kvm_dev_ioctl_check_extension(long ext)
2147 case KVM_CAP_ASYNC_PF: 2147 case KVM_CAP_ASYNC_PF:
2148 case KVM_CAP_GET_TSC_KHZ: 2148 case KVM_CAP_GET_TSC_KHZ:
2149 case KVM_CAP_PCI_2_3: 2149 case KVM_CAP_PCI_2_3:
2150 case KVM_CAP_KVMCLOCK_CTRL:
2150 r = 1; 2151 r = 1;
2151 break; 2152 break;
2152 case KVM_CAP_COALESCED_MMIO: 2153 case KVM_CAP_COALESCED_MMIO:
@@ -2597,6 +2598,23 @@ static int kvm_vcpu_ioctl_x86_set_xcrs(struct kvm_vcpu *vcpu,
2597 return r; 2598 return r;
2598} 2599}
2599 2600
2601/*
2602 * kvm_set_guest_paused() indicates to the guest kernel that it has been
2603 * stopped by the hypervisor. This function will be called from the host only.
2604 * EINVAL is returned when the host attempts to set the flag for a guest that
2605 * does not support pv clocks.
2606 */
2607static int kvm_set_guest_paused(struct kvm_vcpu *vcpu)
2608{
2609 struct pvclock_vcpu_time_info *src = &vcpu->arch.hv_clock;
2610 if (!vcpu->arch.time_page)
2611 return -EINVAL;
2612 src->flags |= PVCLOCK_GUEST_STOPPED;
2613 mark_page_dirty(vcpu->kvm, vcpu->arch.time >> PAGE_SHIFT);
2614 kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
2615 return 0;
2616}
2617
2600long kvm_arch_vcpu_ioctl(struct file *filp, 2618long kvm_arch_vcpu_ioctl(struct file *filp,
2601 unsigned int ioctl, unsigned long arg) 2619 unsigned int ioctl, unsigned long arg)
2602{ 2620{
@@ -2873,6 +2891,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
2873 r = vcpu->arch.virtual_tsc_khz; 2891 r = vcpu->arch.virtual_tsc_khz;
2874 goto out; 2892 goto out;
2875 } 2893 }
2894 case KVM_KVMCLOCK_CTRL: {
2895 r = kvm_set_guest_paused(vcpu);
2896 goto out;
2897 }
2876 default: 2898 default:
2877 r = -EINVAL; 2899 r = -EINVAL;
2878 } 2900 }
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index 6c322a90b92f..7a9dd4b3dede 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -589,6 +589,7 @@ struct kvm_ppc_pvinfo {
589#define KVM_CAP_S390_UCONTROL 73 589#define KVM_CAP_S390_UCONTROL 73
590#define KVM_CAP_SYNC_REGS 74 590#define KVM_CAP_SYNC_REGS 74
591#define KVM_CAP_PCI_2_3 75 591#define KVM_CAP_PCI_2_3 75
592#define KVM_CAP_KVMCLOCK_CTRL 76
592 593
593#ifdef KVM_CAP_IRQ_ROUTING 594#ifdef KVM_CAP_IRQ_ROUTING
594 595
@@ -859,6 +860,8 @@ struct kvm_s390_ucas_mapping {
859/* Available with KVM_CAP_ONE_REG */ 860/* Available with KVM_CAP_ONE_REG */
860#define KVM_GET_ONE_REG _IOW(KVMIO, 0xab, struct kvm_one_reg) 861#define KVM_GET_ONE_REG _IOW(KVMIO, 0xab, struct kvm_one_reg)
861#define KVM_SET_ONE_REG _IOW(KVMIO, 0xac, struct kvm_one_reg) 862#define KVM_SET_ONE_REG _IOW(KVMIO, 0xac, struct kvm_one_reg)
863/* VM is being stopped by host */
864#define KVM_KVMCLOCK_CTRL _IO(KVMIO, 0xad)
862 865
863#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0) 866#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
864#define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1) 867#define KVM_DEV_ASSIGN_PCI_2_3 (1 << 1)