* [PATCH] icount: don't adjust virtual time backwards after warp
@ 2023-06-27 6:14 Nicholas Piggin
2023-06-27 7:00 ` Paolo Bonzini
0 siblings, 1 reply; 2+ messages in thread
From: Nicholas Piggin @ 2023-06-27 6:14 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: Nicholas Piggin, qemu-devel
The icount-based QEMU_CLOCK_VIRTUAL runs ahead of the RT clock at times.
When warping, it is possible it is still ahead at the end of the warp,
which causes icount adaptive mode to adjust it backward. This can result
in the machine observing time going backwards.
Prevent this by clamping adaptive adjustment to 0 at minimum.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
softmmu/icount.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/softmmu/icount.c b/softmmu/icount.c
index 4504433e16..486ea7ef41 100644
--- a/softmmu/icount.c
+++ b/softmmu/icount.c
@@ -259,11 +259,16 @@ static void icount_warp_rt(void)
warp_delta = clock - timers_state.vm_clock_warp_start;
if (icount_enabled() == 2) {
/*
- * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too
- * far ahead of real time.
+ * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too far
+ * ahead of real time (it might already be ahead so careful not
+ * to go backwards).
*/
int64_t cur_icount = icount_get_locked();
int64_t delta = clock - cur_icount;
+
+ if (delta < 0) {
+ delta = 0;
+ }
warp_delta = MIN(warp_delta, delta);
}
qatomic_set_i64(&timers_state.qemu_icount_bias,
--
2.40.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] icount: don't adjust virtual time backwards after warp
2023-06-27 6:14 [PATCH] icount: don't adjust virtual time backwards after warp Nicholas Piggin
@ 2023-06-27 7:00 ` Paolo Bonzini
0 siblings, 0 replies; 2+ messages in thread
From: Paolo Bonzini @ 2023-06-27 7:00 UTC (permalink / raw)
To: Nicholas Piggin; +Cc: qemu-devel, qemu-stable
On 6/27/23 08:14, Nicholas Piggin wrote:
> The icount-based QEMU_CLOCK_VIRTUAL runs ahead of the RT clock at times.
> When warping, it is possible it is still ahead at the end of the warp,
> which causes icount adaptive mode to adjust it backward. This can result
> in the machine observing time going backwards.
>
> Prevent this by clamping adaptive adjustment to 0 at minimum.
Queued, thanks.
Paolo
> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
> ---
> softmmu/icount.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/softmmu/icount.c b/softmmu/icount.c
> index 4504433e16..486ea7ef41 100644
> --- a/softmmu/icount.c
> +++ b/softmmu/icount.c
> @@ -259,11 +259,16 @@ static void icount_warp_rt(void)
> warp_delta = clock - timers_state.vm_clock_warp_start;
> if (icount_enabled() == 2) {
> /*
> - * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too
> - * far ahead of real time.
> + * In adaptive mode, do not let QEMU_CLOCK_VIRTUAL run too far
> + * ahead of real time (it might already be ahead so careful not
> + * to go backwards).
> */
> int64_t cur_icount = icount_get_locked();
> int64_t delta = clock - cur_icount;
> +
> + if (delta < 0) {
> + delta = 0;
> + }
> warp_delta = MIN(warp_delta, delta);
> }
> qatomic_set_i64(&timers_state.qemu_icount_bias,
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-06-27 7:01 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-27 6:14 [PATCH] icount: don't adjust virtual time backwards after warp Nicholas Piggin
2023-06-27 7:00 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).