[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 10/25] qemu-timer: check active_timers outside lock/e
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 10/25] qemu-timer: check active_timers outside lock/event |
Date: |
Thu, 22 Dec 2016 16:22:45 +0100 |
This avoids taking the active_timers_lock or resetting/setting the
timers_done_ev if there are no active timers. This removes a small
(2-3%) source of overhead for dataplane. The list is then checked
again inside the lock, or a NULL pointer could be dereferenced.
Reviewed-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
qemu-timer.c | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/qemu-timer.c b/qemu-timer.c
index 9299cdc..ff620ec 100644
--- a/qemu-timer.c
+++ b/qemu-timer.c
@@ -174,7 +174,7 @@ void qemu_clock_enable(QEMUClockType type, bool enabled)
bool timerlist_has_timers(QEMUTimerList *timer_list)
{
- return !!timer_list->active_timers;
+ return !!atomic_read(&timer_list->active_timers);
}
bool qemu_clock_has_timers(QEMUClockType type)
@@ -187,6 +187,10 @@ bool timerlist_expired(QEMUTimerList *timer_list)
{
int64_t expire_time;
+ if (!atomic_read(&timer_list->active_timers)) {
+ return false;
+ }
+
qemu_mutex_lock(&timer_list->active_timers_lock);
if (!timer_list->active_timers) {
qemu_mutex_unlock(&timer_list->active_timers_lock);
@@ -214,6 +218,10 @@ int64_t timerlist_deadline_ns(QEMUTimerList *timer_list)
int64_t delta;
int64_t expire_time;
+ if (!atomic_read(&timer_list->active_timers)) {
+ return -1;
+ }
+
if (!timer_list->clock->enabled) {
return -1;
}
@@ -363,7 +371,7 @@ static void timer_del_locked(QEMUTimerList *timer_list,
QEMUTimer *ts)
if (!t)
break;
if (t == ts) {
- *pt = t->next;
+ atomic_set(pt, t->next);
break;
}
pt = &t->next;
@@ -386,7 +394,7 @@ static bool timer_mod_ns_locked(QEMUTimerList *timer_list,
}
ts->expire_time = MAX(expire_time, 0);
ts->next = *pt;
- *pt = ts;
+ atomic_set(pt, ts);
return pt == &timer_list->active_timers;
}
@@ -481,8 +489,12 @@ bool timerlist_run_timers(QEMUTimerList *timer_list)
QEMUTimerCB *cb;
void *opaque;
+ if (!atomic_read(&timer_list->active_timers)) {
+ return false;
+ }
+
qemu_event_reset(&timer_list->timers_done_ev);
- if (!timer_list->clock->enabled || !timer_list->active_timers) {
+ if (!timer_list->clock->enabled) {
goto out;
}
--
2.9.3
- [Qemu-devel] [PULL 00/25] First round of misc patches for QEMU 2.9, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 01/25] exec: optimize remaining address_space_* cases, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 04/25] exec: introduce MemoryRegionCache, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 02/25] exec: introduce memory_ldst.inc.c, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 03/25] exec: introduce address_space_extend_translation, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 05/25] watchdog: 6300esb: add exit function, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 07/25] rules.mak: add more rules to avoid chaining, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 08/25] build-sys: remove libtool left-over, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 06/25] rules.mak: speedup save-vars load-vars, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 09/25] virtio-scsi: introduce virtio_scsi_acquire/release, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 10/25] qemu-timer: check active_timers outside lock/event,
Paolo Bonzini <=
- [Qemu-devel] [PULL 11/25] timer: fix misleading comment in timer.h, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 12/25] main-loop: update comment for qemu_mutex_lock/unlock_iothread, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 13/25] block: drop remaining legacy aio functions in comment, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 15/25] pc: make smbus configurable, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 17/25] pc: make pit configurable, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 14/25] target-i386: Add Intel SHA_NI instruction support., Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 16/25] pc: make sata configurable, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 19/25] multiboot: copy the cmdline verbatim, unescape module strings, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 20/25] hw/block/pflash_cfi*.c: fix confusing assert fail message, Paolo Bonzini, 2016/12/22
- [Qemu-devel] [PULL 18/25] x86: Fix x86_64 'g' packet response to gdb from 32-bit mode., Paolo Bonzini, 2016/12/22