From: Wolfgang Mauerer <wolfgang.mauerer@siemens.com>
To: Stefan Weil <sw@weilnetz.de>
Cc: "aliguori@us.ibm.com" <aliguori@us.ibm.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [[PATCH v2]] Add option to slow qemu down
Date: Tue, 07 May 2013 11:12:42 +0200 [thread overview]
Message-ID: <5188C58A.3020203@siemens.com> (raw)
In-Reply-To: <50F85D67.9000508@weilnetz.de>
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 <wolfgang.mauerer@siemens.com>
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 <wolfgang.mauerer@siemens.com>
---
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
+@item -slowdown @var{s}
+@findex -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
next prev parent reply other threads:[~2013-05-07 9:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-11 13:40 [Qemu-devel] [PATCH] Add option to slow down qemu Wolfgang Mauerer
2013-01-11 19:58 ` Stefan Weil
2013-01-17 17:10 ` [Qemu-devel] [[PATCH v2]] Add option to slow qemu down Wolfgang Mauerer
2013-01-17 20:21 ` Stefan Weil
2013-01-18 12:04 ` Wolfgang Mauerer
2013-01-18 12:05 ` [Qemu-devel] [PATCH] " Wolfgang Mauerer
2013-05-07 9:12 ` Wolfgang Mauerer [this message]
2013-05-07 10:56 ` [Qemu-devel] [[PATCH v2]] " Markus Armbruster
2013-05-07 11:30 ` Wolfgang Mauerer
2013-01-17 17:14 ` [Qemu-devel] [PATCH] Add option to slow down qemu Wolfgang Mauerer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5188C58A.3020203@siemens.com \
--to=wolfgang.mauerer@siemens.com \
--cc=aliguori@us.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=sw@weilnetz.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.