KVM: x86/xen: setup pvclock updates
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>
This commit is contained in:
parent
73e69a8634
commit
aa096aa0a0
|
@ -2610,13 +2610,15 @@ u64 get_kvmclock_ns(struct kvm *kvm)
|
||||||
return ret;
|
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 kvm_vcpu_arch *vcpu = &v->arch;
|
||||||
struct pvclock_vcpu_time_info guest_hv_clock;
|
struct pvclock_vcpu_time_info guest_hv_clock;
|
||||||
|
|
||||||
if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time,
|
if (unlikely(kvm_read_guest_offset_cached(v->kvm, cache,
|
||||||
&guest_hv_clock, sizeof(guest_hv_clock))))
|
&guest_hv_clock, offset, sizeof(guest_hv_clock))))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* This VCPU is paused, but it's legal for a guest to read another
|
/* 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 */
|
++guest_hv_clock.version; /* first time write, random junk */
|
||||||
|
|
||||||
vcpu->hv_clock.version = guest_hv_clock.version + 1;
|
vcpu->hv_clock.version = guest_hv_clock.version + 1;
|
||||||
kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
|
kvm_write_guest_offset_cached(v->kvm, cache,
|
||||||
&vcpu->hv_clock,
|
&vcpu->hv_clock, offset,
|
||||||
sizeof(vcpu->hv_clock.version));
|
sizeof(vcpu->hv_clock.version));
|
||||||
|
|
||||||
smp_wmb();
|
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);
|
trace_kvm_pvclock_update(v->vcpu_id, &vcpu->hv_clock);
|
||||||
|
|
||||||
kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
|
kvm_write_guest_offset_cached(v->kvm, cache,
|
||||||
&vcpu->hv_clock,
|
&vcpu->hv_clock, offset,
|
||||||
sizeof(vcpu->hv_clock));
|
sizeof(vcpu->hv_clock));
|
||||||
|
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
|
|
||||||
vcpu->hv_clock.version++;
|
vcpu->hv_clock.version++;
|
||||||
kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
|
kvm_write_guest_offset_cached(v->kvm, cache,
|
||||||
&vcpu->hv_clock,
|
&vcpu->hv_clock, offset,
|
||||||
sizeof(vcpu->hv_clock.version));
|
sizeof(vcpu->hv_clock.version));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kvm_guest_time_update(struct kvm_vcpu *v)
|
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;
|
vcpu->hv_clock.flags = pvclock_flags;
|
||||||
|
|
||||||
if (vcpu->pv_time_enabled)
|
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))
|
if (v == kvm_get_vcpu(v->kvm, 0))
|
||||||
kvm_hv_setup_tsc_page(v->kvm, &vcpu->hv_clock);
|
kvm_hv_setup_tsc_page(v->kvm, &vcpu->hv_clock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -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,
|
&vcpu->arch.xen.vcpu_info_cache,
|
||||||
data->u.gpa,
|
data->u.gpa,
|
||||||
sizeof(struct vcpu_info));
|
sizeof(struct vcpu_info));
|
||||||
if (!r)
|
if (!r) {
|
||||||
vcpu->arch.xen.vcpu_info_set = true;
|
vcpu->arch.xen.vcpu_info_set = true;
|
||||||
|
kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue