mirror of https://github.com/xemu-project/xemu.git
icount: get rid of static variable
This patch moves static last_delta variable into timers_state structure to allow correct vmstate operations with icount shift=auto enabled. Signed-off-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru> Message-Id: <161701335066.1180180.7104085247702343395.stgit@pasha-ThinkPad-X280> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
cb4d9e38bd
commit
fe852ac2b3
|
@ -188,11 +188,12 @@ static const VMStateDescription icount_vmstate_adjust_timers = {
|
||||||
|
|
||||||
static const VMStateDescription icount_vmstate_shift = {
|
static const VMStateDescription icount_vmstate_shift = {
|
||||||
.name = "timer/icount/shift",
|
.name = "timer/icount/shift",
|
||||||
.version_id = 1,
|
.version_id = 2,
|
||||||
.minimum_version_id = 1,
|
.minimum_version_id = 2,
|
||||||
.needed = icount_shift_state_needed,
|
.needed = icount_shift_state_needed,
|
||||||
.fields = (VMStateField[]) {
|
.fields = (VMStateField[]) {
|
||||||
VMSTATE_INT16(icount_time_shift, TimersState),
|
VMSTATE_INT16(icount_time_shift, TimersState),
|
||||||
|
VMSTATE_INT64(last_delta, TimersState),
|
||||||
VMSTATE_END_OF_LIST()
|
VMSTATE_END_OF_LIST()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -176,9 +176,6 @@ static void icount_adjust(void)
|
||||||
int64_t cur_icount;
|
int64_t cur_icount;
|
||||||
int64_t delta;
|
int64_t delta;
|
||||||
|
|
||||||
/* Protected by TimersState mutex. */
|
|
||||||
static int64_t last_delta;
|
|
||||||
|
|
||||||
/* If the VM is not running, then do nothing. */
|
/* If the VM is not running, then do nothing. */
|
||||||
if (!runstate_is_running()) {
|
if (!runstate_is_running()) {
|
||||||
return;
|
return;
|
||||||
|
@ -193,20 +190,20 @@ static void icount_adjust(void)
|
||||||
delta = cur_icount - cur_time;
|
delta = cur_icount - cur_time;
|
||||||
/* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
|
/* FIXME: This is a very crude algorithm, somewhat prone to oscillation. */
|
||||||
if (delta > 0
|
if (delta > 0
|
||||||
&& last_delta + ICOUNT_WOBBLE < delta * 2
|
&& timers_state.last_delta + ICOUNT_WOBBLE < delta * 2
|
||||||
&& timers_state.icount_time_shift > 0) {
|
&& timers_state.icount_time_shift > 0) {
|
||||||
/* The guest is getting too far ahead. Slow time down. */
|
/* The guest is getting too far ahead. Slow time down. */
|
||||||
qatomic_set(&timers_state.icount_time_shift,
|
qatomic_set(&timers_state.icount_time_shift,
|
||||||
timers_state.icount_time_shift - 1);
|
timers_state.icount_time_shift - 1);
|
||||||
}
|
}
|
||||||
if (delta < 0
|
if (delta < 0
|
||||||
&& last_delta - ICOUNT_WOBBLE > delta * 2
|
&& timers_state.last_delta - ICOUNT_WOBBLE > delta * 2
|
||||||
&& timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) {
|
&& timers_state.icount_time_shift < MAX_ICOUNT_SHIFT) {
|
||||||
/* The guest is getting too far behind. Speed time up. */
|
/* The guest is getting too far behind. Speed time up. */
|
||||||
qatomic_set(&timers_state.icount_time_shift,
|
qatomic_set(&timers_state.icount_time_shift,
|
||||||
timers_state.icount_time_shift + 1);
|
timers_state.icount_time_shift + 1);
|
||||||
}
|
}
|
||||||
last_delta = delta;
|
timers_state.last_delta = delta;
|
||||||
qatomic_set_i64(&timers_state.qemu_icount_bias,
|
qatomic_set_i64(&timers_state.qemu_icount_bias,
|
||||||
cur_icount - (timers_state.qemu_icount
|
cur_icount - (timers_state.qemu_icount
|
||||||
<< timers_state.icount_time_shift));
|
<< timers_state.icount_time_shift));
|
||||||
|
|
|
@ -43,6 +43,8 @@ typedef struct TimersState {
|
||||||
|
|
||||||
/* Conversion factor from emulated instructions to virtual clock ticks. */
|
/* Conversion factor from emulated instructions to virtual clock ticks. */
|
||||||
int16_t icount_time_shift;
|
int16_t icount_time_shift;
|
||||||
|
/* Icount delta used for shift auto adjust. */
|
||||||
|
int64_t last_delta;
|
||||||
|
|
||||||
/* Compensate for varying guest execution speed. */
|
/* Compensate for varying guest execution speed. */
|
||||||
int64_t qemu_icount_bias;
|
int64_t qemu_icount_bias;
|
||||||
|
|
Loading…
Reference in New Issue