From bff9f8bfbe223a688a940da09f08b0b2aebc5718 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 20 Apr 2012 10:27:06 +0200 Subject: [PATCH 1/5] qemu-timer: Remove redundant include statements qemu-timer.h includes qemu-common.h which already includes time.h, sys/time.h, windows.h, unistd.h, fcntl.h, errno.h and signal.h. Therefore those include statements are redundant and can be removed. Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Weil --- qemu-timer.c | 11 ++--------- qemu-timer.h | 6 ------ 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/qemu-timer.c b/qemu-timer.c index 0b28edad1c..25d5fdcc28 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -29,23 +29,16 @@ #include "hw/hw.h" -#include -#include -#include -#include -#include -#include +#include "qemu-timer.h" + #ifdef __FreeBSD__ #include #endif #ifdef _WIN32 -#include #include #endif -#include "qemu-timer.h" - /***********************************************************/ /* timers */ diff --git a/qemu-timer.h b/qemu-timer.h index 094e730ca2..5a31434f47 100644 --- a/qemu-timer.h +++ b/qemu-timer.h @@ -4,12 +4,6 @@ #include "qemu-common.h" #include "main-loop.h" #include "notify.h" -#include -#include - -#ifdef _WIN32 -#include -#endif /* timers */ From c4879f2a6719f3ede428324dc763b74465d89d57 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 20 Apr 2012 10:50:55 +0200 Subject: [PATCH 2/5] qemu-timer: Remove unused function qemu_alarm_pending The last user of this function was removed by commit 12d4536f7d911b6d87a766ad7300482ea663cea2. Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Weil --- qemu-timer.c | 5 ----- qemu-timer.h | 1 - 2 files changed, 6 deletions(-) diff --git a/qemu-timer.c b/qemu-timer.c index 25d5fdcc28..6ca2578581 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -87,11 +87,6 @@ static bool qemu_timer_expired_ns(QEMUTimer *timer_head, int64_t current_time) return timer_head && (timer_head->expire_time <= current_time); } -int qemu_alarm_pending(void) -{ - return alarm_timer->pending; -} - static inline int alarm_has_dynticks(struct qemu_alarm_timer *t) { return !!t->rearm; diff --git a/qemu-timer.h b/qemu-timer.h index 5a31434f47..623c79334d 100644 --- a/qemu-timer.h +++ b/qemu-timer.h @@ -55,7 +55,6 @@ uint64_t qemu_timer_expire_time_ns(QEMUTimer *ts); void qemu_run_timers(QEMUClock *clock); void qemu_run_all_timers(void); -int qemu_alarm_pending(void); void configure_alarms(char const *opt); void init_clocks(void); int init_timer_alarm(void); From 5e1ec7b267b214f3647d4248b4021ad0bafbb434 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 20 Apr 2012 10:45:48 +0200 Subject: [PATCH 3/5] qemu-timer: Use bool, false, true for boolean values This avoids conversions between int and bool / char. It also makes the code more readable. Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Weil --- qemu-timer.c | 31 ++++++++++++++++--------------- qemu-timer.h | 6 +++--- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/qemu-timer.c b/qemu-timer.c index 6ca2578581..08c45ab0ae 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -48,7 +48,7 @@ struct QEMUClock { int type; - int enabled; + bool enabled; QEMUTimer *active_timers; @@ -76,8 +76,8 @@ struct qemu_alarm_timer { #elif defined(_WIN32) HANDLE timer; #endif - char expired; - char pending; + bool expired; + bool pending; }; static struct qemu_alarm_timer *alarm_timer; @@ -249,13 +249,13 @@ static QEMUClock *qemu_new_clock(int type) clock = g_malloc0(sizeof(QEMUClock)); clock->type = type; - clock->enabled = 1; + clock->enabled = true; clock->last = INT64_MIN; notifier_list_init(&clock->reset_notifiers); return clock; } -void qemu_clock_enable(QEMUClock *clock, int enabled) +void qemu_clock_enable(QEMUClock *clock, bool enabled) { bool old = clock->enabled; clock->enabled = enabled; @@ -368,17 +368,18 @@ void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time) qemu_mod_timer_ns(ts, expire_time * ts->scale); } -int qemu_timer_pending(QEMUTimer *ts) +bool qemu_timer_pending(QEMUTimer *ts) { QEMUTimer *t; for (t = ts->clock->active_timers; t != NULL; t = t->next) { - if (t == ts) - return 1; + if (t == ts) { + return true; + } } - return 0; + return false; } -int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time) +bool qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time) { return qemu_timer_expired_ns(timer_head, current_time * timer_head->scale); } @@ -456,7 +457,7 @@ uint64_t qemu_timer_expire_time_ns(QEMUTimer *ts) void qemu_run_all_timers(void) { - alarm_timer->pending = 0; + alarm_timer->pending = false; /* vm time timers */ qemu_run_timers(vm_clock); @@ -465,7 +466,7 @@ void qemu_run_all_timers(void) /* rearm timer, if not periodic */ if (alarm_timer->expired) { - alarm_timer->expired = 0; + alarm_timer->expired = false; qemu_rearm_alarm_timer(alarm_timer); } } @@ -483,7 +484,7 @@ static void host_alarm_handler(int host_signum) if (alarm_has_dynticks(t) || qemu_next_alarm_deadline () <= 0) { t->expired = alarm_has_dynticks(t); - t->pending = 1; + t->pending = true; qemu_notify_event(); } } @@ -635,7 +636,7 @@ static void CALLBACK mm_alarm_handler(UINT uTimerID, UINT uMsg, } if (alarm_has_dynticks(t) || qemu_next_alarm_deadline() <= 0) { t->expired = alarm_has_dynticks(t); - t->pending = 1; + t->pending = true; qemu_notify_event(); } } @@ -800,7 +801,7 @@ int init_timer_alarm(void) /* first event is at time 0 */ atexit(quit_timers); - t->pending = 1; + t->pending = true; alarm_timer = t; return 0; diff --git a/qemu-timer.h b/qemu-timer.h index 623c79334d..5175419e5f 100644 --- a/qemu-timer.h +++ b/qemu-timer.h @@ -36,7 +36,7 @@ int64_t qemu_get_clock_ns(QEMUClock *clock); int64_t qemu_clock_has_timers(QEMUClock *clock); int64_t qemu_clock_expired(QEMUClock *clock); int64_t qemu_clock_deadline(QEMUClock *clock); -void qemu_clock_enable(QEMUClock *clock, int enabled); +void qemu_clock_enable(QEMUClock *clock, bool enabled); void qemu_clock_warp(QEMUClock *clock); void qemu_register_clock_reset_notifier(QEMUClock *clock, Notifier *notifier); @@ -49,8 +49,8 @@ void qemu_free_timer(QEMUTimer *ts); void qemu_del_timer(QEMUTimer *ts); void qemu_mod_timer_ns(QEMUTimer *ts, int64_t expire_time); void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time); -int qemu_timer_pending(QEMUTimer *ts); -int qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time); +bool qemu_timer_pending(QEMUTimer *ts); +bool qemu_timer_expired(QEMUTimer *timer_head, int64_t current_time); uint64_t qemu_timer_expire_time_ns(QEMUTimer *ts); void qemu_run_timers(QEMUClock *clock); From 8205199d7b4e7d1a9e57a83f2a5774187f2a2495 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 20 Apr 2012 11:27:24 +0200 Subject: [PATCH 4/5] qemu-timer: Remove function alarm_has_dynticks Some time ago, the last time which did not have dynticks was removed, so now all timers have dynticks. I also removed a misleading error message for the dynticks timer. If timer_create fails, there is already an error message, and QEMU will use the unix timer which also provides dynamic ticks, therefore dynamic ticks are not disabled. v2: Remove two if statements because they were always true (thanks to Paolo Bonzini for this correction). Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Weil --- qemu-timer.c | 39 ++++++++------------------------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/qemu-timer.c b/qemu-timer.c index 08c45ab0ae..1f7952d350 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -87,11 +87,6 @@ static bool qemu_timer_expired_ns(QEMUTimer *timer_head, int64_t current_time) return timer_head && (timer_head->expire_time <= current_time); } -static inline int alarm_has_dynticks(struct qemu_alarm_timer *t) -{ - return !!t->rearm; -} - static int64_t qemu_next_alarm_deadline(void) { int64_t delta = INT64_MAX; @@ -122,7 +117,6 @@ static int64_t qemu_next_alarm_deadline(void) static void qemu_rearm_alarm_timer(struct qemu_alarm_timer *t) { int64_t nearest_delta_ns; - assert(alarm_has_dynticks(t)); if (!rt_clock->active_timers && !vm_clock->active_timers && !host_clock->active_timers) { @@ -481,12 +475,9 @@ static void host_alarm_handler(int host_signum) if (!t) return; - if (alarm_has_dynticks(t) || - qemu_next_alarm_deadline () <= 0) { - t->expired = alarm_has_dynticks(t); - t->pending = true; - qemu_notify_event(); - } + t->expired = true; + t->pending = true; + qemu_notify_event(); } #if defined(__linux__) @@ -522,10 +513,6 @@ static int dynticks_start_timer(struct qemu_alarm_timer *t) if (timer_create(CLOCK_REALTIME, &ev, &host_timer)) { perror("timer_create"); - - /* disable dynticks */ - fprintf(stderr, "Dynamic Ticks disabled\n"); - return -1; } @@ -634,17 +621,14 @@ static void CALLBACK mm_alarm_handler(UINT uTimerID, UINT uMsg, if (!t) { return; } - if (alarm_has_dynticks(t) || qemu_next_alarm_deadline() <= 0) { - t->expired = alarm_has_dynticks(t); - t->pending = true; - qemu_notify_event(); - } + t->expired = true; + t->pending = true; + qemu_notify_event(); } static int mm_start_timer(struct qemu_alarm_timer *t) { TIMECAPS tc; - UINT flags; memset(&tc, 0, sizeof(tc)); timeGetDevCaps(&tc, sizeof(tc)); @@ -652,18 +636,11 @@ static int mm_start_timer(struct qemu_alarm_timer *t) mm_period = tc.wPeriodMin; timeBeginPeriod(mm_period); - flags = TIME_CALLBACK_FUNCTION; - if (alarm_has_dynticks(t)) { - flags |= TIME_ONESHOT; - } else { - flags |= TIME_PERIODIC; - } - mm_timer = timeSetEvent(1, /* interval (ms) */ mm_period, /* resolution */ mm_alarm_handler, /* function */ (DWORD_PTR)t, /* parameter */ - flags); + TIME_ONESHOT | TIME_CALLBACK_FUNCTION); if (!mm_timer) { fprintf(stderr, "Failed to initialize win32 alarm timer: %ld\n", @@ -722,7 +699,7 @@ static int win32_start_timer(struct qemu_alarm_timer *t) host_alarm_handler, t, 1, - alarm_has_dynticks(t) ? 3600000 : 1, + 3600000, WT_EXECUTEINTIMERTHREAD); if (!success) { From 9a14b298bb9651488fb9ef3f619233e3fabb7621 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Fri, 20 Apr 2012 11:51:58 +0200 Subject: [PATCH 5/5] qemu-timer: Optimize data structures Remove all holes which were found by pahole on Linux x86_64 (and replace "struct QEMUTimer" by "QEMUTimer"). Reviewed-by: Paolo Bonzini Signed-off-by: Stefan Weil --- qemu-timer.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/qemu-timer.c b/qemu-timer.c index 1f7952d350..8eadd16aa2 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -47,22 +47,22 @@ #define QEMU_CLOCK_HOST 2 struct QEMUClock { - int type; - bool enabled; - QEMUTimer *active_timers; NotifierList reset_notifiers; int64_t last; + + int type; + bool enabled; }; struct QEMUTimer { - QEMUClock *clock; int64_t expire_time; /* in nanoseconds */ - int scale; + QEMUClock *clock; QEMUTimerCB *cb; void *opaque; - struct QEMUTimer *next; + QEMUTimer *next; + int scale; }; struct qemu_alarm_timer { @@ -71,8 +71,8 @@ struct qemu_alarm_timer { void (*stop)(struct qemu_alarm_timer *t); void (*rearm)(struct qemu_alarm_timer *t, int64_t nearest_delta_ns); #if defined(__linux__) - int fd; timer_t timer; + int fd; #elif defined(_WIN32) HANDLE timer; #endif