[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [[PATCH v2]] Add option to slow qemu down
From: |
Wolfgang Mauerer |
Subject: |
Re: [Qemu-devel] [[PATCH v2]] Add option to slow qemu down |
Date: |
Tue, 07 May 2013 11:12:42 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 |
Hello,
On 17/01/13 21:21, Stefan Weil wrote:
> Am 17.01.2013 18:10, schrieb Wolfgang Mauerer:
>> For slow targets and fast hosts, the emulation may be faster
>> than the actual hardware, which can be undesirable for various
>> reasons. Add a run-time option to slow down the emulation
>> by sleeping in the CPU emulation.
>>
(...)
> Please test your patch using scripts/checkpatch.pl before sending it.
all stylistic issues have already been addressed in the last iteration;
do you have additional comments on the code besides those raised in
http://lists.gnu.org/archive/html/qemu-devel/2013-01/msg03248.html?
Here's a pull request:
The following changes since commit b5803aa3583e82e5133f7621121bc15ee694f4a1:
Merge remote-tracking branch 'qemu-kvm/uq/master' into staging (2013-05-06
15:45:08 -0500)
are available in the git repository at:
git://github.com/siemens/qemu.git for-upstream
for you to fetch changes up to 3e3a2c7158139020aa9c172ba902694e6a531cbe:
Add option to slow qemu down (2013-05-07 10:43:31 +0200)
----------------------------------------------------------------
Wolfgang Mauerer (1):
Add option to slow qemu down
cpus.c | 30 ++++++++++++++++++++++++++++++
include/qemu-common.h | 2 ++
qemu-options.hx | 14 ++++++++++++++
vl.c | 10 ++++++++++
4 files changed, 56 insertions(+)
I've also attached the patch below.
Thanks, Wolfgang
######################################################################
>From 3e3a2c7158139020aa9c172ba902694e6a531cbe Mon Sep 17 00:00:00 2001
From: Wolfgang Mauerer <address@hidden>
Date: Thu, 17 Jan 2013 15:53:39 +0100
Subject: [PATCH] Add option to slow qemu down
For slow targets and fast hosts, the emulation may be faster
than the actual hardware, which can be undesirable for various
reasons. Add a run-time option to slow down the emulation
by sleeping in the CPU emulation.
Signed-off-by: Wolfgang Mauerer <address@hidden>
---
cpus.c | 30 ++++++++++++++++++++++++++++++
include/qemu-common.h | 2 ++
qemu-options.hx | 14 ++++++++++++++
vl.c | 10 ++++++++++
4 files changed, 56 insertions(+)
diff --git a/cpus.c b/cpus.c
index c232265..2cff5f3 100644
--- a/cpus.c
+++ b/cpus.c
@@ -61,6 +61,7 @@
#endif /* CONFIG_LINUX */
static CPUArchState *next_cpu;
+static bool use_slowdown;
static bool cpu_thread_is_idle(CPUArchState *env)
{
@@ -106,6 +107,8 @@ static QEMUTimer *icount_warp_timer;
static int64_t vm_clock_warp_start;
static int64_t qemu_icount;
+static double slowdown_factor;
+
typedef struct TimersState {
int64_t cpu_ticks_prev;
int64_t cpu_ticks_offset;
@@ -385,6 +388,21 @@ void configure_icount(const char *option)
qemu_get_clock_ns(vm_clock) + get_ticks_per_sec() / 10);
}
+void configure_slowdown(const char *option)
+{
+ if (!option) {
+ return;
+ }
+
+ slowdown_factor = strtod(option, NULL) / 100.0;
+ /* We cannot provide speedups, obviously */
+ if (slowdown_factor < 0) {
+ slowdown_factor *= -1.0;
+ }
+
+ use_slowdown = true;
+}
+
/***********************************************************/
void hw_error(const char *fmt, ...)
{
@@ -1121,6 +1139,8 @@ void vm_stop_force_state(RunState state)
static int tcg_cpu_exec(CPUArchState *env)
{
int ret;
+ int64_t ss = 0; /* Initialise to avoid bogous maybe-uninitialized error */
+ uint64_t slowdown_sleep;
#ifdef CONFIG_PROFILER
int64_t ti;
#endif
@@ -1141,7 +1161,17 @@ static int tcg_cpu_exec(CPUArchState *env)
env->icount_decr.u16.low = decr;
env->icount_extra = count;
}
+ if (use_slowdown) {
+ ss = qemu_get_clock_ns(rt_clock);
+ }
+
ret = cpu_exec(env);
+
+ if (use_slowdown) {
+ slowdown_sleep = qemu_get_clock_ns(rt_clock) - ss;
+ slowdown_sleep *= slowdown_factor;
+ g_usleep(slowdown_sleep / 1024);
+ }
#ifdef CONFIG_PROFILER
qemu_time += profile_getclock() - ti;
#endif
diff --git a/include/qemu-common.h b/include/qemu-common.h
index b399d85..219993f 100644
--- a/include/qemu-common.h
+++ b/include/qemu-common.h
@@ -108,6 +108,8 @@ static inline char *realpath(const char *path, char
*resolved_path)
void configure_icount(const char *option);
extern int use_icount;
+void configure_slowdown(const char *option);
+
#include "qemu/osdep.h"
#include "qemu/bswap.h"
diff --git a/qemu-options.hx b/qemu-options.hx
index fb62b75..c764e42 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2801,6 +2801,20 @@ order cores with complex cache hierarchies. The number
of instructions
executed often has little or no correlation with actual performance.
ETEXI
+DEF("slowdown", HAS_ARG, QEMU_OPTION_slowdown, \
+ "-slowdown s\n" \
+ " Slow down the CPU emulation by (approximately) s
percent\n",
+ QEMU_ARCH_ALL)
+STEXI
address@hidden -slowdown @var{s}
address@hidden -slowdown
+Slow down the virtual CPU by approximately s percent (i.e., for c time
+units of execution time, sleep for c*s/100 time units). This makes it
+possible to align the emulated machine's performance roughly with
+the performance of physical entities, but does not provide identical
+performance profiles since the emulation is not cycle accurate.
+ETEXI
+
DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \
"-watchdog i6300esb|ib700\n" \
" enable virtual hardware watchdog [default=none]\n",
diff --git a/vl.c b/vl.c
index 6e6225f..27acf8b 100644
--- a/vl.c
+++ b/vl.c
@@ -2839,6 +2839,7 @@ int main(int argc, char **argv, char **envp)
int i;
int snapshot, linux_boot;
const char *icount_option = NULL;
+ const char *slowdown_option = NULL;
const char *initrd_filename;
const char *kernel_filename, *kernel_cmdline;
char boot_devices[33] = "";
@@ -3751,6 +3752,9 @@ int main(int argc, char **argv, char **envp)
case QEMU_OPTION_icount:
icount_option = optarg;
break;
+ case QEMU_OPTION_slowdown:
+ slowdown_option = optarg;
+ break;
case QEMU_OPTION_incoming:
incoming = optarg;
runstate_set(RUN_STATE_INMIGRATE);
@@ -4169,6 +4173,12 @@ int main(int argc, char **argv, char **envp)
/* clean up network at qemu process termination */
atexit(&net_cleanup);
+ if (slowdown_option && (kvm_enabled() || xen_enabled())) {
+ fprintf(stderr, "-slowdown is not allowed with kvm or xen\n");
+ exit(1);
+ }
+ configure_slowdown(slowdown_option);
+
if (net_init_clients() < 0) {
exit(1);
}
--
1.7.10.4
- Re: [Qemu-devel] [[PATCH v2]] Add option to slow qemu down,
Wolfgang Mauerer <=