git: a7db532e3a6f - main - vmm: Simplify saving of absolute TSC values in snapshots.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 18 Nov 2022 18:26:21 UTC
The branch main has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=a7db532e3a6f83067b342f569b56076d011f8a1e
commit a7db532e3a6f83067b342f569b56076d011f8a1e
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2022-11-18 17:57:29 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2022-11-18 18:25:34 +0000
vmm: Simplify saving of absolute TSC values in snapshots.
Read the current "now" TSC value and use it to compute absolute time
saved value in vm_snapshot_vcpus rather than iterating over vCPUs
multiple times in vm_snapshot_vm.
Reviewed by: corvink, markj
Differential Revision: https://reviews.freebsd.org/D37146
---
sys/amd64/vmm/vmm.c | 35 ++++++++---------------------------
1 file changed, 8 insertions(+), 27 deletions(-)
diff --git a/sys/amd64/vmm/vmm.c b/sys/amd64/vmm/vmm.c
index dc6e03303b44..124fffec0d9e 100644
--- a/sys/amd64/vmm/vmm.c
+++ b/sys/amd64/vmm/vmm.c
@@ -2804,10 +2804,12 @@ VMM_STAT_FUNC(VMM_MEM_WIRED, "Wired memory", vm_get_wiredcnt);
static int
vm_snapshot_vcpus(struct vm *vm, struct vm_snapshot_meta *meta)
{
+ uint64_t tsc, now;
int ret;
int i;
struct vcpu *vcpu;
+ now = rdtsc();
for (i = 0; i < VM_MAXCPU; i++) {
vcpu = &vm->vcpu[i];
@@ -2819,13 +2821,15 @@ vm_snapshot_vcpus(struct vm *vm, struct vm_snapshot_meta *meta)
SNAPSHOT_VAR_OR_LEAVE(vcpu->guest_xcr0, meta, ret, done);
SNAPSHOT_VAR_OR_LEAVE(vcpu->exitinfo, meta, ret, done);
SNAPSHOT_VAR_OR_LEAVE(vcpu->nextrip, meta, ret, done);
- /* XXX we're cheating here, since the value of tsc_offset as
- * saved here is actually the value of the guest's TSC value.
+
+ /*
+ * Save the absolute TSC value by adding now to tsc_offset.
*
* It will be turned turned back into an actual offset when the
* TSC restore function is called
*/
- SNAPSHOT_VAR_OR_LEAVE(vcpu->tsc_offset, meta, ret, done);
+ tsc = now + vcpu->tsc_offset;
+ SNAPSHOT_VAR_OR_LEAVE(tsc, meta, ret, done);
}
done:
@@ -2836,33 +2840,10 @@ static int
vm_snapshot_vm(struct vm *vm, struct vm_snapshot_meta *meta)
{
int ret;
- int i;
- uint64_t now;
-
- ret = 0;
- now = rdtsc();
-
- if (meta->op == VM_SNAPSHOT_SAVE) {
- /* XXX make tsc_offset take the value TSC proper as seen by the
- * guest
- */
- for (i = 0; i < VM_MAXCPU; i++)
- vm->vcpu[i].tsc_offset += now;
- }
ret = vm_snapshot_vcpus(vm, meta);
- if (ret != 0) {
- printf("%s: failed to copy vm data to user buffer", __func__);
+ if (ret != 0)
goto done;
- }
-
- if (meta->op == VM_SNAPSHOT_SAVE) {
- /* XXX turn tsc_offset back into an offset; actual value is only
- * required for restore; using it otherwise would be wrong
- */
- for (i = 0; i < VM_MAXCPU; i++)
- vm->vcpu[i].tsc_offset -= now;
- }
done:
return (ret);