KVM: x86/xen: setup pvclock updates
authorJoao Martins <joao.m.martins@oracle.com>
Fri, 1 Feb 2019 18:01:45 +0000 (13:01 -0500)
committerDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 4 Feb 2021 14:19:39 +0000 (14:19 +0000)
Parameterise kvm_setup_pvclock_page() a little bit so that it can be
invoked for different gfn_to_hva_cache structures, and with different
offsets. Then we can invoke it for the normal KVM pvclock and also for
the Xen one in the vcpu_info.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
arch/x86/kvm/x86.c
arch/x86/kvm/xen.c

index 66cd574..a295fb8 100644 (file)
@@ -2610,13 +2610,15 @@ u64 get_kvmclock_ns(struct kvm *kvm)
        return ret;
 }
 
-static void kvm_setup_pvclock_page(struct kvm_vcpu *v)
+static void kvm_setup_pvclock_page(struct kvm_vcpu *v,
+                                  struct gfn_to_hva_cache *cache,
+                                  unsigned int offset)
 {
        struct kvm_vcpu_arch *vcpu = &v->arch;
        struct pvclock_vcpu_time_info guest_hv_clock;
 
-       if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time,
-               &guest_hv_clock, sizeof(guest_hv_clock))))
+       if (unlikely(kvm_read_guest_offset_cached(v->kvm, cache,
+               &guest_hv_clock, offset, sizeof(guest_hv_clock))))
                return;
 
        /* This VCPU is paused, but it's legal for a guest to read another
@@ -2639,9 +2641,9 @@ static void kvm_setup_pvclock_page(struct kvm_vcpu *v)
                ++guest_hv_clock.version;  /* first time write, random junk */
 
        vcpu->hv_clock.version = guest_hv_clock.version + 1;
-       kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
-                               &vcpu->hv_clock,
-                               sizeof(vcpu->hv_clock.version));
+       kvm_write_guest_offset_cached(v->kvm, cache,
+                                     &vcpu->hv_clock, offset,
+                                     sizeof(vcpu->hv_clock.version));
 
        smp_wmb();
 
@@ -2655,16 +2657,16 @@ static void kvm_setup_pvclock_page(struct kvm_vcpu *v)
 
        trace_kvm_pvclock_update(v->vcpu_id, &vcpu->hv_clock);
 
-       kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
-                               &vcpu->hv_clock,
-                               sizeof(vcpu->hv_clock));
+       kvm_write_guest_offset_cached(v->kvm, cache,
+                                     &vcpu->hv_clock, offset,
+                                     sizeof(vcpu->hv_clock));
 
        smp_wmb();
 
        vcpu->hv_clock.version++;
-       kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
-                               &vcpu->hv_clock,
-                               sizeof(vcpu->hv_clock.version));
+       kvm_write_guest_offset_cached(v->kvm, cache,
+                                    &vcpu->hv_clock, offset,
+                                    sizeof(vcpu->hv_clock.version));
 }
 
 static int kvm_guest_time_update(struct kvm_vcpu *v)
@@ -2751,7 +2753,10 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
        vcpu->hv_clock.flags = pvclock_flags;
 
        if (vcpu->pv_time_enabled)
-               kvm_setup_pvclock_page(v);
+               kvm_setup_pvclock_page(v, &vcpu->pv_time, 0);
+       if (vcpu->xen.vcpu_info_set)
+               kvm_setup_pvclock_page(v, &vcpu->xen.vcpu_info_cache,
+                                      offsetof(struct compat_vcpu_info, time));
        if (v == kvm_get_vcpu(v->kvm, 0))
                kvm_hv_setup_tsc_page(v->kvm, &vcpu->hv_clock);
        return 0;
index 2712f1a..c307f8b 100644 (file)
@@ -135,11 +135,12 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data)
                                              &vcpu->arch.xen.vcpu_info_cache,
                                              data->u.gpa,
                                              sizeof(struct vcpu_info));
-               if (!r)
+               if (!r) {
                        vcpu->arch.xen.vcpu_info_set = true;
+                       kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
+               }
                break;
 
-
        default:
                break;
        }