qemu/include/qemu
Sebastian Tanase c2aa5f8199 cpu-exec: Add sleeping algorithm
The goal is to sleep qemu whenever the guest clock
is in advance compared to the host clock (we use
the monotonic clocks). The amount of time to sleep
is calculated in the execution loop in cpu_exec.

At first, we tried to approximate at each for loop the real time elapsed
while searching for a TB (generating or retrieving from cache) and
executing it. We would then approximate the virtual time corresponding
to the number of virtual instructions executed. The difference between
these 2 values would allow us to know if the guest is in advance or delayed.
However, the function used for measuring the real time
(qemu_clock_get_ns(QEMU_CLOCK_REALTIME)) proved to be very expensive.
We had an added overhead of 13% of the total run time.

Therefore, we modified the algorithm and only take into account the
difference between the 2 clocks at the begining of the cpu_exec function.
During the for loop we try to reduce the advance of the guest only by
computing the virtual time elapsed and sleeping if necessary. The overhead
is thus reduced to 3%. Even though this method still has a noticeable
overhead, it no longer is a bottleneck in trying to achieve a better
guest frequency for which the guest clock is faster than the host one.

As for the the alignement of the 2 clocks, with the first algorithm
the guest clock was oscillating between -1 and 1ms compared to the host clock.
Using the second algorithm we notice that the guest is 5ms behind the host, which
is still acceptable for our use case.

The tests where conducted using fio and stress. The host machine in an i5 CPU at
3.10GHz running Debian Jessie (kernel 3.12). The guest machine is an arm versatile-pb
built with buildroot.

Currently, on our test machine, the lowest icount we can achieve that is suitable for
aligning the 2 clocks is 6. However, we observe that the IO tests (using fio) are
slower than the cpu tests (using stress).

Signed-off-by: Sebastian Tanase <sebastian.tanase@openwide.fr>
Tested-by: Camille Bégué <camille.begue@openwide.fr>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2014-08-06 17:53:07 +02:00
..
acl.h
aes.h include/qemu/aes.h: Avoid conflicts with FreeBSD AES functions 2014-06-19 16:13:38 +01:00
atomic.h atomic.h: Fix build with clang 2013-11-21 08:01:06 -08:00
bitmap.h bitmap: Add bitmap_zero_extend operation 2014-01-13 14:04:54 +01:00
bitops.h bitops: provide an inline implementation of find_first_bit 2014-06-18 18:10:47 +02:00
bswap.h bswap.h: Rename ldl_p, stl_p, etc to ldl_he_p, stl_he_p, etc 2014-05-24 00:07:29 +04:00
compatfd.h
compiler.h
config-file.h qemu-option: introduce qemu_find_opts_singleton 2014-04-27 13:04:18 +04:00
crc32c.h include/qemu/crc32c.h: Rename include guards to match filename 2014-02-26 17:20:07 +00:00
envlist.h
error-report.h error: Privatize error_print_loc 2014-04-25 09:19:58 -04:00
event_notifier.h
fifo8.h util/fifo8: implement push/pop of multiple bytes 2014-02-08 14:50:48 +00:00
hbitmap.h
host-utils.h target-ppc: Add ISA2.06 divde[o] Instructions 2014-03-05 03:06:39 +01:00
int128.h int128: Add int128_exts64() 2014-05-30 13:00:28 -06:00
iov.h
log.h
main-loop.h
module.h module: implement module loading 2014-02-20 13:14:18 +01:00
notify.h
option_int.h QemuOpts: change opt->name|str from (const char *) to (char *) 2014-06-16 17:23:20 +08:00
option.h QemuOpts: cleanup tmp 'allocated' member from QemuOptsList 2014-06-16 17:23:21 +08:00
osdep.h qemu/osdep: Remove the need for qemu_init_auxval 2014-06-23 07:32:27 -07:00
queue.h
range.h Introduce signed range. 2014-06-19 18:44:19 +03:00
ratelimit.h
readline.h readline: Add missing GCC_FMT_ATTR 2014-02-01 13:46:06 +04:00
rfifolock.h rfifolock: add recursive FIFO lock 2014-03-13 14:42:21 +01:00
seqlock.h
sockets.h qapi event: convert SPICE events 2014-06-23 11:12:28 -04:00
thread-posix.h qemu-thread: add QemuEvent 2013-10-17 17:30:55 +02:00
thread-win32.h qemu-thread: add QemuEvent 2013-10-17 17:30:55 +02:00
thread.h Add a 'name' parameter to qemu_thread_create 2014-03-09 21:09:38 +02:00
throttle.h throttle: add throttle_detach/attach_aio_context() 2014-06-04 09:56:12 +02:00
timer.h cpu-exec: Add sleeping algorithm 2014-08-06 17:53:07 +02:00
tls.h
typedefs.h s390x/virtio-ccw: wire up irq routing and irqfds 2014-05-20 13:05:58 +02:00
uri.h
xattr.h