Wrap the existing implementation of the KVM_{GET,SET}_CLOCK ioctls in
helper methods.

No functional change intended.

Signed-off-by: Oliver Upton <[email protected]>
---
 arch/x86/kvm/x86.c | 107 ++++++++++++++++++++++++---------------------
 1 file changed, 57 insertions(+), 50 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 2f3929bd5f58..39eaa2fb2001 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5833,12 +5833,65 @@ int kvm_arch_pm_notifier(struct kvm *kvm, unsigned long 
state)
 }
 #endif /* CONFIG_HAVE_KVM_PM_NOTIFIER */
 
+static int kvm_vm_ioctl_get_clock(struct kvm *kvm, void __user *argp)
+{
+       struct kvm_clock_data data;
+
+       /*
+        * Zero flags as it is accessed RMW, leave everything else
+        * uninitialized as clock is always written and no other fields
+        * are consumed.
+        */
+       data.flags = 0;
+       get_kvmclock(kvm, &data);
+       memset(&data.pad, 0, sizeof(data.pad));
+
+       if (copy_to_user(argp, &data, sizeof(data)))
+               return -EFAULT;
+
+       return 0;
+}
+
+static int kvm_vm_ioctl_set_clock(struct kvm *kvm, void __user *argp)
+{
+       struct kvm_arch *ka = &kvm->arch;
+       struct kvm_clock_data data;
+       u64 now_ns;
+
+       if (copy_from_user(&data, argp, sizeof(data)))
+               return -EFAULT;
+
+       if (data.flags)
+               return -EINVAL;
+
+       kvm_hv_invalidate_tsc_page(kvm);
+       kvm_start_pvclock_update(kvm);
+       pvclock_update_vm_gtod_copy(kvm);
+
+       /*
+        * This pairs with kvm_guest_time_update(): when masterclock is
+        * in use, we use master_kernel_ns + kvmclock_offset to set
+        * unsigned 'system_time' so if we use get_kvmclock_ns() (which
+        * is slightly ahead) here we risk going negative on unsigned
+        * 'system_time' when 'data.clock' is very small.
+        */
+       if (kvm->arch.use_master_clock)
+               now_ns = ka->master_kernel_ns;
+       else
+               now_ns = get_kvmclock_base_ns();
+       ka->kvmclock_offset = data.clock - now_ns;
+       kvm_end_pvclock_update(kvm);
+
+       return 0;
+}
+
 long kvm_arch_vm_ioctl(struct file *filp,
                       unsigned int ioctl, unsigned long arg)
 {
        struct kvm *kvm = filp->private_data;
        void __user *argp = (void __user *)arg;
        int r = -ENOTTY;
+
        /*
         * This union makes it completely explicit to gcc-3.x
         * that these two variables' stack usage should be
@@ -6076,58 +6129,12 @@ long kvm_arch_vm_ioctl(struct file *filp,
                break;
        }
 #endif
-       case KVM_SET_CLOCK: {
-               struct kvm_arch *ka = &kvm->arch;
-               struct kvm_clock_data user_ns;
-               u64 now_ns;
-
-               r = -EFAULT;
-               if (copy_from_user(&user_ns, argp, sizeof(user_ns)))
-                       goto out;
-
-               r = -EINVAL;
-               if (user_ns.flags)
-                       goto out;
-
-               r = 0;
-
-               kvm_hv_invalidate_tsc_page(kvm);
-               kvm_start_pvclock_update(kvm);
-               pvclock_update_vm_gtod_copy(kvm);
-
-               /*
-                * This pairs with kvm_guest_time_update(): when masterclock is
-                * in use, we use master_kernel_ns + kvmclock_offset to set
-                * unsigned 'system_time' so if we use get_kvmclock_ns() (which
-                * is slightly ahead) here we risk going negative on unsigned
-                * 'system_time' when 'user_ns.clock' is very small.
-                */
-               if (kvm->arch.use_master_clock)
-                       now_ns = ka->master_kernel_ns;
-               else
-                       now_ns = get_kvmclock_base_ns();
-               ka->kvmclock_offset = user_ns.clock - now_ns;
-               kvm_end_pvclock_update(kvm);
+       case KVM_SET_CLOCK:
+               r = kvm_vm_ioctl_set_clock(kvm, argp);
                break;
-       }
-       case KVM_GET_CLOCK: {
-               struct kvm_clock_data user_ns;
-
-               /*
-                * Zero flags as it is accessed RMW, leave everything else
-                * uninitialized as clock is always written and no other fields
-                * are consumed.
-                */
-               user_ns.flags = 0;
-               get_kvmclock(kvm, &user_ns);
-               memset(&user_ns.pad, 0, sizeof(user_ns.pad));
-
-               r = -EFAULT;
-               if (copy_to_user(argp, &user_ns, sizeof(user_ns)))
-                       goto out;
-               r = 0;
+       case KVM_GET_CLOCK:
+               r = kvm_vm_ioctl_get_clock(kvm, argp);
                break;
-       }
        case KVM_MEMORY_ENCRYPT_OP: {
                r = -ENOTTY;
                if (kvm_x86_ops.mem_enc_op)
-- 
2.33.0.rc1.237.g0d66db33f3-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to