Move the body of KVM_SET_CLOCK into __kvm_set_clock() and leave the
copy from userspace and the flags check in the ioctl handler. A
following patch steps kvmclock from inside KVM and needs the worker.

No functional change intended.

Assisted-by: Claude:claude-fable-5.1
Signed-off-by: Mushahid Hussain <[email protected]>
---
 arch/x86/kvm/x86.c | 40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 32563a91fba99..19666a80240a5 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -4354,22 +4354,11 @@ static int kvm_vm_ioctl_get_clock(struct kvm *kvm, void 
__user *argp)
        return 0;
 }
 
-static int kvm_vm_ioctl_set_clock(struct kvm *kvm, void __user *argp)
+static void __kvm_set_clock(struct kvm *kvm, struct kvm_clock_data *data)
 {
        struct kvm_arch *ka = &kvm->arch;
-       struct kvm_clock_data data;
        u64 now_raw_ns;
 
-       if (copy_from_user(&data, argp, sizeof(data)))
-               return -EFAULT;
-
-       /*
-        * Only KVM_CLOCK_REALTIME is used, but allow passing the
-        * result of KVM_GET_CLOCK back to KVM_SET_CLOCK.
-        */
-       if (data.flags & ~KVM_CLOCK_VALID_FLAGS)
-               return -EINVAL;
-
        kvm_hv_request_tsc_page_update(kvm);
        kvm_start_pvclock_update(kvm);
        pvclock_update_vm_gtod_copy(kvm);
@@ -4379,24 +4368,41 @@ static int kvm_vm_ioctl_set_clock(struct kvm *kvm, void 
__user *argp)
         * 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.
+        * 'system_time' when 'data->clock' is very small.
         */
-       if (data.flags & KVM_CLOCK_REALTIME) {
+       if (data->flags & KVM_CLOCK_REALTIME) {
                u64 now_real_ns = ktime_get_real_ns();
 
                /*
                 * Avoid stepping the kvmclock backwards.
                 */
-               if (now_real_ns > data.realtime)
-                       data.clock += now_real_ns - data.realtime;
+               if (now_real_ns > data->realtime)
+                       data->clock += now_real_ns - data->realtime;
        }
 
        if (ka->use_master_clock)
                now_raw_ns = ka->master_kernel_ns;
        else
                now_raw_ns = get_kvmclock_base_ns();
-       ka->kvmclock_offset = data.clock - now_raw_ns;
+       ka->kvmclock_offset = data->clock - now_raw_ns;
        kvm_end_pvclock_update(kvm);
+}
+
+static int kvm_vm_ioctl_set_clock(struct kvm *kvm, void __user *argp)
+{
+       struct kvm_clock_data data;
+
+       if (copy_from_user(&data, argp, sizeof(data)))
+               return -EFAULT;
+
+       /*
+        * Only KVM_CLOCK_REALTIME is used, but allow passing the
+        * result of KVM_GET_CLOCK back to KVM_SET_CLOCK.
+        */
+       if (data.flags & ~KVM_CLOCK_VALID_FLAGS)
+               return -EINVAL;
+
+       __kvm_set_clock(kvm, &data);
        return 0;
 }
 
-- 
2.47.3


Reply via email to