Skip to content

Commit

Permalink
update system time immediately when VCPUOP_register_vcpu_info
Browse files Browse the repository at this point in the history
The guest may access the pv vcpu_time_info immediately after
VCPUOP_register_vcpu_info. This is to borrow the idea of
VCPUOP_register_vcpu_time_memory_area, where the
force_update_vcpu_system_time() is called immediately when the new memory
area is registered.

Otherwise, we may observe clock drift at the VM side if the VM accesses
the clocksource immediately after VCPUOP_register_vcpu_info().

Reference: https://lists.xenproject.org/archives/html/xen-devel/2021-10/msg00571.html
Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
Acked-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Release-Acked-by: Ian Jackson <iwj@xenproject.org>
  • Loading branch information
Dongli Zhang authored and jbeulich committed Nov 3, 2021
1 parent e41a5ba commit b67f097
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 0 deletions.
5 changes: 5 additions & 0 deletions xen/arch/arm/time.c
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,11 @@ void update_vcpu_system_time(struct vcpu *v)
/* XXX update shared_info->wc_* */
}

void force_update_vcpu_system_time(struct vcpu *v)
{
update_vcpu_system_time(v);
}

void domain_set_time_offset(struct domain *d, int64_t time_offset_seconds)
{
d->time_offset.seconds = time_offset_seconds;
Expand Down
2 changes: 2 additions & 0 deletions xen/common/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -1704,6 +1704,8 @@ long do_vcpu_op(int cmd, unsigned int vcpuid, XEN_GUEST_HANDLE_PARAM(void) arg)
rc = map_vcpu_info(v, info.mfn, info.offset);
domain_unlock(d);

force_update_vcpu_system_time(v);

break;
}

Expand Down
2 changes: 2 additions & 0 deletions xen/include/asm-arm/time.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ extern uint64_t ns_to_ticks(s_time_t ns);

void preinit_xen_time(void);

void force_update_vcpu_system_time(struct vcpu *v);

#endif /* __ARM_TIME_H__ */
/*
* Local variables:
Expand Down

0 comments on commit b67f097

Please sign in to comment.