mirror of
https://git.proxmox.com/git/qemu
synced 2025-07-25 13:53:12 +00:00
qemu-timer: remove active_timers array
Embed the list in the QEMUClock instead. Reviewed-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0abc2712b8
commit
688eb3896b
59
qemu-timer.c
59
qemu-timer.c
@ -134,6 +134,7 @@ struct QEMUClock {
|
|||||||
int enabled;
|
int enabled;
|
||||||
|
|
||||||
QEMUTimer *warp_timer;
|
QEMUTimer *warp_timer;
|
||||||
|
QEMUTimer *active_timers;
|
||||||
|
|
||||||
NotifierList reset_notifiers;
|
NotifierList reset_notifiers;
|
||||||
int64_t last;
|
int64_t last;
|
||||||
@ -352,14 +353,10 @@ next:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define QEMU_NUM_CLOCKS 3
|
|
||||||
|
|
||||||
QEMUClock *rt_clock;
|
QEMUClock *rt_clock;
|
||||||
QEMUClock *vm_clock;
|
QEMUClock *vm_clock;
|
||||||
QEMUClock *host_clock;
|
QEMUClock *host_clock;
|
||||||
|
|
||||||
static QEMUTimer *active_timers[QEMU_NUM_CLOCKS];
|
|
||||||
|
|
||||||
static QEMUClock *qemu_new_clock(int type)
|
static QEMUClock *qemu_new_clock(int type)
|
||||||
{
|
{
|
||||||
QEMUClock *clock;
|
QEMUClock *clock;
|
||||||
@ -403,7 +400,7 @@ static void icount_warp_rt(void *opaque)
|
|||||||
int64_t delta = cur_time - cur_icount;
|
int64_t delta = cur_time - cur_icount;
|
||||||
qemu_icount_bias += MIN(warp_delta, delta);
|
qemu_icount_bias += MIN(warp_delta, delta);
|
||||||
}
|
}
|
||||||
if (qemu_timer_expired(active_timers[QEMU_CLOCK_VIRTUAL],
|
if (qemu_timer_expired(vm_clock->active_timers,
|
||||||
qemu_get_clock_ns(vm_clock))) {
|
qemu_get_clock_ns(vm_clock))) {
|
||||||
qemu_notify_event();
|
qemu_notify_event();
|
||||||
}
|
}
|
||||||
@ -434,7 +431,7 @@ void qemu_clock_warp(QEMUClock *clock)
|
|||||||
* the earliest vm_clock timer.
|
* the earliest vm_clock timer.
|
||||||
*/
|
*/
|
||||||
icount_warp_rt(NULL);
|
icount_warp_rt(NULL);
|
||||||
if (!all_cpu_threads_idle() || !active_timers[clock->type]) {
|
if (!all_cpu_threads_idle() || !clock->active_timers) {
|
||||||
qemu_del_timer(clock->warp_timer);
|
qemu_del_timer(clock->warp_timer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -489,7 +486,7 @@ void qemu_del_timer(QEMUTimer *ts)
|
|||||||
|
|
||||||
/* NOTE: this code must be signal safe because
|
/* NOTE: this code must be signal safe because
|
||||||
qemu_timer_expired() can be called from a signal. */
|
qemu_timer_expired() can be called from a signal. */
|
||||||
pt = &active_timers[ts->clock->type];
|
pt = &ts->clock->active_timers;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
t = *pt;
|
t = *pt;
|
||||||
if (!t)
|
if (!t)
|
||||||
@ -513,7 +510,7 @@ static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time)
|
|||||||
/* add the timer in the sorted list */
|
/* add the timer in the sorted list */
|
||||||
/* NOTE: this code must be signal safe because
|
/* NOTE: this code must be signal safe because
|
||||||
qemu_timer_expired() can be called from a signal. */
|
qemu_timer_expired() can be called from a signal. */
|
||||||
pt = &active_timers[ts->clock->type];
|
pt = &ts->clock->active_timers;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
t = *pt;
|
t = *pt;
|
||||||
if (!qemu_timer_expired_ns(t, expire_time)) {
|
if (!qemu_timer_expired_ns(t, expire_time)) {
|
||||||
@ -526,7 +523,7 @@ static void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time)
|
|||||||
*pt = ts;
|
*pt = ts;
|
||||||
|
|
||||||
/* Rearm if necessary */
|
/* Rearm if necessary */
|
||||||
if (pt == &active_timers[ts->clock->type]) {
|
if (pt == &ts->clock->active_timers) {
|
||||||
if (!alarm_timer->pending) {
|
if (!alarm_timer->pending) {
|
||||||
qemu_rearm_alarm_timer(alarm_timer);
|
qemu_rearm_alarm_timer(alarm_timer);
|
||||||
}
|
}
|
||||||
@ -548,7 +545,7 @@ void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
|
|||||||
int qemu_timer_pending(QEMUTimer *ts)
|
int qemu_timer_pending(QEMUTimer *ts)
|
||||||
{
|
{
|
||||||
QEMUTimer *t;
|
QEMUTimer *t;
|
||||||
for(t = active_timers[ts->clock->type]; t != NULL; t = t->next) {
|
for (t = ts->clock->active_timers; t != NULL; t = t->next) {
|
||||||
if (t == ts)
|
if (t == ts)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -569,7 +566,7 @@ static void qemu_run_timers(QEMUClock *clock)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
current_time = qemu_get_clock_ns(clock);
|
current_time = qemu_get_clock_ns(clock);
|
||||||
ptimer_head = &active_timers[clock->type];
|
ptimer_head = &clock->active_timers;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
ts = *ptimer_head;
|
ts = *ptimer_head;
|
||||||
if (!qemu_timer_expired_ns(ts, current_time)) {
|
if (!qemu_timer_expired_ns(ts, current_time)) {
|
||||||
@ -773,8 +770,8 @@ int64_t qemu_next_icount_deadline(void)
|
|||||||
int64_t delta = INT32_MAX;
|
int64_t delta = INT32_MAX;
|
||||||
|
|
||||||
assert(use_icount);
|
assert(use_icount);
|
||||||
if (active_timers[QEMU_CLOCK_VIRTUAL]) {
|
if (vm_clock->active_timers) {
|
||||||
delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
|
delta = vm_clock->active_timers->expire_time -
|
||||||
qemu_get_clock_ns(vm_clock);
|
qemu_get_clock_ns(vm_clock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -789,20 +786,20 @@ static int64_t qemu_next_alarm_deadline(void)
|
|||||||
int64_t delta;
|
int64_t delta;
|
||||||
int64_t rtdelta;
|
int64_t rtdelta;
|
||||||
|
|
||||||
if (!use_icount && active_timers[QEMU_CLOCK_VIRTUAL]) {
|
if (!use_icount && vm_clock->active_timers) {
|
||||||
delta = active_timers[QEMU_CLOCK_VIRTUAL]->expire_time -
|
delta = vm_clock->active_timers->expire_time -
|
||||||
qemu_get_clock_ns(vm_clock);
|
qemu_get_clock_ns(vm_clock);
|
||||||
} else {
|
} else {
|
||||||
delta = INT32_MAX;
|
delta = INT32_MAX;
|
||||||
}
|
}
|
||||||
if (active_timers[QEMU_CLOCK_HOST]) {
|
if (host_clock->active_timers) {
|
||||||
int64_t hdelta = active_timers[QEMU_CLOCK_HOST]->expire_time -
|
int64_t hdelta = host_clock->active_timers->expire_time -
|
||||||
qemu_get_clock_ns(host_clock);
|
qemu_get_clock_ns(host_clock);
|
||||||
if (hdelta < delta)
|
if (hdelta < delta)
|
||||||
delta = hdelta;
|
delta = hdelta;
|
||||||
}
|
}
|
||||||
if (active_timers[QEMU_CLOCK_REALTIME]) {
|
if (rt_clock->active_timers) {
|
||||||
rtdelta = (active_timers[QEMU_CLOCK_REALTIME]->expire_time -
|
rtdelta = (rt_clock->active_timers->expire_time -
|
||||||
qemu_get_clock_ns(rt_clock));
|
qemu_get_clock_ns(rt_clock));
|
||||||
if (rtdelta < delta)
|
if (rtdelta < delta)
|
||||||
delta = rtdelta;
|
delta = rtdelta;
|
||||||
@ -871,9 +868,9 @@ static void dynticks_rearm_timer(struct qemu_alarm_timer *t)
|
|||||||
int64_t current_ns;
|
int64_t current_ns;
|
||||||
|
|
||||||
assert(alarm_has_dynticks(t));
|
assert(alarm_has_dynticks(t));
|
||||||
if (!active_timers[QEMU_CLOCK_REALTIME] &&
|
if (!rt_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_VIRTUAL] &&
|
!vm_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_HOST])
|
!host_clock->active_timers)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nearest_delta_ns = qemu_next_alarm_deadline();
|
nearest_delta_ns = qemu_next_alarm_deadline();
|
||||||
@ -925,9 +922,9 @@ static void unix_rearm_timer(struct qemu_alarm_timer *t)
|
|||||||
int err;
|
int err;
|
||||||
|
|
||||||
assert(alarm_has_dynticks(t));
|
assert(alarm_has_dynticks(t));
|
||||||
if (!active_timers[QEMU_CLOCK_REALTIME] &&
|
if (!rt_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_VIRTUAL] &&
|
!vm_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_HOST])
|
!host_clock->active_timers)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nearest_delta_ns = qemu_next_alarm_deadline();
|
nearest_delta_ns = qemu_next_alarm_deadline();
|
||||||
@ -1022,9 +1019,9 @@ static void mm_rearm_timer(struct qemu_alarm_timer *t)
|
|||||||
int nearest_delta_ms;
|
int nearest_delta_ms;
|
||||||
|
|
||||||
assert(alarm_has_dynticks(t));
|
assert(alarm_has_dynticks(t));
|
||||||
if (!active_timers[QEMU_CLOCK_REALTIME] &&
|
if (!rt_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_VIRTUAL] &&
|
!vm_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_HOST]) {
|
!host_clock->active_timers) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1092,9 +1089,9 @@ static void win32_rearm_timer(struct qemu_alarm_timer *t)
|
|||||||
BOOLEAN success;
|
BOOLEAN success;
|
||||||
|
|
||||||
assert(alarm_has_dynticks(t));
|
assert(alarm_has_dynticks(t));
|
||||||
if (!active_timers[QEMU_CLOCK_REALTIME] &&
|
if (!rt_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_VIRTUAL] &&
|
!vm_clock->active_timers &&
|
||||||
!active_timers[QEMU_CLOCK_HOST])
|
!host_clock->active_timers)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
|
nearest_delta_ms = (qemu_next_alarm_deadline() + 999999) / 1000000;
|
||||||
|
Loading…
Reference in New Issue
Block a user